OSDN Git Service

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