OSDN Git Service

list get better
[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
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.write(self.main(mes))
23         
24     def main(self,no):
25         pz = pytz.timezone('Asia/Tokyo')
26         now = datetime.now(pz)
27         t = now.hour
28         w = now.weekday()
29         if (w < 5)and(t >= 9)and(t < 16):
30             return u'仕事中.'
31         db = pymongo.MongoClient(uri)[ac]
32         table = db['glove']
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 = '-*-glove 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 post(self):
61         '''
62         signature = self.request.headers['X-Line-Signature']
63         body = self.request.body
64         parser = WebhookParser(ch)
65         try:
66             parser.parse(body, signature)
67         except InvalidSignatureError:
68             tornado.web.HTTPError(404)
69             return
70         '''
71         dic = tornado.escape.json_decode(self.request.body)              
72         for event in dic['events']:
73             if 'replyToken' in event:
74                 linebot.reply_message(
75                     event['replyToken'],
76                     TextSendMessage(text=self.main(event['message']['text']))
77                 )
78         
79 class DummyHandler(tornado.web.RequestHandler):
80     def get(self):
81         f = open('data.txt')
82         data = f.read()
83         f.close()
84         db = pymongo.MongoClient(uri)[ac]
85         table = db['glove']
86         item = []
87         for x in data.split('\n'):
88             if x[0] == '@':
89                 dic = {}
90                 dic['name'] = x[1:]
91             else:
92                 dic['no'] = x
93                 item.append(dic)
94         table.remove()
95         for x in item:
96             table.insert(x)
97
98 application = tornado.web.Application([(r'/callback',WebHookHandler),(r'/init',DummyHandler)])
99
100 if __name__ == '__main__':
101     token = os.environ['Access_Token']
102     ch = os.environ['Channel_Secret']
103     uri = os.environ['MONGODB_URI']
104     ac = os.environ['ACCOUNT']
105     port = int(os.environ.get('PORT',5000))#important in heroku
106     linebot = LineBotApi(token)
107     webhook = WebhookParser(ch)  
108     application.listen(port)
109     tornado.ioloop.IOLoop.instance().start()
110