OSDN Git Service

and so on
[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 setting(self, dbname):
56         dbname = dbname.lower()
57         if dbname in self.database.collection_names(include_system_collections=False):
58             db = self.database['users']
59             item = db.find_one({'name':self.uid})
60             if item['dbname'] == dbname:
61                 return False
62             else:
63                 db.update({'name':self.uid}, {'name':self.uid, 'dbname':dbname})
64                 return True
65         return False
66
67     def users(self):
68         db = self.database['users']
69         item = db.find_one({'name':self.uid})
70         x = item['dbname']
71         return self.database[x], x
72                           
73     def post(self):
74         '''
75         signature = self.request.headers['X-Line-Signature']
76         body = self.request.body
77         parser = WebhookParser(ch)
78         try:
79             parser.parse(body, signature)
80         except InvalidSignatureError:
81             tornado.web.HTTPError(404)
82             return
83         '''
84         dic = tornado.escape.json_decode(self.request.body)              
85         for event in dic['events']:
86             if 'replyToken' in event.keys():
87                 self.uid = event['source']['userId']
88                 self.database = pymongo.MongoClient(uri)[ac]                
89                 if event['type'] == 'unfollow':
90                     self.database['users'].remove({'name':self.uid})
91                     return
92                 elif event['type'] == 'join':
93                     db = self.database['users']
94                     if not db.find_one({'name':self.uid}):
95                         db.insert({'name':self.uid, 'dbname':'glove'})
96                     return
97                 x = event['message']['text']                
98                 if self.setting(x):
99                     linebot.reply_message(event['replyToken'],
100                         TextSendMessage(text=u'設定完了.'))
101                 else:
102                     linebot.reply_message(event['replyToken'],
103                         TextSendMessage(text=self.main(x))
104                     )
105         
106 class DummyHandler(tornado.web.RequestHandler):
107     def get(self):        
108         self.db = pymongo.MongoClient(uri)[ac]
109         for x in glob.glob('./*.txt'):
110             f = open(x)
111             data = f.read()
112             f.close()
113             self.main(x[2:-4], data)
114     
115     def main(self, name, data):
116         if name == 'requirements':
117             return
118         item = []
119         for x in data.split('\n'):
120             if len(x) > 0 and x[0] == '@':
121                 dic = {}
122                 dic['name'] = x[1:]
123             elif 'name' in dic.keys():
124                 dic['no'] = x
125                 item.append(dic)
126         table = self.db[name]
127         table.remove()
128         for x in item:
129             table.insert(x)
130
131 application = tornado.web.Application([(r'/callback',WebHookHandler),(r'/init',DummyHandler)])
132
133 if __name__ == '__main__':
134     token = os.environ['Access_Token']
135     ch = os.environ['Channel_Secret']
136     uri = os.environ['MONGODB_URI']
137     ac = os.environ['ACCOUNT']
138     port = int(os.environ.get('PORT',5000))#important in heroku
139     linebot = LineBotApi(token)
140     webhook = WebhookParser(ch)  
141     application.listen(port)
142     tornado.ioloop.IOLoop.instance().start()
143