not working shit
This commit is contained in:
196
bot/app/bot.py
196
bot/app/bot.py
@ -17,10 +17,11 @@ from datetime import datetime
|
||||
import math
|
||||
import socket
|
||||
import os
|
||||
import json
|
||||
from typing import Union
|
||||
|
||||
# Local imports
|
||||
from config import token
|
||||
from config import token, admins
|
||||
from constants import (
|
||||
MAX_QUEUES_OWN,
|
||||
MAX_QUEUES_PARTS_IN,
|
||||
@ -29,10 +30,12 @@ from constants import (
|
||||
)
|
||||
import textbook
|
||||
import keyboards
|
||||
from pagination import PaginatedList
|
||||
|
||||
# DB
|
||||
from db.base import Session, engine, Base
|
||||
from db.models import User, Queue, QueueUser
|
||||
from sqlalchemy import select
|
||||
|
||||
|
||||
bot = AsyncTeleBot(token, state_storage=StatePickleStorage())
|
||||
@ -42,13 +45,17 @@ class States(StatesGroup):
|
||||
default = State()
|
||||
changing_name = State()
|
||||
changing_queue_name = State()
|
||||
admin_broadcasting = State()
|
||||
|
||||
|
||||
# Utils
|
||||
|
||||
|
||||
def get_queue_stats_text(queue: Queue) -> str:
|
||||
s = textbook.queue_stats.format(name=queue.name, count=len(queue.users))
|
||||
queue_users = queue.users.filter_by(active=True)
|
||||
s = textbook.queue_stats.format(
|
||||
name=queue.name, count=len(queue_users)
|
||||
)
|
||||
return s
|
||||
|
||||
|
||||
@ -62,7 +69,7 @@ async def get_queue_from_state_data(call: types.CallbackQuery) -> Queue:
|
||||
callback_query_id=call.id, text=textbook.queue_operational_error
|
||||
)
|
||||
return None
|
||||
queue = session.query(Queue).filter_by(id=queue_id).first()
|
||||
queue = session.query(Queue).filter_by(id=queue_id, active=True).first()
|
||||
if queue.owner.id != call.from_user.id:
|
||||
await bot.answer_callback_query(
|
||||
callback_query_id=call.id, text=textbook.queue_operational_error
|
||||
@ -95,7 +102,7 @@ def get_first_queue_user(queue: Queue) -> Union[QueueUser, None]:
|
||||
def kick_first(queue: Queue) -> bool:
|
||||
if len(queue.users):
|
||||
first_user = get_first_queue_user(queue)
|
||||
session.delete(first_user)
|
||||
setattr(first_user, "active", False)
|
||||
session.commit()
|
||||
normalize_queue(queue)
|
||||
return True
|
||||
@ -118,15 +125,19 @@ def normalize_queue(queue: Queue) -> Queue:
|
||||
# setattr(first_user, "position", 0)
|
||||
# session.commit()
|
||||
# queue = session.query(Queue).filter_by(id=queue.id).first()
|
||||
for i, qu in enumerate(sorted(queue.users, key=lambda qu: qu.position)):
|
||||
setattr(qu, "position", i)
|
||||
queue_users = queue.users.filter_by(active= True)
|
||||
for i, qu in enumerate(sorted(queue_users, key=lambda qu: qu.position)):
|
||||
# setattr(qu, "position", i)
|
||||
pass
|
||||
session.commit()
|
||||
return queue
|
||||
|
||||
|
||||
async def update_queue_users_message(msg: Message, queue: Queue):
|
||||
queue = normalize_queue(queue)
|
||||
users_str = "\n".join([f"{qu.position}. {qu.user.name}" for qu in queue.users])
|
||||
filtered_users = list(filter(lambda qu: qu.active, queue.users))
|
||||
users = sorted(filtered_users, key=lambda qu: qu.position)
|
||||
users_str = "\n".join([f"{qu.position}. {qu.user.name}" for qu in users])
|
||||
await bot.edit_message_text(
|
||||
chat_id=msg.chat.id,
|
||||
message_id=msg.id,
|
||||
@ -156,15 +167,19 @@ async def start(msg: Message):
|
||||
await bot.set_state(user_id=msg.from_user.id, state=States.default)
|
||||
if len(msg.text.split()) > 1:
|
||||
command, queue_id = msg.text.split()
|
||||
if queue := session.query(Queue).filter_by(id=queue_id).first():
|
||||
if (
|
||||
queue := session.query(Queue)
|
||||
.filter_by(id=queue_id, active=True)
|
||||
.first()
|
||||
):
|
||||
if (
|
||||
not session.query(QueueUser)
|
||||
.filter_by(queue_id=queue.id, user_id=msg.from_user.id)
|
||||
.filter_by(queue_id=queue.id, user_id=msg.from_user.id, active=True)
|
||||
.first()
|
||||
) and not len(user.takes_part_in_queues) > MAX_QUEUES_PARTS_IN:
|
||||
last_user = (
|
||||
session.query(QueueUser)
|
||||
.filter_by(queue_id=queue.id)
|
||||
.filter_by(queue_id=queue.id, active=True)
|
||||
.order_by(QueueUser.position.desc())
|
||||
.first()
|
||||
)
|
||||
@ -215,7 +230,7 @@ async def to_menu_handler(call: types.CallbackQuery):
|
||||
@bot.callback_query_handler(func=lambda c: c.data[:2] == "p:")
|
||||
async def proceed_user_handler(call: types.CallbackQuery):
|
||||
queue_id = call.data[2:]
|
||||
queue = session.query(Queue).filter_by(id=queue_id).first()
|
||||
queue = session.query(Queue).filter_by(id=queue_id, active=True).first()
|
||||
user = session.query(User).filter_by(id=call.from_user.id).first()
|
||||
if next_queue_user := proceed_queue_user(queue, user):
|
||||
try:
|
||||
@ -250,6 +265,11 @@ async def proceed_user_handler(call: types.CallbackQuery):
|
||||
await bot.answer_callback_query(callback_query_id=call.id)
|
||||
|
||||
|
||||
@bot.callback_query_handler(func=lambda c: c.data == "dummy")
|
||||
async def dummy_handler(call: types.CallbackQuery):
|
||||
await bot.answer_callback_query(callback_query_id=call.id)
|
||||
|
||||
|
||||
# Main menu
|
||||
|
||||
|
||||
@ -257,7 +277,7 @@ async def proceed_user_handler(call: types.CallbackQuery):
|
||||
async def new_queue_handler(call: types.CallbackQuery):
|
||||
user = session.query(User).filter_by(id=call.from_user.id).first()
|
||||
if user:
|
||||
if len(user.owns_queues) < MAX_QUEUES_OWN:
|
||||
if len(list(filter(lambda q: q.active, user.owns_queues))) < MAX_QUEUES_OWN:
|
||||
queue = Queue(owner_id=call.from_user.id)
|
||||
session.add(queue)
|
||||
session.commit()
|
||||
@ -277,7 +297,7 @@ async def new_queue_handler(call: types.CallbackQuery):
|
||||
@bot.callback_query_handler(func=lambda c: c.data == "my_queues")
|
||||
async def my_queues_handler(call: types.CallbackQuery):
|
||||
user = session.query(User).filter_by(id=call.from_user.id).first()
|
||||
queues = user.owns_queues
|
||||
queues = list(filter(lambda q: q.active, user.owns_queues))
|
||||
await bot.edit_message_text(
|
||||
chat_id=call.message.chat.id,
|
||||
message_id=call.message.id,
|
||||
@ -290,7 +310,9 @@ async def my_queues_handler(call: types.CallbackQuery):
|
||||
@bot.callback_query_handler(func=lambda c: c.data == "parts_queues")
|
||||
async def parts_queues_handler(call: types.CallbackQuery):
|
||||
user = session.query(User).filter_by(id=call.from_user.id).first()
|
||||
queues = [qu.queue for qu in user.takes_part_in_queues]
|
||||
queues = [
|
||||
qu.queue for qu in list(filter(lambda q: q.active, user.takes_part_in_queues))
|
||||
]
|
||||
await bot.edit_message_text(
|
||||
chat_id=call.message.chat.id,
|
||||
message_id=call.message.id,
|
||||
@ -327,7 +349,7 @@ async def about_handler(call: types.CallbackQuery):
|
||||
@bot.callback_query_handler(func=lambda c: c.data[:2] == "t:")
|
||||
async def queue_parts_handler(call: types.CallbackQuery, queue_id: str = None):
|
||||
queue_id = call.data[2:] if not queue_id else queue_id
|
||||
queue = session.query(Queue).filter_by(id=queue_id).first()
|
||||
queue = session.query(Queue).filter_by(id=queue_id, active=True).first()
|
||||
if not queue:
|
||||
await bot.answer_callback_query(callback_query_id=call.id, text=textbook.error)
|
||||
return None
|
||||
@ -335,7 +357,12 @@ async def queue_parts_handler(call: types.CallbackQuery, queue_id: str = None):
|
||||
user_id=call.from_user.id, chat_id=call.message.chat.id
|
||||
) as state_data:
|
||||
state_data["part_queue_id"] = queue_id
|
||||
users_str = "\n".join([f"{qu.position}. {qu.user.name}" for qu in queue.users])
|
||||
users_str = "\n".join(
|
||||
[
|
||||
f"{qu.position}. {qu.user.name}"
|
||||
for qu in list(filter(lambda qu: qu.active, queue.users))
|
||||
]
|
||||
)
|
||||
await bot.edit_message_text(
|
||||
chat_id=call.message.chat.id,
|
||||
message_id=call.message.id,
|
||||
@ -354,10 +381,10 @@ async def leave_queue_handler(call: types.CallbackQuery):
|
||||
if queue := await get_parting_queue_from_state_data(call):
|
||||
queueuser = (
|
||||
session.query(QueueUser)
|
||||
.filter_by(queue_id=queue.id, user_id=call.from_user.id)
|
||||
.filter_by(queue_id=queue.id, user_id=call.from_user.id, active=True)
|
||||
.first()
|
||||
)
|
||||
session.delete(queueuser)
|
||||
setattr(queueuser, "active", False)
|
||||
session.commit()
|
||||
normalize_queue(queue)
|
||||
await bot.answer_callback_query(
|
||||
@ -372,7 +399,12 @@ async def leave_queue_handler(call: types.CallbackQuery):
|
||||
@bot.callback_query_handler(func=lambda c: c.data == "refresh_list")
|
||||
async def refresh_list_handler(call: types.CallbackQuery):
|
||||
if queue := await get_parting_queue_from_state_data(call):
|
||||
users_str = "\n".join([f"{qu.position}. {qu.user.name}" for qu in queue.users])
|
||||
users_str = "\n".join(
|
||||
[
|
||||
f"{qu.position}. {qu.user.name}"
|
||||
for qu in list(filter(lambda q: q.active, queue.users))
|
||||
]
|
||||
)
|
||||
try:
|
||||
await bot.edit_message_text(
|
||||
chat_id=call.message.chat.id,
|
||||
@ -392,23 +424,24 @@ async def refresh_list_handler(call: types.CallbackQuery):
|
||||
@bot.callback_query_handler(func=lambda c: c.data[:2] == "q:")
|
||||
async def queue_handler(call: types.CallbackQuery, queue_id: str = None):
|
||||
queue_id = call.data[2:] if not queue_id else queue_id
|
||||
queue = session.query(Queue).filter_by(id=queue_id).first()
|
||||
if not queue:
|
||||
queue = session.query(Queue).filter_by(id=queue_id, active=True).first()
|
||||
if queue:
|
||||
async with bot.retrieve_data(
|
||||
user_id=call.from_user.id, chat_id=call.message.chat.id
|
||||
) as state_data:
|
||||
state_data["queue_id"] = queue.id
|
||||
await bot.edit_message_text(
|
||||
chat_id=call.message.chat.id,
|
||||
message_id=call.message.id,
|
||||
text=get_queue_stats_text(queue),
|
||||
reply_markup=keyboards.queue_menu(),
|
||||
parse_mode="html",
|
||||
)
|
||||
else:
|
||||
await bot.answer_callback_query(callback_query_id=call.id, text=textbook.error)
|
||||
return None
|
||||
async with bot.retrieve_data(
|
||||
user_id=call.from_user.id, chat_id=call.message.chat.id
|
||||
) as state_data:
|
||||
state_data["queue_id"] = queue_id
|
||||
await bot.edit_message_text(
|
||||
chat_id=call.message.chat.id,
|
||||
message_id=call.message.id,
|
||||
text=get_queue_stats_text(queue),
|
||||
reply_markup=keyboards.queue_menu(),
|
||||
parse_mode="html",
|
||||
)
|
||||
await bot.answer_callback_query(callback_query_id=call.id)
|
||||
|
||||
|
||||
|
||||
# Queue menu
|
||||
|
||||
@ -416,7 +449,12 @@ async def queue_handler(call: types.CallbackQuery, queue_id: str = None):
|
||||
@bot.callback_query_handler(func=lambda c: c.data == "get_queue_users")
|
||||
async def get_queue_users_handler(call: types.CallbackQuery):
|
||||
if queue := await get_queue_from_state_data(call):
|
||||
users_str = "\n".join([f"{qu.position}. {qu.user.name}" for qu in queue.users])
|
||||
users_str = "\n".join(
|
||||
[
|
||||
f"{qu.position}. {qu.user.name}"
|
||||
for qu in list(filter(lambda qu: qu.active, queue.users))
|
||||
]
|
||||
)
|
||||
await bot.edit_message_text(
|
||||
chat_id=call.message.chat.id,
|
||||
message_id=call.message.id,
|
||||
@ -509,11 +547,23 @@ async def kick_first_handler(call: types.CallbackQuery):
|
||||
|
||||
@bot.callback_query_handler(func=lambda c: c.data == "swap_users")
|
||||
async def swap_users_handler(call: types.CallbackQuery):
|
||||
await bot.answer_callback_query(
|
||||
callback_query_id=call.id,
|
||||
text=textbook.in_development_plug,
|
||||
show_alert=True,
|
||||
)
|
||||
if queue := await get_queue_from_state_data(call):
|
||||
pl = PaginatedList(queue.users, 8)
|
||||
async with bot.retrieve_data(
|
||||
user_id=call.from_user.id, chat_id=call.message.chat.id
|
||||
) as state_data:
|
||||
state_data["pl"] = pl
|
||||
await bot.edit_message_text(
|
||||
chat_id=call.message.chat.id,
|
||||
message_id=call.message.id,
|
||||
text=textbook.swap_users_first,
|
||||
reply_markup=keyboards.swap_users_list(
|
||||
queue_users=pl.get_current_page(),
|
||||
current_page=pl.current_page,
|
||||
total_pages=len(pl.divided_list),
|
||||
),
|
||||
parse_mode="html",
|
||||
)
|
||||
|
||||
|
||||
@bot.callback_query_handler(func=lambda c: c.data == "refresh_users")
|
||||
@ -521,7 +571,10 @@ async def refresh_users_handler(call: types.CallbackQuery):
|
||||
if queue := await get_queue_from_state_data(call):
|
||||
try:
|
||||
users_str = "\n".join(
|
||||
[f"{qu.position}. {qu.user.name}" for qu in queue.users]
|
||||
[
|
||||
f"{qu.position}. {qu.user.name}"
|
||||
for qu in list(filter(lambda qu: qu.active, queue.users))
|
||||
]
|
||||
)
|
||||
await bot.edit_message_text(
|
||||
chat_id=call.message.chat.id,
|
||||
@ -537,6 +590,14 @@ async def refresh_users_handler(call: types.CallbackQuery):
|
||||
await bot.answer_callback_query(callback_query_id=call.id)
|
||||
|
||||
|
||||
# Swap users
|
||||
|
||||
|
||||
@bot.callback_query_handler(func=lambda c: c.data == "swap_users_page_up")
|
||||
async def swap_users_page_up_handler(call: types.CallbackQuery):
|
||||
pass
|
||||
|
||||
|
||||
# Queue settings
|
||||
|
||||
|
||||
@ -568,7 +629,7 @@ async def update_queue_name(msg: Message):
|
||||
user_id=msg.from_user.id, chat_id=msg.chat.id
|
||||
) as state_data:
|
||||
queue_id = state_data.get("queue_id", None)
|
||||
queue = session.query(Queue).filter_by(id=queue_id).first()
|
||||
queue = session.query(Queue).filter_by(id=queue_id, active=True).first()
|
||||
if not queue:
|
||||
await bot.send_message(chat_id=msg.chat.id, text=textbook.edit_name_error)
|
||||
return None
|
||||
@ -609,8 +670,10 @@ async def delete_queue_approve_handler(call: types.CallbackQuery):
|
||||
async def delete_queue_handler(call: types.CallbackQuery):
|
||||
if queue := await get_queue_from_state_data(call):
|
||||
for qu in queue.users:
|
||||
session.delete(qu) # TODO: Use SQLAlchemy to cascade-delete all users
|
||||
session.delete(queue)
|
||||
setattr(
|
||||
qu, "active", False
|
||||
) # TODO: Use SQLAlchemy to cascade-delete all users
|
||||
setattr(queue, "active", False)
|
||||
session.commit()
|
||||
await bot.answer_callback_query(
|
||||
callback_query_id=call.id, text=textbook.queue_deleted
|
||||
@ -688,6 +751,53 @@ async def changelog(msg: Message):
|
||||
await bot.send_message(chat_id=msg.chat.id, text=file.read(), parse_mode="html")
|
||||
|
||||
|
||||
@bot.message_handler(commands=["mydata"])
|
||||
async def mydata(msg: Message):
|
||||
async with bot.retrieve_data(
|
||||
user_id=msg.from_user.id, chat_id=msg.chat.id
|
||||
) as state_data:
|
||||
await bot.send_message(chat_id=msg.chat.id, text=str(state_data))
|
||||
|
||||
|
||||
@bot.message_handler(commands=["broadcast"])
|
||||
async def broadcast(msg: Message):
|
||||
if msg.from_user.id in admins:
|
||||
await bot.set_state(user_id=msg.from_user.id, state=States.admin_broadcasting)
|
||||
await bot.send_message(
|
||||
chat_id=msg.chat.id,
|
||||
text=textbook.admin_broadcasting,
|
||||
reply_markup=keyboards.edit_name(),
|
||||
)
|
||||
|
||||
|
||||
@bot.callback_query_handler(
|
||||
func=lambda c: c.data == "cancel", state=States.admin_broadcasting
|
||||
)
|
||||
async def cancel_broadcast(call: types.CallbackQuery):
|
||||
await to_menu_handler(call)
|
||||
|
||||
|
||||
@bot.message_handler(content_types=["text"], state=States.admin_broadcasting)
|
||||
async def broadcast_message_handler(msg: Message):
|
||||
if msg.from_user.id in admins:
|
||||
counter = 0
|
||||
for user in session.query(User):
|
||||
try:
|
||||
await bot.send_message(
|
||||
chat_id=user.id,
|
||||
text=msg.text,
|
||||
)
|
||||
counter += 1
|
||||
except Exception as e:
|
||||
continue
|
||||
await bot.send_message(
|
||||
chat_id=msg.chat.id,
|
||||
text=textbook.broadcast_completed.format(count=counter),
|
||||
)
|
||||
await asyncio.sleep(1)
|
||||
await start(msg)
|
||||
|
||||
|
||||
# Launch
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user