OSDN Git Service

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