-
Notifications
You must be signed in to change notification settings - Fork 0
/
join_group.py
208 lines (182 loc) · 8.48 KB
/
join_group.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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# -*- coding: utf-8 -*-
'''Create_group
PaVel 12.2016
'''
import standard, utils
import db_connector
from telebot import types
from models import User, Group, Member
bot = None
message = None
session = None
user = None
group = None
opGroup = 'join_group' # Операция для таблицы операций.
def get_text_val(ask_text):
key_ad_info_step = 'step'
val_ad_info_need_answer = 'need_answer'
def ask(ask_msg=''):
user.operation.additional_info[key_ad_info_step] = val_ad_info_need_answer
bot.send_message(message.chat.id, ask_msg+ask_text,
reply_markup=standard.cancel_keyboard())
def check_answer():
if message.content_type == 'text':
return message.text
else:
ask('Пришлите текстом\n')
if key_ad_info_step in user.operation.additional_info:
step = user.operation.additional_info.pop(key_ad_info_step)
if step == val_ad_info_need_answer:
return check_answer()
else:
ask()
else:
ask()
def find_group():
key_ad_info_step = 'step'
val_ad_info_need_name = 'need_name'
val_ad_info_need_select = 'need_select'
key_ad_info_buttons = 'buttons-group_id'
def ask_name(ask_msg=''):
ask_text = 'Введите название или часть названия группы, которую вы ищете. Не менее 3х символов.'
user.operation.additional_info[key_ad_info_step] = val_ad_info_need_name
bot.send_message(message.chat.id, ask_msg+ask_text,
reply_markup=standard.cancel_keyboard())
return 0
def ask_select():
if message.content_type == 'text':
if len(message.text) >= 3:
groups = session.query(Group).filter(Group.name_lower.like('%'+message.text.lower()+'%'),
Group.active==True).all()
if groups:
text = 'Список найденных групп:\n'
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
user.operation.additional_info[key_ad_info_buttons] = {}
for i in range(len(groups)):
# структура id, Name, author
text += '{}) <b>{}</b> от автора {}\n'.format(i + 1, groups[i].name, groups[i].owner.name)
button_text = '{}) {}'.format(i + 1, groups[i].name)
markup.row(button_text)
user.operation.additional_info[key_ad_info_buttons][button_text] = groups[i].id
text += '\nВыберите свою группу кнопкой ниже.'
markup.row(standard.cancel_commands[0].capitalize())
user.operation.additional_info[key_ad_info_step] = val_ad_info_need_select
bot.send_message(message.chat.id, text, parse_mode='HTML', reply_markup=markup)
return 0
else:
return ask_name('Не найдено ни одной группы с таким названием\n')
else:
return ask_name('Введите не меньше 3х символов названия\n')
else:
return ask_name('Пришлите имя текстом\n')
def do_select():
if message.content_type == 'text':
group_id = user.operation.additional_info.get(key_ad_info_buttons, dict()).get(message.text)
group = session.query(Group).filter(Group.id == group_id).first()
if key_ad_info_buttons in user.operation.additional_info: user.operation.additional_info.pop(key_ad_info_buttons)
if group:
user.operation.additional_info['group_id'] = group.id
text = 'Выбрана группа <b>{}</b> от автора {}. Дата распределения: {}.'.format(group.name, group.owner, group.date_shuffle.strftime('%d.%m.%Y'))
bot.send_message(message.chat.id, text, parse_mode='HTML', reply_markup=standard.cancel_keyboard())
member = session.query(Member).filter(Member.group == group, Member.user == user).first()
if member:
db_connector.put_user_operation(session, user)
bot.send_message(message.chat.id,
'Вы уже участвуете в этой группе. Ваши пожелания: "{}"'.format(member.suggestions),
reply_markup=standard.standard_keyboard())
return 0
return 1
else:
return ask_name('Выбор нужно делать кнопкой\n')
else:
return ask_name('Выбор нужно делать кнопкой\n')
if key_ad_info_step in user.operation.additional_info:
step = user.operation.additional_info.pop(key_ad_info_step)
if step == val_ad_info_need_name:
return ask_select()
elif step == val_ad_info_need_select:
return do_select()
else:
return ask_name()
else:
return ask_name()
def ask_password():
val = get_text_val(
'Введите пароль для доступа к этой группе')
if val:
if group.password == val:
return 1
else:
bot.send_message(message.chat.id, 'Неверный пароль', reply_markup=standard.cancel_keyboard())
return ask_password()
return 0
def ask_suggestion():
val = get_text_val('Введите ваши пожелания к подарку.')
if val:
member = Member(group=group, user=user,)
session.add(member)
member.suggestions = val
member.active = True
return 1
return 0
def finish():
member = session.query(Member).filter(Member.group == group, Member.user == user).first()
if member:
msg = '''Ваше участие в группе {} зарегистрировано. Дата распределения: {}
Подарок будет выслан получателю "{}" по адресу {} {}.
Ваши пожелания к подарку: {}'''.format(group.name, group.date_shuffle.strftime('%d.%m.%Y'),
user.fio, user.index, user.address,
member.suggestions)
else:
msg = 'Что-то пошло не так. Попробуйте ещё раз'
db_connector.put_user_operation(session, user)
bot.send_message(message.chat.id,
msg, reply_markup=standard.standard_keyboard())
def cancel_all():
db_connector.put_user_operation(session, user)
bot.send_message(message.chat.id,
'Отменено', reply_markup=standard.standard_keyboard())
def route_flow(bot_in, message_in, session_in):
"""Основной поток маршрутизации.
"""
global bot, message, session, user, group
flow_list = [
'find_group',
'ask_password',
'ask_suggestion',
'done',
]
status_dic = {
'find_group': find_group,
'ask_password': ask_password,
'ask_suggestion': ask_suggestion,
'done': finish,
}
bot = bot_in
message = message_in
session = session_in
user = session.query(User).filter_by(telegramid=message.from_user.id).first()
user.operation.decode_additional()
if not user.operation.current_operation or user.operation.current_operation != opGroup:
user.operation.current_operation = opGroup
user.operation.additional_info = {}
current_step = 0
else:
if user.operation.operation_status in flow_list:
current_step = flow_list.index(user.operation.operation_status)
else:
current_step = 0
group = user.operation.additional_info.get('group_id')
if group:
group = session.query(Group).filter(Group.id == group).first()
if not group:
current_step = 0
if utils.text_lower_wo_command(message) in standard.cancel_commands:
cancel_all()
user.operation.code_additional()
return
user.operation.operation_status = flow_list[current_step]
while status_dic[flow_list[current_step]]():
current_step += 1
user.operation.operation_status = flow_list[current_step]
user.operation.code_additional()