This commit is contained in:
2023-11-13 15:45:22 +03:00
parent 9f76abcfc4
commit 2ebc03606d
3 changed files with 96 additions and 55 deletions

View File

@ -5,6 +5,8 @@ from telebot.asyncio_handler_backends import State, StatesGroup
from telebot.asyncio_filters import StateFilter from telebot.asyncio_filters import StateFilter
from telebot import types from telebot import types
from telebot.callback_data import CallbackData, CallbackDataFilter 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.types import Message
from telebot.util import user_link from telebot.util import user_link
@ -39,8 +41,8 @@ class States(StatesGroup):
def get_fund_text(fund: Fund): def get_fund_text(fund: Fund):
count = len(fund.fund_members) count = len(fund.members)
contributors = len(fund.fund_members.filter(FundMember.contributed == True)) contributors = len(list(filter(lambda m: m.contributed, fund.members)))
personal_amount = math.ceil(fund.amount / count) personal_amount = math.ceil(fund.amount / count)
return ( return (
"🟢 {name}\n\n", "🟢 {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"]) @bot.message_handler(commands=["start"])
async def start(msg: Message): async def start(msg: Message):
if msg.chat.type == "private": if msg.chat.type == "private":
if user := session.query(User).filter(User.id == msg.chat.id).first(): # if user := session.query(User).filter(User.id == msg.chat.id).first():
await bot.send_message( # await bot.send_message(
chat_id=msg.chat.id, # chat_id=msg.chat.id,
text=textbook.private_info.format(count=len(user.fund_members)), # text=textbook.private_info.format(count=len(user.fund_members)),
) # )
else: # else:
user = User( # user = User(
id=msg.chat.id, # id=msg.chat.id,
name=msg.from_user.first_name, # name=msg.from_user.first_name,
username=msg.from_user.username, # username=msg.from_user.username,
) # )
session.add(user) # session.add(user)
session.commit() # session.commit()
await bot.send_message(chat_id=msg.chat.id, text=textbook.start_private) 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"): elif msg.chat.type in ("group", "supergroup"):
if not session.query(Group).filter(Group.id == msg.chat.id).first(): get_group(msg.chat)
group = Group(id=msg.chat.id) await bot.send_message(chat_id=msg.chat.id, text=textbook.start_group)
session.add(group)
session.commit()
await bot.send_message(chat_id=msg.chat.id, text=textbook.start_group)
@bot.message_handler(commands=["setup"]) @bot.message_handler(commands=["setup"])
async def setup(msg: Message): async def setup(msg: Message):
get_group(msg.chat)
if msg.chat.type in ("group", "supergroup"): if msg.chat.type in ("group", "supergroup"):
await bot.send_message( await bot.send_message(
chat_id=msg.chat.id, text=textbook.setup, reply_markup=keyboards.setup() 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") @bot.callback_query_handler(func=lambda c: c.data == "register_group_member")
async def register_group_member(call: types.CallbackQuery): async def register_group_member(call: types.CallbackQuery):
new = False new = False
if not session.query(User).filter(User.id == call.from_user.id).first(): user = get_user(call.from_user.id)
user = User(
id=call.from_user.id,
name=call.from_user.first_name,
username=call.from_user.username,
)
session.add(user)
if ( if (
group_member := session.query(GroupMember) group_member := session.query(GroupMember)
.filter( .filter(
@ -129,26 +150,33 @@ async def register_group_member(call: types.CallbackQuery):
@bot.message_handler(commands=["newfund"]) @bot.message_handler(commands=["newfund"])
async def newfund(msg: Message): async def newfund(msg: Message):
if msg.chat.type in ("group", "supergroup"): if msg.chat.type in ("group", "supergroup"):
if ( if session.query(Group).filter(Group.id == msg.chat.id).first():
session.query(Fund) if (
.filter(Fund.group_id == msg.chat.id, Fund.active == True) session.query(Fund)
.first() .filter(Fund.group_id == msg.chat.id, Fund.active == True)
): .first()
await bot.send_message( ):
chat_id=msg.chat.id, await bot.send_message(
text=textbook.newfund_already_exists, 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: else:
await bot.set_state(
user_id=msg.from_user.id,
chat_id=msg.chat.id,
state=States.newfund_amount,
)
await bot.send_message( await bot.send_message(
chat_id=msg.chat.id, chat_id=msg.chat.id,
text=textbook.newfund_amount.format(user=user_link(msg.from_user)), text=textbook.not_initialized
reply_markup=keyboards.cancel(),
parse_mode="html",
) )
@ -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): 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(): if msg.text.isdigit():
await bot.set_state( await bot.set_state(
user_id=msg.from_user.id, chat_id=msg.chat.id, state=States.default user_id=msg.from_user.id, chat_id=msg.chat.id, state=States.default
) )
fund = Fund( 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) session.add(fund)
for group_member in session.query(GroupMember).filter( for group_member in session.query(GroupMember).filter(
GroupMember.group_id == msg.chat.id 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.add(fund_member)
session.commit() session.commit()
await bot.send_message( 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"]) @bot.message_handler(commands=["mystate"])
async def mystate(msg: Message): async def mystate(msg: Message):
state = await bot.get_state(user_id=msg.from_user.id) state = await bot.get_state(user_id=msg.from_user.id)

View File

@ -52,7 +52,7 @@ class Fund(Base):
amount = Column(Integer) amount = Column(Integer)
active = Column(Boolean, default=True) active = Column(Boolean, default=True)
users = relationship("FundMember", backref="fund") members = relationship("FundMember", backref="fund")
class FundMember(Base): class FundMember(Base):

View File

@ -1,17 +1,17 @@
start_private = "Привет, спасибо, что активировали меня в личных сообщениях! Теперь я смогу уведомлять вас о сборах, в которых вы забыли принять участие!" # start_private = "Привет, спасибо, что активировали меня в личных сообщениях! Теперь я смогу уведомлять вас о сборах, в которых вы забыли принять участие!"
start_private = "Ты состоишь в {count} сборах, я уведомлю тебя в случае чего."
private_info = "Вы принимаете участие в {count} сборах!" private_info = "Вы принимаете участие в {count} сборах!"
start_group = "Всем привет, я @waterfundbot! Я помогу собрать деньги на что угодно, уведомлю каждого о сборе в чате, напомню не скинувшим, и многое другое!\n\n Для начала админу чата необходимо прописать /setup. Появится сообщение, под которым будет кнопка - ее необходимо нажать всем, кто планирует участвовать в сборах в этом чате.\n\nНачать новый сбор /newfund\n\nТакже попрошу всех участвующих в сборах начать со мной диалог в личном чате, чтобы я мог уведомлять вас лично." start_group = "Всем привет, я @waterfundbot! Я помогу собрать деньги на что угодно, уведомлю каждого о сборе в чате, напомню не скинувшим, и многое другое!\n\n Для начала админу чата необходимо прописать /setup. Появится сообщение, под которым будет кнопка - ее необходимо нажать всем, кто планирует участвовать в сборах в этом чате.\n\nНачать новый сбор /newfund\n\nТакже попрошу всех участвующих в сборах начать со мной диалог в личном чате, чтобы я мог уведомлять вас лично."
not_initialized = "Группа не инициализирована! Пропишите /start"
setup = "Все, кто планирует участвовать в сборах в этом чате, должны нажать на кнопочку ниже. Если вы передумали - нажмите еще раз, и вы откажетесь от участия." setup = "Все, кто планирует участвовать в сборах в этом чате, должны нажать на кнопочку ниже. Если вы передумали - нажмите еще раз, и вы откажетесь от участия."
user_parted = "Вы приняли участие в сборах в этом чате!" user_parted = "Вы приняли участие в сборах в этом чате!"
user_left = "Вы отказались от участия в сборах в этом чате" user_left = "Вы отказались от участия в сборах в этом чате"
newfund_already_exists = "Предыдущий сбор все еще активен! Пропишите /fund, чтобы показать его, и завершите его, если необходимо создать новый!" newfund_already_exists = "Предыдущий сбор все еще активен! Пропишите /fund, чтобы показать его, и завершите его, если необходимо создать новый!"
newfund_amount = ( newfund_amount = 'Отлично, новый сбор. {user}, напишите сумму сбора <b>ответом на это сообщение</b>, или нажмите кнопку "❌ Отменить"'
'Отлично, новый сбор. {user}, напишите сумму сбора, или кнопку "❌ Отменить"'
)
cancel = "Хорошо, проехали" cancel = "Хорошо, проехали"
not_number = 'Вы ввели не число. {user}, напишите сумму сбора, или кнопку "❌ Отменить"' not_number = 'Вы ввели не число. {user}, напишите сумму сбора <b>ответом на это сообщение</b>, или нажмите кнопку "❌ Отменить"'
fund_created = "Создан новый сбор: {fund}" fund_created = "Создан новый сбор: {fund}"
fund_not_found = "На данный момент в этом чате сборов нет! Создать новый - /newfund" fund_not_found = "На данный момент в этом чате сборов нет! Создать новый - /newfund"