Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 11 additions & 9 deletions bot/command/admin_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,17 @@
from bot.utils import with_parsed_args, reply_html, send_error, \
with_ensure_args
from bot.utils.message_helper import get_user_telegram_id
from services import UserService
from services import ConfigService, InviteCodeService, ServiceApi

logger = logging.getLogger(__name__)


class AdminCommandHandler:
def __init__(self, bot_client: BotClient, user_service: UserService):
def __init__(self, bot_client: BotClient, config_service: ConfigService, invite_code_service: InviteCodeService, emby_api: ServiceApi):
self.bot_client = bot_client
self.user_service = user_service
self.config_service = config_service
self.invite_code_service = invite_code_service
self.emby_api = emby_api
self.code_to_message_id = {}
logger.info("AdminCommandHandler initialized")

Expand All @@ -36,7 +38,7 @@ async def new_code(self, message: Message, args: list[str]):
num = min(num, 20)
try:
code_list = await (
self.user_service
self.invite_code_service
.create_invite_code(message.from_user.id, num)
)
await self.send_code(code_list, message)
Expand All @@ -59,7 +61,7 @@ async def new_whitelist_code(self, message: Message, args: list[str]):

num = min(num, 20)
try:
code_list = await self.user_service.create_whitelist_code(
code_list = await self.invite_code_service.create_whitelist_code(
message.from_user.id, num)
await self.send_code(code_list, message, whitelist=True)
except Exception as e:
Expand Down Expand Up @@ -105,7 +107,7 @@ async def ban_emby(self, message: Message, args: list[str]):
telegram_id = await get_user_telegram_id(self.bot_client.client,
message)
try:
if await self.user_service.emby_ban(telegram_id, reason,
if await self.emby_api.emby_ban(telegram_id, reason,
operator_id):
await reply_html(
message,
Expand All @@ -124,7 +126,7 @@ async def unban_emby(self, message: Message):
telegram_id = await get_user_telegram_id(self.bot_client.client,
message)
try:
if await self.user_service.emby_unban(telegram_id, operator_id):
if await self.emby_api.emby_unban(telegram_id, operator_id):
await reply_html(
message,
f"✅ 已解禁用户 <code>{telegram_id}</code> 的Emby账号"
Expand All @@ -148,7 +150,7 @@ async def register_until(self, message: Message, args: list[str]):
if time < now:
return await reply_html(message, "❌ 时间必须晚于当前时间")

await self.user_service.set_emby_config(
await self.config_service.set_emby_config(
message.from_user.id,
register_public_time=int(time.timestamp())
)
Expand All @@ -168,7 +170,7 @@ async def register_amount(self, message: Message, args: list[str]):
"""
try:
amount = int(args[0])
await self.user_service.set_emby_config(
await self.config_service.set_emby_config(
message.from_user.id,
register_public_user=amount
)
Expand Down
14 changes: 8 additions & 6 deletions bot/command/event_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,17 @@

from bot import BotClient
from config import config
from services import UserService
from services import UserRouter, InviteCodeService, ServiceApi

logger = logging.getLogger(__name__)


class EventHandler:
def __init__(self, bot_client: BotClient, user_service: UserService):
def __init__(self, bot_client: BotClient, user_router: UserRouter, invite_code_service: InviteCodeService, emby_api: ServiceApi):
self.bot_client = bot_client
self.user_service = user_service
self.user_router = user_router
self.invite_code_service = invite_code_service
self.emby_api = emby_api
self.code_to_message_id = {}
logger.info("EventHandler initialized")

Expand All @@ -36,7 +38,7 @@ async def handle_callback_query(self, _,
await callback_query.answer("线路不存在")
return

await self.user_service.update_user_router(
await self.user_router.update_user_router(
callback_query.from_user.id, index)
await callback_query.answer("线路已更新")
await callback_query.message.edit(
Expand All @@ -54,11 +56,11 @@ async def group_member_change_handler(self, _, message: Message):
"""
if message.left_chat_member:
left_member_id = message.left_chat_member.id
left_member = await self.user_service.must_get_user(left_member_id)
left_member = await self.invite_code_service.must_get_user(left_member_id)
if (left_member.has_emby_account()
and not left_member.is_emby_baned()
and not left_member.is_whitelist):
await self.user_service.emby_ban(message.left_chat_member.id,
await self.emby_api.emby_ban(message.left_chat_member.id,
"用户已退出群组")
config.group_members.pop(message.left_chat_member.id, None)
if message.new_chat_members:
Expand Down
28 changes: 15 additions & 13 deletions bot/command/user_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,17 @@
from bot.utils.message_helper import get_user_telegram_id
from config import config
from models.invite_code_model import InviteCodeType
from services import UserService
from services import InviteCodeService, UserRouter, ServiceApi

logger = logging.getLogger(__name__)


class UserCommandHandler:
def __init__(self, bot_client: BotClient, user_service: UserService):
def __init__(self, bot_client: BotClient, user_router: UserRouter, invite_code_service: InviteCodeService, emby_api: ServiceApi):
self.bot_client = bot_client
self.user_service = user_service
self.user_router = user_router
self.invite_code_service = invite_code_service
self.emby_api = emby_api
self.code_to_message_id = {}
logger.info("UserCommandHandler initialized")

Expand All @@ -27,7 +29,7 @@ async def count(self, message: Message):
查询服务器内片子数量
"""
try:
count_data = self.user_service.emby_count()
count_data = self.emby_api.emby_count()
if not count_data:
return await reply_html(message, "❌ 查询失败:无法获取数据")

Expand Down Expand Up @@ -56,7 +58,7 @@ async def info(self, message: Message):
telegram_id = await get_user_telegram_id(self.bot_client.client,
message)
try:
user, emby_info = await self.user_service.emby_info(telegram_id)
user, emby_info = await self.emby_api.emby_info(telegram_id)
last_active = (
parse_iso8601_to_normal_date(emby_info.get("LastActivityDate"))
if emby_info.get("LastActivityDate") else "无")
Expand Down Expand Up @@ -95,7 +97,7 @@ async def use_code(self, message: Message, args: list[str]):
code = args[0]
telegram_id = message.from_user.id
try:
used_code = await self.user_service.redeem_code(telegram_id, code)
used_code = await self.invite_code_service.redeem_code(telegram_id, code)
if not used_code:
return await reply_html(message, "❌ 邀请码使用失败")
# 根据类型给出不同的回复
Expand Down Expand Up @@ -128,13 +130,13 @@ async def select_line(self, message: Message):
telegram_id = message.from_user.id
router_list = (
config.router_list or
await self.user_service.get_router_list(telegram_id)
await self.user_router.get_router_list(telegram_id)
)
# 缓存到 config 中,减少重复获取
if router_list and not config.router_list:
config.router_list = router_list

user_router = await self.user_service.get_user_router(telegram_id)
user_router = await self.user_router.get_user_router(telegram_id)
user_router_index = user_router.get('index', '')
message_text = f"当前线路:<code>{user_router_index}</code>\n请选择线路:"
message_buttons = []
Expand Down Expand Up @@ -167,9 +169,9 @@ async def create_user(self, message: Message, args: list[str]):
"""
emby_name = args[0]
try:
default_password = self.user_service.gen_default_passwd()
default_password = self.invite_code_service.gen_default_passwd()
user = await (
self.user_service.emby_create_user(
self.emby_api.emby_create_user(
message.from_user.id, emby_name, default_password
)
)
Expand All @@ -187,10 +189,10 @@ async def reset_emby_password(self, message: Message):
"""
/reset_emby_password
"""
default_password = self.user_service.gen_default_passwd()
default_password = self.invite_code_service.gen_default_passwd()
try:
if await (
self.user_service
self.emby_api
.reset_password(
message.from_user.id, default_password
)
Expand Down Expand Up @@ -219,7 +221,7 @@ async def help_command(self, message: Message):
"/count - 查看服务器内影片数量\n"
"/help - 显示本帮助\n"
)
if await self.user_service.is_admin(message.from_user.id):
if await self.invite_code_service.is_admin(message.from_user.id):
help_message += (
"\n<b>管理命令:</b>\n"
"/new_code [数量] - 创建新的普通邀请码\n"
Expand Down
13 changes: 12 additions & 1 deletion services/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,12 @@
from .user_service import UserService
from .invite_code_service import InviteCodeService
from .config_service import ConfigService
from .user_router import UserRouter
from .emby_api import ServiceApi


__all__ = [
"InviteCodeService",
"UserRouter",
"ConfigService",
"ServiceApi"
]
86 changes: 86 additions & 0 deletions services/config_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
from models.config_model import ConfigOrm
from models import User, Config
from datetime import datetime
from typing import Optional

class ConfigService:
"""Emby配置相关"""

async def first_or_create_emby_config(self) -> Config:
"""获取或创建 Emby 配置。"""
emby_config = await ConfigOrm().query_one(conds=[Config.id == 1])
if not emby_config:
emby_config = Config(
register_public_user=0,
register_public_time=0,
total_register_user=0
)
await ConfigOrm().add(emby_config)
return emby_config

async def emby_create_user(self, telegram_id: int, username: str, password: str) -> User:
"""创建 Emby 用户(外部调用入口),先判断各种配置是否允许注册,然后调用内部的 _emby_create_user"""
user = await self.get_or_create_user_by_telegram_id(telegram_id)
if user.has_emby_account():
raise Exception("该 Telegram 用户已经绑定过 Emby 账号,无法重复创建。")

emby_config = await self.first_or_create_emby_config()
if not emby_config:
raise Exception("未找到 Emby 配置,无法创建账号。")

if not await self._check_register_permission(user, emby_config):
raise Exception("当前没有可用的注册权限或名额,创建账号被拒绝。")

async with ConfigOrm().transaction() as session:
if not user.enable_register and emby_config.register_public_user > 0:
emby_config.register_public_user -= 1

emby_config.total_register_user += 1
new_user = await self._emby_create_user(telegram_id, username, password)

session.add(new_user)
session.add(emby_config)
await session.commit()
return new_user

async def _check_register_permission(self, user: User, emby_config: Config) -> bool:
"""检查用户是否有权限注册 Emby 账号"""
enable_register = user.enable_register
if not enable_register and emby_config.register_public_user > 0:
enable_register = True
if (
not enable_register
and emby_config.register_public_time > 0
and datetime.now().timestamp() < emby_config.register_public_time
):
enable_register = True
if 0 < emby_config.register_public_time < datetime.now().timestamp():
await ConfigOrm().update(
values={'register_public_time': 0},
conds=[Config.id == 1]
)
return enable_register

async def set_emby_config(self, telegram_id: int, register_public_user: Optional[int] = None,
register_public_time: Optional[int] = None) -> Config:
"""设置 Emby 注册相关配置,如公共注册名额和公共注册截止时间"""
user = await self.must_get_user(telegram_id)
user.check_set_emby_config()

emby_config = await self.first_or_create_emby_config()
if not emby_config:
raise Exception("未找到全局 Emby 配置,无法设置。")

if register_public_user is not None:
emby_config.register_public_user = register_public_user
if register_public_time is not None:
emby_config.register_public_time = register_public_time

await ConfigOrm().update(
values={
'register_public_user': emby_config.register_public_user,
'register_public_time': emby_config.register_public_time
},
conds=[Config.id == 1]
)
return emby_config
Loading