forked from gabrielaraujof/Babelegram
-
Notifications
You must be signed in to change notification settings - Fork 0
/
handlers.py
95 lines (81 loc) · 2.91 KB
/
handlers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
Bot engine handlers.
"""
import asyncio
import telepot
from telepot.namedtuple import InlineQueryResultArticle
from telepot.async.delegate import per_inline_from_id, create_open
import helpers
def create_bot(token, translator):
""" Create a new bot instance
"""
return telepot.async.DelegatorBot(token, [
(per_inline_from_id(), create_open(
BabelegramHandler, timeout=60, translator=translator)),
])
class BabelegramHandler(telepot.async.helper.UserHandler):
""" Bot message handler.
"""
def __init__(self, seed_tuple, timeout, translator):
super(BabelegramHandler, self).__init__(
seed_tuple, timeout,
flavors=['inline_query', 'chosen_inline_result']
)
# Init instance variables
# Create the Answerer, give it the compute function.
self._translator = translator
self._answerer = telepot.async.helper.Answerer(
self.bot, self.compute_answer)
self._ocurrences, self._rank = helpers.start_rank()
self._total_ocurrences = len(self._rank)
self._last_ocurrences = []
def on_inline_query(self, msg):
""" Handler for inline queries.
"""
# Just dump inline query to answerer
self._answerer.answer(msg)
@asyncio.coroutine
def compute_answer(self, inline_query):
""" Delegated function for handling inline queries.
"""
query_string = inline_query['query']
offset = int(inline_query['offset']) if inline_query['offset'] else 0
if not query_string:
return []
return {
'results': self.get_result_list(query_string, offset),
'next_offset': str(offset + 2)
}
def get_result_list(self, query_string, offset):
""" Create the result dict containing all the inline query results.
"""
results = []
for lang_id in self._rank[offset:offset + 2]:
translated_query = self._translator.translate(
query_string, lang_id)
results.append(InlineQueryResultArticle(
type='article',
id=lang_id,
title=helpers.get_lang_name(lang_id),
description=translated_query,
message_text=translated_query
))
return results
def on_chosen_inline_result(self, msg):
""" Handler for when inline result has been chosen.
"""
result_id = msg['result_id']
self._total_ocurrences += 1
self._ocurrences[result_id] += 1
self._last_ocurrences = self._last_ocurrences[1:] + [result_id]
self._rank.sort(
key=lambda lang_id: helpers.rating_calc(
lang_id,
self._ocurrences[lang_id],
self._last_ocurrences,
self._total_ocurrences
),
reverse=True
)