[F] Inline callback didn't work
This commit is contained in:
+36
-51
@@ -63,6 +63,20 @@ def user_info(update: Update):
|
|||||||
|
|
||||||
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||||
logger.info(f"/start from {user_info(update)}")
|
logger.info(f"/start from {user_info(update)}")
|
||||||
|
|
||||||
|
# Handle deep-link payloads (e.g. /start water_channelname)
|
||||||
|
if context.args:
|
||||||
|
payload = context.args[0]
|
||||||
|
uid = update.message.from_user.id
|
||||||
|
|
||||||
|
if payload.startswith("water_"):
|
||||||
|
channel = payload[6:]
|
||||||
|
return await handle_water(update, uid, channel)
|
||||||
|
|
||||||
|
if payload.startswith("th_"):
|
||||||
|
channel = payload[3:]
|
||||||
|
return await handle_treehole(update, uid, channel)
|
||||||
|
|
||||||
await update.message.reply_text("🌳🌳🌳")
|
await update.message.reply_text("🌳🌳🌳")
|
||||||
|
|
||||||
|
|
||||||
@@ -71,17 +85,18 @@ def channel_html(channel: str):
|
|||||||
if ouf.exists():
|
if ouf.exists():
|
||||||
return ouf.read_text('utf-8')
|
return ouf.read_text('utf-8')
|
||||||
t = requests.get(f"https://t.me/{channel}").text
|
t = requests.get(f"https://t.me/{channel}").text
|
||||||
ouf.write_text(t, 'utf-8')
|
ouf.write_text(t, encoding='utf-8')
|
||||||
return t
|
return t
|
||||||
|
|
||||||
|
|
||||||
def channel_buttons(channel: str) -> InlineKeyboardMarkup:
|
def channel_buttons(channel: str) -> InlineKeyboardMarkup:
|
||||||
"""Build the inline keyboard buttons for a channel post."""
|
"""Build the inline keyboard buttons for a channel post. All buttons use URL
|
||||||
leaf_text = urllib.parse.quote(f"/leaf {channel} ")
|
deep-links so the keyboard is preserved when the message is forwarded."""
|
||||||
|
leaf_text = urllib.parse.quote(f"/leaf {channel} 你的频道@名")
|
||||||
return InlineKeyboardMarkup([
|
return InlineKeyboardMarkup([
|
||||||
[InlineKeyboardButton("🌿 成为树叶", url=f"https://t.me/{BOT_NAME}?text={leaf_text}")],
|
[InlineKeyboardButton("🌿 成为树叶", url=f"https://t.me/{BOT_NAME}?text={leaf_text}")],
|
||||||
[InlineKeyboardButton("💧 浇水", callback_data=f"water:{channel}")],
|
[InlineKeyboardButton("💧 浇水", url=f"https://t.me/{BOT_NAME}?start=water_{channel}"),
|
||||||
[InlineKeyboardButton("🕳️ 树洞", callback_data=f"th:{channel}")],
|
InlineKeyboardButton("🕳️ 树洞", url=f"https://t.me/{BOT_NAME}?start=th_{channel}")],
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
@@ -115,13 +130,14 @@ async def init(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|||||||
return await update.message.reply_text("密码不对哦~")
|
return await update.message.reply_text("密码不对哦~")
|
||||||
|
|
||||||
info = utils.extract_meta_tags(channel_html(channel))
|
info = utils.extract_meta_tags(channel_html(channel))
|
||||||
|
title = info.title or channel
|
||||||
|
|
||||||
logger.info(f"> 🌳 Initializing root channel {channel}.")
|
logger.info(f"> 🌳 Initializing root channel {channel}.")
|
||||||
db.register(channel, info.title, owner_id=uid)
|
db.register(channel, title, owner_id=uid)
|
||||||
|
|
||||||
await update.message.reply_text(f"🌳 根频道 @{channel} 创建成功!把下面这条转发到频道里吧~")
|
await update.message.reply_text(f"🌳 根频道 @{channel} 创建成功!把下面这条转发到频道里吧~")
|
||||||
return await update.message.reply_html(
|
return await update.message.reply_html(
|
||||||
shareable_message(channel, info.title, "是频道树的树根 🌳"),
|
shareable_message(channel, title, "是频道树的树根 🌳"),
|
||||||
reply_markup=channel_buttons(channel))
|
reply_markup=channel_buttons(channel))
|
||||||
|
|
||||||
|
|
||||||
@@ -184,68 +200,39 @@ async def plant(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|||||||
return await update.message.reply_text("(看了一下好像频道信息还没有更新的样子... 确定加上了吗?再试试吧)")
|
return await update.message.reply_text("(看了一下好像频道信息还没有更新的样子... 确定加上了吗?再试试吧)")
|
||||||
|
|
||||||
|
|
||||||
async def water_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
async def handle_water(update: Update, user_id: int, channel: str):
|
||||||
"""Handle the 浇水 (water/upvote) button press."""
|
"""Handle the 浇水 (water/upvote) action via deep-link."""
|
||||||
query = update.callback_query
|
logger.info(f"💧 Water from {user_id} for {channel}")
|
||||||
data = query.data
|
|
||||||
|
|
||||||
if not data.startswith("water:"):
|
|
||||||
return
|
|
||||||
|
|
||||||
channel = data[len("water:"):]
|
|
||||||
user_id = query.from_user.id
|
|
||||||
|
|
||||||
logger.info(f"💧 Water from {user_id} {query.from_user.username or ''} for {channel}")
|
|
||||||
|
|
||||||
# Check if the channel exists
|
|
||||||
info = db.channel_info(channel)
|
info = db.channel_info(channel)
|
||||||
if not info:
|
if not info:
|
||||||
return await query.answer("这个频道不在树上哦~", show_alert=False)
|
return await update.message.reply_text("这个频道不在树上哦~")
|
||||||
|
|
||||||
# Try to add the vote
|
|
||||||
if db.add_vote(user_id, channel):
|
if db.add_vote(user_id, channel):
|
||||||
votes = db.get_votes(channel)
|
votes = db.get_votes(channel)
|
||||||
await query.answer(f"💧 浇水成功!这个树枝已经被浇了 {votes} 次水~", show_alert=False)
|
await update.message.reply_text(f"💧 浇水成功!这个树枝已经被浇了 {votes} 次水~")
|
||||||
else:
|
else:
|
||||||
votes = db.get_votes(channel)
|
votes = db.get_votes(channel)
|
||||||
await query.answer(f"你已经浇过水了哦~ 这个树枝已经被浇了 {votes} 次水~", show_alert=False)
|
await update.message.reply_text(f"你已经浇过水了哦~ 这个树枝已经被浇了 {votes} 次水~")
|
||||||
|
|
||||||
|
|
||||||
async def treehole_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
async def handle_treehole(update: Update, user_id: int, channel: str):
|
||||||
"""Handle the 树洞 button press — initiate anonymous messaging."""
|
"""Handle the 树洞 action via deep-link."""
|
||||||
query = update.callback_query
|
logger.info(f"🕳️ Tree hole from {user_id} for {channel}")
|
||||||
data = query.data
|
|
||||||
|
|
||||||
if not data.startswith("th:"):
|
|
||||||
return
|
|
||||||
|
|
||||||
channel = data[3:]
|
|
||||||
user_id = query.from_user.id
|
|
||||||
|
|
||||||
logger.info(f"🕳️ Tree hole from {user_id} {query.from_user.username or ''} for {channel}")
|
|
||||||
|
|
||||||
# Check rate limit
|
# Check rate limit
|
||||||
last_time = treehole_rate_limit.get(user_id, 0)
|
last_time = treehole_rate_limit.get(user_id, 0)
|
||||||
if time.time() - last_time < TREEHOLE_COOLDOWN:
|
if time.time() - last_time < TREEHOLE_COOLDOWN:
|
||||||
remaining = int(TREEHOLE_COOLDOWN - (time.time() - last_time))
|
remaining = int(TREEHOLE_COOLDOWN - (time.time() - last_time))
|
||||||
return await query.answer(f"发送太频繁了,请 {remaining} 秒后再试~", show_alert=True)
|
return await update.message.reply_text(f"发送太频繁了,请 {remaining} 秒后再试~")
|
||||||
|
|
||||||
# Check if channel has an owner
|
# Check if channel has an owner
|
||||||
owner_id = db.get_channel_owner(channel)
|
owner_id = db.get_channel_owner(channel)
|
||||||
if not owner_id:
|
if not owner_id:
|
||||||
return await query.answer("这个频道还没有设置主人哦~", show_alert=False)
|
return await update.message.reply_text("这个频道还没有设置主人哦~")
|
||||||
|
|
||||||
# Try to DM the user
|
user_states[user_id] = {"action": "treehole", "channel": channel}
|
||||||
try:
|
await update.message.reply_text(f"🕳️ 树洞模式\n\n想对频道 @{channel} 的主人说什么呢?(发送文字消息即可,消息将会匿名发送)")
|
||||||
await context.bot.send_message(
|
|
||||||
chat_id=user_id,
|
|
||||||
text=f"🕳️ 树洞模式\n\n想对频道 @{channel} 的主人说什么呢?(发送文字消息即可,消息将会匿名发送)"
|
|
||||||
)
|
|
||||||
user_states[user_id] = {"action": "treehole", "channel": channel}
|
|
||||||
await query.answer("请查看 bot 的私聊~", show_alert=False)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Failed to send treehole message: {e}")
|
|
||||||
await query.answer("请先私聊 bot 发送 /start 才能使用树洞功能哦~", show_alert=True)
|
|
||||||
|
|
||||||
|
|
||||||
async def reply_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
async def reply_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||||
@@ -406,8 +393,6 @@ bot.add_handler(CommandHandler("init", init))
|
|||||||
bot.add_handler(CommandHandler("leaf", plant))
|
bot.add_handler(CommandHandler("leaf", plant))
|
||||||
bot.add_handler(CommandHandler("walkaway", walkaway))
|
bot.add_handler(CommandHandler("walkaway", walkaway))
|
||||||
bot.add_handler(CommandHandler("walkback", walkback))
|
bot.add_handler(CommandHandler("walkback", walkback))
|
||||||
bot.add_handler(CallbackQueryHandler(water_callback, pattern=r"^water:"))
|
|
||||||
bot.add_handler(CallbackQueryHandler(treehole_callback, pattern=r"^th:"))
|
|
||||||
bot.add_handler(CallbackQueryHandler(reply_callback, pattern=r"^reply:"))
|
bot.add_handler(CallbackQueryHandler(reply_callback, pattern=r"^reply:"))
|
||||||
bot.add_handler(CallbackQueryHandler(block_callback, pattern=r"^block:"))
|
bot.add_handler(CallbackQueryHandler(block_callback, pattern=r"^block:"))
|
||||||
bot.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
|
bot.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
|
||||||
|
|||||||
Reference in New Issue
Block a user