things
This commit is contained in:
139
bot/app/bot.py
139
bot/app/bot.py
@ -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)
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user