forked from ClearMind/heliosphere
/
poll.py
170 lines (124 loc) · 4.08 KB
/
poll.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
__author__ = 'artemredkin'
import db
import telegram
def parse(message):
values = message.split(None, 1)
if len(values) == 1:
return values[0], None
return values
def pretty_poll(poll):
s = 'Poll: ' + poll.question.encode('utf-8') + '\n'
answers = []
for i, a in enumerate(poll.answers):
answers.append(str(i + 1) + ': ' + a.encode('utf-8'))
s += '\n'.join(answers)
return s
class PollCommand:
def call(self, chat, author, arguments):
poll = db.get_poll(chat)
if poll is None:
telegram.send(chat, 'No active polls')
return
telegram.send(chat, pretty_poll(poll))
def help(self):
return "To see active poll type: /poll"
def name(self):
return "/poll"
def description(self):
return "repeat question"
class NewPollCommand:
def call(self, chat, author, arguments):
if arguments is None:
telegram.send(chat, "Add question")
return
db.add_poll(chat, arguments)
telegram.send(chat, "Poll added, now add answers with /answer <answer>")
def help(self):
return "To add new poll type: /newpoll <question>"
def name(self):
return "/newpoll"
def description(self):
return "create a poll"
class AsnwerCommand:
def call(self, chat, author, arguments):
poll = db.get_poll(chat)
if poll is None:
telegram.send(chat, "No active polls")
return
db.add_answer(poll, arguments)
telegram.send(chat, "Answer addded")
def help(self):
return "To add answer to active poll type: /answer <answer>"
def name(self):
return "/answer"
def description(self):
return "add poll answer"
class VotePollCommand:
def call(self, chat, author, choice):
poll = db.get_poll(chat)
if poll is None:
telegram.send(chat, "No active poll")
return
if choice is None:
telegram.send(chat, "Specify choice")
return
try:
value = int(choice)
except ValueError:
telegram.send(chat, "Specify choice as an integer number")
return
if value > len(poll.answers):
telegram.send(chat, "No such answer")
return
db.answer_poll(poll, author, value)
telegram.send(chat, "Answer recorded")
def help(self):
return "To vote type: /vote <choice>"
def name(self):
return "/vote"
def description(self):
return "vote"
def pretty_results(chat, poll):
if poll.users_asnwers is None:
telegram.send(chat, "No answers yet")
return
results = {}
all_count = len(poll.users_asnwers)
for user, answer in poll.users_asnwers.iteritems():
(count, prcnt) = results.get(answer, (0, 0))
count += 1
results[answer] = (count, int(float(count)/float(all_count) * 100))
s = poll.question.encode('utf-8') + '\nResults:\n'
answers = []
for i, answer in enumerate(poll.answers):
(count, prcnt) = results.get(i + 1, (0, 0))
answers.append(answer.encode('utf-8') + ': ' + str(count) + ' votes, ' + str(prcnt) + '%')
s += '\n'.join(answers)
telegram.send(chat, s)
class ResultPollCommand:
def call(self, chat, author, arguments):
poll = db.get_poll(chat)
if poll is None:
telegram.send(chat, "No active poll")
return
pretty_results(chat, poll)
def help(self):
return "To see active poll results type: /results"
def name(self):
return "/results"
def description(self):
return "see poll results"
class EndPollCommand:
def call(self, chat, author, command):
poll = db.get_poll(chat)
if poll is None:
telegram.send(chat, "No active poll")
return
pretty_results(chat, poll)
db.end_poll(poll)
def help(self):
return "Usage: /endpoll"
def name(self):
return "/endpoll"
def description(self):
return "end poll and show results"