mirror of
https://github.com/agessaman/meshcore-bot.git
synced 2026-10-31 01:52:38 +00:00
A codex review of the branch found seven places where earlier refactor commits changed behavior. Each is restored here with a test: - base_service imported flood_scope relatively; the local-service loader also runs that file as local_services.base_service, where the import cannot resolve. Now absolute. - Radio-health fields were initialized after commands and services were built, so a plugin constructor reading is_radio_offline raised. They are now set before any plugin. - Removing the per-command can_execute overrides made 31 commands honor skip_channel_check, which their overrides had dropped. BaseCommand.honors_skip_channel_check (False on exactly those commands) keeps them enforcing their channel list. - CommandManager.get_plugin_metadata, WxCommand.get_weather_for_zipcode and PluginLoader.validate_plugin were public compatibility entry points; they are back. - feed_manager stopped exporting DEFAULT_MAX_FEED_RESPONSE_BYTES and DEFAULT_MAX_PARSED_FEED_ITEMS despite the commit saying it re-exported them; it does now. - wx and gwx logged companion-location lookup failures at WARNING; the shared helper logged at debug. It now takes the level. - The INFO 'MESSAGE ROUTING' / 'DIRECT MESSAGE' lines for pubkey-correlated DMs were removed with the dead path_info computation; they are logged again by a log-only helper.
90 lines
3.0 KiB
Python
90 lines
3.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Magic 8-ball command for the MeshCore Bot
|
|
Handles the 'magic8' keyword response
|
|
"""
|
|
import random
|
|
from typing import Optional
|
|
|
|
from ..models import MeshMessage
|
|
from .base_command import BaseCommand
|
|
|
|
magic8_responses = ["It is certain.","It is decidedly so.","Without a doubt.","Yes definitely.","You may rely on it.","As I see it, yes.","Most likely.","Outlook good.","Yes.","Signs point to yes.","Reply hazy, try again.","Ask again later.","Better not tell you now.","Cannot predict now.","Concentrate and ask again.","Don't count on it.","My reply is no.","My sources say no.","Outlook not so good.","Very doubtful."]
|
|
|
|
def magic8():
|
|
answer=magic8_responses[random.randint(0,len(magic8_responses)-1)]
|
|
return answer
|
|
|
|
|
|
class Magic8Command(BaseCommand):
|
|
"""Handles the magic8 command.
|
|
|
|
Emulates a Magic 8-Ball, providing a random "fortune" response to a user's question.
|
|
"""
|
|
|
|
# Plugin metadata
|
|
# Read-only informational output; safe for scheduled {cmd:...} rendering.
|
|
render_safe = True
|
|
name = "magic8"
|
|
honors_skip_channel_check = False
|
|
enabled_attr = "magic8_enabled"
|
|
keywords = ['magic8']
|
|
description = "Emulates the classic Magic 8-ball toy'"
|
|
category = "games"
|
|
|
|
# Documentation
|
|
short_description = "Ask the Magic 8-Ball a yes/no question"
|
|
usage = "magic8 <question>"
|
|
examples = ["magic8 Will it rain tomorrow?"]
|
|
|
|
def __init__(self, bot):
|
|
"""Initialize the magic8 command.
|
|
|
|
Args:
|
|
bot: The bot instance.
|
|
"""
|
|
super().__init__(bot)
|
|
self.magic8_enabled = self.get_config_value('Magic8_Command', 'enabled', fallback=True, value_type='bool')
|
|
|
|
def get_help_text(self) -> str:
|
|
"""Get help text for the magic8 command.
|
|
|
|
Returns:
|
|
str: The help text for this command.
|
|
"""
|
|
return self.translate('commands.magic8.description')
|
|
|
|
def get_response_format(self) -> Optional[str]:
|
|
"""Get the response format from config.
|
|
|
|
Returns:
|
|
Optional[str]: The format string for the response, or None if not configured.
|
|
"""
|
|
if self.bot.config.has_section('Keywords'):
|
|
format_str = self.bot.config.get('Keywords', 'magic8', fallback=None)
|
|
return self._strip_quotes_from_config(format_str) if format_str else None
|
|
return None
|
|
|
|
async def execute(self, message: MeshMessage) -> bool:
|
|
"""Execute the magic8 command.
|
|
|
|
Selects a random response and sends it to the user.
|
|
|
|
Args:
|
|
message: The message that triggered the command.
|
|
|
|
Returns:
|
|
bool: True if executed successfully, False otherwise.
|
|
"""
|
|
answer = magic8()
|
|
|
|
# Format response with sender mention for channel messages, without for DMs
|
|
if message.is_dm:
|
|
response = f"🎱 {answer}"
|
|
else:
|
|
sender = message.sender_id or "Unknown"
|
|
response = f"🎱 @[{sender}] {answer}"
|
|
|
|
return await self.send_response(message, response)
|
|
|