diff --git a/bot/app/bot.py b/bot/app/bot.py index c3e1749..beebab7 100644 --- a/bot/app/bot.py +++ b/bot/app/bot.py @@ -5,6 +5,8 @@ from telebot.asyncio_handler_backends import State, StatesGroup from telebot.asyncio_filters import StateFilter from telebot import types from telebot.callback_data import CallbackData, CallbackDataFilter +from telebot.types import User as TgUser +from telebot.types import Chat as TgChat from telebot.types import Message from telebot.util import user_link @@ -39,8 +41,8 @@ class States(StatesGroup): def get_fund_text(fund: Fund): - count = len(fund.fund_members) - contributors = len(fund.fund_members.filter(FundMember.contributed == True)) + count = len(fund.members) + contributors = len(list(filter(lambda m: m.contributed, fund.members))) personal_amount = math.ceil(fund.amount / count) return ( "🟢 {name}\n\n", @@ -58,34 +60,59 @@ def get_fund_text(fund: Fund): ) +def get_user(tg_user: TgUser) -> User: + if user := session.query(User).filter(User.id == tg_user.id).first(): + return user + user = User( + id=tg_user.id, + name=tg_user.first_name, + username=tg_user.username, + ) + session.add(user) + session.commit() + return user + + +def get_group(tg_chat: TgChat) -> Group: + if group := session.query(User).filter(User.id == tg_chat.id).first(): + return group + group = Group( + id=tg_chat.id, + ) + session.add(group) + session.commit() + return group + + +# Bot logic + @bot.message_handler(commands=["start"]) async def start(msg: Message): if msg.chat.type == "private": - if user := session.query(User).filter(User.id == msg.chat.id).first(): - await bot.send_message( - chat_id=msg.chat.id, - text=textbook.private_info.format(count=len(user.fund_members)), - ) - else: - user = User( - id=msg.chat.id, - name=msg.from_user.first_name, - username=msg.from_user.username, - ) - session.add(user) - session.commit() - await bot.send_message(chat_id=msg.chat.id, text=textbook.start_private) + # if user := session.query(User).filter(User.id == msg.chat.id).first(): + # await bot.send_message( + # chat_id=msg.chat.id, + # text=textbook.private_info.format(count=len(user.fund_members)), + # ) + # else: + # user = User( + # id=msg.chat.id, + # name=msg.from_user.first_name, + # username=msg.from_user.username, + # ) + # session.add(user) + # session.commit() + user = get_user(msg.from_user) + await bot.send_message(chat_id=msg.chat.id, text=textbook.start_private.format(count=len(user.fund_members))) elif msg.chat.type in ("group", "supergroup"): - if not session.query(Group).filter(Group.id == msg.chat.id).first(): - group = Group(id=msg.chat.id) - session.add(group) - session.commit() - await bot.send_message(chat_id=msg.chat.id, text=textbook.start_group) + get_group(msg.chat) + await bot.send_message(chat_id=msg.chat.id, text=textbook.start_group) @bot.message_handler(commands=["setup"]) async def setup(msg: Message): + get_group(msg.chat) if msg.chat.type in ("group", "supergroup"): await bot.send_message( chat_id=msg.chat.id, text=textbook.setup, reply_markup=keyboards.setup() @@ -95,13 +122,7 @@ async def setup(msg: Message): @bot.callback_query_handler(func=lambda c: c.data == "register_group_member") async def register_group_member(call: types.CallbackQuery): new = False - if not session.query(User).filter(User.id == call.from_user.id).first(): - user = User( - id=call.from_user.id, - name=call.from_user.first_name, - username=call.from_user.username, - ) - session.add(user) + user = get_user(call.from_user.id) if ( group_member := session.query(GroupMember) .filter( @@ -129,26 +150,33 @@ async def register_group_member(call: types.CallbackQuery): @bot.message_handler(commands=["newfund"]) async def newfund(msg: Message): if msg.chat.type in ("group", "supergroup"): - if ( - session.query(Fund) - .filter(Fund.group_id == msg.chat.id, Fund.active == True) - .first() - ): - await bot.send_message( - chat_id=msg.chat.id, - text=textbook.newfund_already_exists, - ) + if session.query(Group).filter(Group.id == msg.chat.id).first(): + if ( + session.query(Fund) + .filter(Fund.group_id == msg.chat.id, Fund.active == True) + .first() + ): + await bot.send_message( + chat_id=msg.chat.id, + text=textbook.newfund_already_exists, + ) + else: + await bot.set_state( + user_id=msg.from_user.id, + chat_id=msg.chat.id, + state=States.newfund_amount, + ) + await bot.send_message( + chat_id=msg.chat.id, + text=textbook.newfund_amount.format( + user=user_link(msg.from_user)), + reply_markup=keyboards.cancel(), + parse_mode="html", + ) else: - await bot.set_state( - user_id=msg.from_user.id, - chat_id=msg.chat.id, - state=States.newfund_amount, - ) await bot.send_message( chat_id=msg.chat.id, - text=textbook.newfund_amount.format(user=user_link(msg.from_user)), - reply_markup=keyboards.cancel(), - parse_mode="html", + text=textbook.not_initialized ) @@ -165,21 +193,30 @@ async def cancel_newfund_amount(call: types.CallbackQuery): ) -@bot.message_handler(func=lambda message: True) +@bot.message_handler(content_types=["text"], state=States.newfund_amount) async def newfund_amount(msg: Message): - await bot.send_message(chat_id=msg.chat.id, text="test") + if not session.query(User).filter(User.id == msg.from_user.id).first(): + user = User( + id=msg.from_user.id, + name=msg.from_user.first_name, + username=msg.from_user.username, + ) + session.add(user) + session.commit() if msg.text.isdigit(): await bot.set_state( user_id=msg.from_user.id, chat_id=msg.chat.id, state=States.default ) fund = Fund( - owner_id=msg.from_user.id, group_id=msg.chat.id, amount=int(msg.text) + owner_id=msg.from_user.id, group_id=msg.chat.id, amount=int( + msg.text) ) session.add(fund) for group_member in session.query(GroupMember).filter( GroupMember.group_id == msg.chat.id ): - fund_member = FundMember(user_id=group_member.user.id, fund_id=fund.id) + fund_member = FundMember( + user_id=group_member.user.id, fund_id=fund.id) session.add(fund_member) session.commit() await bot.send_message( @@ -202,6 +239,10 @@ async def newfund_amount(msg: Message): ) +@bot.message_handler(commands=["fund"]) +async def fund(msg: Message): + + @bot.message_handler(commands=["mystate"]) async def mystate(msg: Message): state = await bot.get_state(user_id=msg.from_user.id) diff --git a/bot/app/db/models.py b/bot/app/db/models.py index 4abea4c..42c3298 100644 --- a/bot/app/db/models.py +++ b/bot/app/db/models.py @@ -52,7 +52,7 @@ class Fund(Base): amount = Column(Integer) active = Column(Boolean, default=True) - users = relationship("FundMember", backref="fund") + members = relationship("FundMember", backref="fund") class FundMember(Base): diff --git a/bot/app/textbook.py b/bot/app/textbook.py index 8774c1b..58517ae 100644 --- a/bot/app/textbook.py +++ b/bot/app/textbook.py @@ -1,17 +1,17 @@ -start_private = "Привет, спасибо, что активировали меня в личных сообщениях! Теперь я смогу уведомлять вас о сборах, в которых вы забыли принять участие!" +# start_private = "Привет, спасибо, что активировали меня в личных сообщениях! Теперь я смогу уведомлять вас о сборах, в которых вы забыли принять участие!" +start_private = "Ты состоишь в {count} сборах, я уведомлю тебя в случае чего." private_info = "Вы принимаете участие в {count} сборах!" start_group = "Всем привет, я @waterfundbot! Я помогу собрать деньги на что угодно, уведомлю каждого о сборе в чате, напомню не скинувшим, и многое другое!\n\n Для начала админу чата необходимо прописать /setup. Появится сообщение, под которым будет кнопка - ее необходимо нажать всем, кто планирует участвовать в сборах в этом чате.\n\nНачать новый сбор /newfund\n\nТакже попрошу всех участвующих в сборах начать со мной диалог в личном чате, чтобы я мог уведомлять вас лично." +not_initialized = "Группа не инициализирована! Пропишите /start" setup = "Все, кто планирует участвовать в сборах в этом чате, должны нажать на кнопочку ниже. Если вы передумали - нажмите еще раз, и вы откажетесь от участия." user_parted = "Вы приняли участие в сборах в этом чате!" user_left = "Вы отказались от участия в сборах в этом чате" newfund_already_exists = "Предыдущий сбор все еще активен! Пропишите /fund, чтобы показать его, и завершите его, если необходимо создать новый!" -newfund_amount = ( - 'Отлично, новый сбор. {user}, напишите сумму сбора, или кнопку "❌ Отменить"' -) +newfund_amount = 'Отлично, новый сбор. {user}, напишите сумму сбора ответом на это сообщение, или нажмите кнопку "❌ Отменить"' cancel = "Хорошо, проехали" -not_number = 'Вы ввели не число. {user}, напишите сумму сбора, или кнопку "❌ Отменить"' +not_number = 'Вы ввели не число. {user}, напишите сумму сбора ответом на это сообщение, или нажмите кнопку "❌ Отменить"' fund_created = "Создан новый сбор: {fund}" fund_not_found = "На данный момент в этом чате сборов нет! Создать новый - /newfund"