feat: implement /timezone command to get/set room timezone
- Add cmd_timezone handler for /timezone command - Validate timezone using IANA format (zoneinfo.ZoneInfo) - Use existing BountyService.get_timezone and set_timezone methods - Admin-only permission via service layer - Update help text and bot command list - Fixes #53
This commit is contained in:
@@ -14,6 +14,7 @@ from commands import (
|
|||||||
cmd_help,
|
cmd_help,
|
||||||
cmd_my,
|
cmd_my,
|
||||||
cmd_start,
|
cmd_start,
|
||||||
|
cmd_timezone,
|
||||||
cmd_track,
|
cmd_track,
|
||||||
cmd_untrack,
|
cmd_untrack,
|
||||||
cmd_update,
|
cmd_update,
|
||||||
@@ -41,6 +42,7 @@ def build_app() -> Application:
|
|||||||
app.add_handler(CommandHandler("delete", cmd_delete))
|
app.add_handler(CommandHandler("delete", cmd_delete))
|
||||||
app.add_handler(CommandHandler("track", cmd_track))
|
app.add_handler(CommandHandler("track", cmd_track))
|
||||||
app.add_handler(CommandHandler("untrack", cmd_untrack))
|
app.add_handler(CommandHandler("untrack", cmd_untrack))
|
||||||
|
app.add_handler(CommandHandler("timezone", cmd_timezone))
|
||||||
|
|
||||||
app.add_handler(MessageHandler(filters.COMMAND, cmd_help))
|
app.add_handler(MessageHandler(filters.COMMAND, cmd_help))
|
||||||
|
|
||||||
@@ -56,6 +58,7 @@ async def post_init(app: Application) -> None:
|
|||||||
("edit", "Edit a bounty"),
|
("edit", "Edit a bounty"),
|
||||||
("track", "Track a bounty"),
|
("track", "Track a bounty"),
|
||||||
("untrack", "Stop tracking"),
|
("untrack", "Stop tracking"),
|
||||||
|
("timezone", "Get/set room timezone"),
|
||||||
("help", "Show help"),
|
("help", "Show help"),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import time
|
import time
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
|
||||||
|
|
||||||
import dateparser
|
import dateparser
|
||||||
from telegram import Update
|
from telegram import Update
|
||||||
@@ -323,7 +324,37 @@ async def cmd_help(update: Update, ctx: ContextTypes.DEFAULT_TYPE) -> None:
|
|||||||
"/delete <id> — delete bounty\n"
|
"/delete <id> — delete bounty\n"
|
||||||
"/track <id> — track a bounty (groups only)\n"
|
"/track <id> — track a bounty (groups only)\n"
|
||||||
"/untrack <id> — stop tracking (groups only)\n"
|
"/untrack <id> — stop tracking (groups only)\n"
|
||||||
|
"/timezone [tz] — get/set room timezone (admin only)\n"
|
||||||
"/start — re-initialize\n"
|
"/start — re-initialize\n"
|
||||||
"/help — this message",
|
"/help — this message",
|
||||||
disable_web_page_preview=True,
|
disable_web_page_preview=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def cmd_timezone(update: Update, ctx: ContextTypes.DEFAULT_TYPE) -> None:
|
||||||
|
args = extract_args(update.message.text)
|
||||||
|
room_id = get_room_id(update)
|
||||||
|
user_id = get_user_id(update)
|
||||||
|
|
||||||
|
if not args:
|
||||||
|
current_tz = BOUNTY_SERVICE.get_timezone(room_id)
|
||||||
|
await update.message.reply_text(f"Current timezone: {current_tz}")
|
||||||
|
return
|
||||||
|
|
||||||
|
timezone_str = args[0]
|
||||||
|
|
||||||
|
try:
|
||||||
|
ZoneInfo(timezone_str)
|
||||||
|
except (KeyError, ZoneInfoNotFoundError):
|
||||||
|
await update.message.reply_text(
|
||||||
|
"⛔ Invalid timezone. Use IANA format (e.g., Asia/Jakarta)"
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
BOUNTY_SERVICE.set_timezone(room_id, timezone_str, user_id)
|
||||||
|
except PermissionError as e:
|
||||||
|
await update.message.reply_text(f"⛔ {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
await update.message.reply_text(f"✅ Timezone set to {timezone_str}.")
|
||||||
|
|||||||
Reference in New Issue
Block a user