OSDN Git Service

remove system collection
[simple-tornado-bot/simple-tornado-bot.git] / bot.py
1 # -*- coding: utf-8 -*-
2 """
3 Created on Sat Sep  1 11:18:39 2018
4
5 @author: fuke masasi
6 """
7
8 import tornado.ioloop
9 import tornado.web
10 import tornado.escape
11 import os, re, glob
12 import pytz, pymongo
13 from datetime import datetime
14 from linebot import LineBotApi, WebhookParser
15 from linebot.exceptions import InvalidSignatureError
16 from linebot.models import TextSendMessage
17
18
19 class WebHookHandler(tornado.web.RequestHandler):        
20     def main(self, no):
21         pz = pytz.timezone('Asia/Tokyo')
22         now = datetime.now(pz)
23         t = now.hour
24         w = now.weekday()
25         if (w < 5)and(t >= 9)and(t < 16):
26             return u'仕事中.'
27         table, na = self.users()
28         item = table.find({'no':re.compile(no,re.IGNORECASE)})
29         if item.count() == 1:
30             x = item[0]
31             ans = x['name']+'\n'+x['no']
32         elif item.count() > 1:
33             ans = ''    
34             obj = list(item)
35             list1 = sorted(obj, key=lambda k:k['name'])
36             for x in list1:
37                 if x['name'] == list1[0]['name']:
38                     ans += x['name']+'\n'+x['no']+'\n'
39                 else:
40                     break
41             else:
42                 return ans       
43             ans = self.itr(sorted(list1, key=lambda k:k['no']))
44         else:
45             ans = self.itr(table.find().sort('no'))
46             ans = '-*-'+na+' list-*-\n'+ans
47         return ans
48     
49     def itr(self, item):
50         ans = ''
51         for x in item:
52             ans += '【'+x['no']+'】 '
53         return ans
54     
55     def help(self):
56         s = '-*-database names-*-\n'
57         out = ['objectlabs-system','objectlabs-system.admin.collections','users']
58         for x in self.database.collection_names(include_system_collections=False):
59             if not x in out:
60                 s += x+'\n'
61         return s
62     
63     def setting(self, dbname):
64         dbname = dbname.lower()
65         if dbname in self.database.collection_names(include_system_collections=False):
66             db = self.database['users']
67             item = db.find_one({'name':self.uid})
68             if item['dbname'] == dbname:
69                 return False
70             else:
71                 db.update({'name':self.uid}, {'name':self.uid, 'dbname':dbname})
72                 return True
73         return False
74
75     def users(self):
76         db = self.database['users']
77         item = db.find_one({'name':self.uid})
78         x = item['dbname']
79         return self.database[x], x
80                           
81     def post(self):
82         '''
83         signature = self.request.headers['X-Line-Signature']
84         body = self.request.body
85         parser = WebhookParser(ch)
86         try:
87             parser.parse(body, signature)
88         except InvalidSignatureError:
89             tornado.web.HTTPError(404)
90             return
91         '''
92         dic = tornado.escape.json_decode(self.request.body)              
93         for event in dic['events']:
94             if 'replyToken' in event.keys():
95                 self.uid = event['source']['userId']
96                 self.database = pymongo.MongoClient(uri)[ac]                
97                 if event['type'] == 'unfollow':
98                     self.database['users'].remove({'name':self.uid})
99                     return
100                 elif event['type'] == 'join':
101                     db = self.database['users']
102                     if not db.find_one({'name':self.uid}):
103                         db.insert({'name':self.uid, 'dbname':'glove'})
104                     return
105                 x = event['message']['text']                
106                 if self.setting(x):
107                     linebot.reply_message(event['replyToken'],
108                         TextSendMessage(text=u'設定完了.'))
109                 elif x == '?':
110                     linebot.reply_message(event['replyToken'],
111                         TextSendMessage(text=self.help())
112                     )
113                 else:
114                     linebot.reply_message(event['replyToken'],
115                         TextSendMessage(text=self.main(x))
116                     )
117         
118 class DummyHandler(tornado.web.RequestHandler):
119     def get(self):        
120         self.db = pymongo.MongoClient(uri)[ac]
121         for x in glob.glob('./*.txt'):
122             f = open(x)
123             data = f.read()
124             f.close()
125             self.main(x[2:-4], data)
126     
127     def main(self, name, data):
128         if name == 'requirements':
129             return
130         item = []
131         dic = None
132         for x in data.split('\n'):
133             if len(x) > 0 and x[0] == '@':
134                 dic = {}
135                 dic['name'] = x[1:]
136             elif dic:
137                 dic['no'] = x
138                 item.append(dic)
139         table = self.db[name]
140         table.remove()
141         for x in item:
142             table.insert(x)
143
144 application = tornado.web.Application([(r'/callback',WebHookHandler),(r'/init',DummyHandler)])
145
146 if __name__ == '__main__':
147     token = os.environ['Access_Token']
148     ch = os.environ['Channel_Secret']
149     uri = os.environ['MONGODB_URI']
150     ac = os.environ['ACCOUNT']
151     port = int(os.environ.get('PORT',5000))#important in heroku
152     linebot = LineBotApi(token)
153     webhook = WebhookParser(ch)  
154     application.listen(port)
155     tornado.ioloop.IOLoop.instance().start()
156