SYMBOL INDEX (273 symbols across 16 files) FILE: cogs/chat.py class Chat (line 29) | class Chat(commands.Cog): method __init__ (line 30) | def __init__(self, bot: commands.Bot): method cog_unload (line 39) | def cog_unload(self): method load_config (line 42) | def load_config(self): method _prune_cooldowns (line 54) | async def _prune_cooldowns(self): method setup_database (line 60) | async def setup_database(self): method _table_columns (line 100) | async def _table_columns(self, cursor, table_name: str) -> List[str]: method session (line 105) | def session(self): method _context_key (line 108) | def _context_key(self, interaction: discord.Interaction) -> Tuple[Any,... method _serialize_ids (line 113) | def _serialize_ids(self, ids: List[int]) -> Optional[str]: method _deserialize_ids (line 117) | def _deserialize_ids(self, raw: Optional[str]) -> List[int]: method get_guild_config (line 126) | async def get_guild_config(self, guild_id: Optional[int]): method set_guild_key (line 133) | async def set_guild_key(self, guild_id: int, key: Optional[str] = None): method set_guild_persona (line 139) | async def set_guild_persona(self, guild_id: int, persona: Optional[str... method get_policy (line 145) | async def get_policy(self, guild_id: Optional[int]) -> Dict[str, Any]: method update_policy (line 184) | async def update_policy(self, guild_id: int, **fields): method mutate_id_list (line 191) | async def mutate_id_list(self, guild_id: int, field: str, value: int, ... method get_usage_count (line 201) | async def get_usage_count(self, guild_id: int) -> int: method increment_usage (line 211) | async def increment_usage(self, guild_id: int): method validate_api_key (line 225) | async def validate_api_key(self, api_key: str) -> Tuple[bool, str]: method enforce_policy (line 241) | async def enforce_policy(self, interaction: discord.Interaction, polic... method define_tools (line 275) | def define_tools(self): method execute_google_search (line 291) | async def execute_google_search(self, query: str): method model_autocomplete (line 308) | async def model_autocomplete(self, interaction: discord.Interaction, c... method _channel_labels (line 316) | def _channel_labels(self, guild: discord.Guild, ids: List[int]) -> str: method _role_labels (line 325) | def _role_labels(self, guild: discord.Guild, ids: List[int]) -> str: method _truncate_field_value (line 334) | def _truncate_field_value(self, value: str, limit: int = MAX_EMBED_FIE... method _trim_history (line 339) | def _trim_history(self, messages: List[Dict[str, Any]]) -> List[Dict[s... method _prune_runtime_state (line 344) | def _prune_runtime_state(self) -> None: method _set_conversation_state (line 359) | def _set_conversation_state(self, context_key: Tuple[Any, ...], messag... method set_key (line 376) | async def set_key(self, interaction: discord.Interaction, key: str): method set_persona (line 395) | async def set_persona(self, interaction: discord.Interaction, persona:... method set_enabled (line 408) | async def set_enabled(self, interaction: discord.Interaction, enabled:... method set_cooldown (line 416) | async def set_cooldown(self, interaction: discord.Interaction, seconds... method set_usage_cap (line 423) | async def set_usage_cap(self, interaction: discord.Interaction, limit:... method allow_channel (line 431) | async def allow_channel(self, interaction: discord.Interaction, channe... method block_channel (line 440) | async def block_channel(self, interaction: discord.Interaction, channe... method clear_channel_rules (line 449) | async def clear_channel_rules(self, interaction: discord.Interaction): method allow_role (line 455) | async def allow_role(self, interaction: discord.Interaction, role: dis... method remove_role (line 464) | async def remove_role(self, interaction: discord.Interaction, role: di... method clear_role_rules (line 473) | async def clear_role_rules(self, interaction: discord.Interaction): method view_config (line 479) | async def view_config(self, interaction: discord.Interaction): method test_config (line 532) | async def test_config(self, interaction: discord.Interaction): method list_models (line 549) | async def list_models(self, interaction: discord.Interaction): method chat (line 566) | async def chat(self, interaction: discord.Interaction, prompt: str, mo... method chat_reset (line 680) | async def chat_reset(self, interaction: discord.Interaction): function setup (line 687) | async def setup(bot: commands.Bot): FILE: cogs/community.py function parse_duration (line 21) | def parse_duration(value: str) -> Optional[int]: class Community (line 31) | class Community(commands.Cog): method __init__ (line 32) | def __init__(self, bot: commands.Bot): method cog_unload (line 36) | def cog_unload(self): method setup_database (line 39) | async def setup_database(self): method get_settings (line 87) | async def get_settings(self, guild_id: int) -> Dict[str, Optional[int]]: method update_setting (line 122) | async def update_setting(self, guild_id: int, field: str, value): method validate_template (line 128) | def validate_template(self, template: str) -> Optional[str]: method render_template (line 141) | def render_template(self, template: Optional[str], member: discord.abc... method try_render_template (line 145) | def try_render_template( method schedule_retry_delay (line 153) | def schedule_retry_delay(self, failures: int) -> timedelta: method _resolve_channel (line 157) | async def _resolve_channel(self, channel_id: Optional[int]): method _send_to_channel (line 168) | async def _send_to_channel( method _log_to_modlog (line 187) | async def _log_to_modlog(self, guild: discord.Guild, title: str, descr... method _channel_value (line 196) | def _channel_value(self, channel_id: Optional[int]) -> str: method _schedule_announcement (line 199) | async def _schedule_announcement( method view (line 233) | async def view(self, interaction: discord.Interaction): method set_welcome_channel (line 258) | async def set_welcome_channel(self, interaction: discord.Interaction, ... method set_goodbye_channel (line 264) | async def set_goodbye_channel(self, interaction: discord.Interaction, ... method set_announcement_channel (line 270) | async def set_announcement_channel(self, interaction: discord.Interact... method set_modlog_channel (line 276) | async def set_modlog_channel(self, interaction: discord.Interaction, c... method set_welcome_message (line 283) | async def set_welcome_message(self, interaction: discord.Interaction, ... method set_goodbye_message (line 296) | async def set_goodbye_message(self, interaction: discord.Interaction, ... method preview_welcome (line 308) | async def preview_welcome(self, interaction: discord.Interaction): method preview_goodbye (line 323) | async def preview_goodbye(self, interaction: discord.Interaction): method reset_message (line 344) | async def reset_message(self, interaction: discord.Interaction, target... method reset_channel (line 358) | async def reset_channel(self, interaction: discord.Interaction, target... method announce (line 366) | async def announce(self, interaction: discord.Interaction, message: str): method schedule (line 415) | async def schedule( method list_scheduled (line 463) | async def list_scheduled(self, interaction: discord.Interaction): method diagnose_scheduled (line 496) | async def diagnose_scheduled(self, interaction: discord.Interaction, a... method cancel_scheduled (line 532) | async def cancel_scheduled(self, interaction: discord.Interaction, ann... method schedule_loop (line 546) | async def schedule_loop(self): method before_schedule_loop (line 629) | async def before_schedule_loop(self): method on_member_join (line 634) | async def on_member_join(self, member: discord.Member): method on_member_remove (line 656) | async def on_member_remove(self, member: discord.Member): method on_message_delete (line 678) | async def on_message_delete(self, message: discord.Message): function setup (line 696) | async def setup(bot: commands.Bot): FILE: cogs/economy.py class Economy (line 34) | class Economy(commands.Cog): method __init__ (line 35) | def __init__(self, bot: commands.Bot): method _guild_lock (line 40) | def _guild_lock(self, guild_id: int) -> asyncio.Lock: method setup_database (line 47) | async def setup_database(self): method _get_guild_id (line 91) | def _get_guild_id(self, interaction: discord.Interaction) -> int: method _get_or_create_user_unlocked (line 96) | async def _get_or_create_user_unlocked(self, guild_id: int, user_id: i... method get_or_create_user (line 112) | async def get_or_create_user(self, guild_id: int, user_id: int) -> int: method change_balance (line 116) | async def change_balance(self, guild_id: int, user_id: int, delta: int... method transfer_balance (line 131) | async def transfer_balance(self, guild_id: int, sender_id: int, receiv... method set_balance (line 150) | async def set_balance(self, guild_id: int, user_id: int, amount: int) ... method balance (line 168) | async def balance(self, interaction: discord.Interaction, member: disc... method daily (line 179) | async def daily(self, interaction: discord.Interaction): method daily_error (line 192) | async def daily_error(self, interaction: discord.Interaction, error: a... method jobs_freelance (line 204) | async def jobs_freelance(self, interaction: discord.Interaction): method freelance_error (line 217) | async def freelance_error(self, interaction: discord.Interaction, erro... method jobs_regular (line 226) | async def jobs_regular(self, interaction: discord.Interaction): method regular_work_error (line 239) | async def regular_work_error(self, interaction: discord.Interaction, e... method jobs_crime (line 248) | async def jobs_crime(self, interaction: discord.Interaction): method crime_error (line 266) | async def crime_error(self, interaction: discord.Interaction, error: a... method gamble (line 277) | async def gamble(self, interaction: discord.Interaction, amount: app_c... method leaderboard (line 301) | async def leaderboard(self, interaction: discord.Interaction): method transfer (line 337) | async def transfer( method rob (line 366) | async def rob(self, interaction: discord.Interaction, member: discord.... method rob_error (line 418) | async def rob_error(self, interaction: discord.Interaction, error: app... method slots (line 429) | async def slots(self, interaction: discord.Interaction, bet: app_comma... method admin_add (line 465) | async def admin_add(self, interaction: discord.Interaction, member: di... method admin_remove (line 476) | async def admin_remove( method admin_set (line 491) | async def admin_set(self, interaction: discord.Interaction, member: di... method admin_reset_guild (line 501) | async def admin_reset_guild(self, interaction: discord.Interaction): function setup (line 510) | async def setup(bot: commands.Bot): FILE: cogs/farming.py class Farming (line 20) | class Farming(commands.Cog): method __init__ (line 21) | def __init__(self, bot: commands.Bot): method setup_database (line 38) | async def setup_database(self): method get_farm_data (line 96) | async def get_farm_data(self, guild_id: int, user_id: int): method get_xp_for_next_level (line 109) | def get_xp_for_next_level(self, level: int): method profile (line 115) | async def profile(self, interaction: discord.Interaction): method shop (line 152) | async def shop(self, interaction: discord.Interaction): method plant (line 172) | async def plant(self, interaction: discord.Interaction, crop: str): method harvest (line 228) | async def harvest(self, interaction: discord.Interaction): method upgrade (line 300) | async def upgrade(self, interaction: discord.Interaction): function setup (line 343) | async def setup(bot: commands.Bot): FILE: cogs/fun.py class Fun (line 10) | class Fun(commands.Cog): method __init__ (line 11) | def __init__(self, bot: commands.Bot): method joke (line 103) | async def joke(self, interaction: discord.Interaction): method fact (line 111) | async def fact(self, interaction: discord.Interaction): method avatar (line 131) | async def avatar(self, interaction: discord.Interaction, member: disco... method love (line 140) | async def love(self, interaction: discord.Interaction, member1: discor... method emojify (line 159) | async def emojify(self, interaction: discord.Interaction, text: str): method poll (line 206) | async def poll( method clap (line 249) | async def clap(self, interaction: discord.Interaction, text: str): method tweet (line 259) | async def tweet(self, interaction: discord.Interaction, text: str): function setup (line 307) | async def setup(bot: commands.Bot): FILE: cogs/games.py class TicTacToeButton (line 8) | class TicTacToeButton(discord.ui.Button["TicTacToe"]): method __init__ (line 9) | def __init__(self, x: int, y: int): method callback (line 14) | async def callback(self, interaction: discord.Interaction): class TicTacToe (line 57) | class TicTacToe(discord.ui.View): method __init__ (line 62) | def __init__(self, player1: discord.Member, player2: discord.Member): method on_timeout (line 77) | async def on_timeout(self): method check_board_winner (line 83) | def check_board_winner(self): class Games (line 111) | class Games(commands.Cog): method __init__ (line 112) | def __init__(self, bot: commands.Bot): method eightball (line 119) | async def eightball(self, interaction: discord.Interaction, question: ... method coinflip (line 149) | async def coinflip(self, interaction: discord.Interaction): method roll (line 156) | async def roll(self, interaction: discord.Interaction, dice: str): method guess (line 177) | async def guess(self, interaction: discord.Interaction): method rockpaperscissors (line 223) | async def rockpaperscissors(self, interaction: discord.Interaction, ch... method tictactoe (line 245) | async def tictactoe(self, interaction: discord.Interaction, opponent: ... function setup (line 263) | async def setup(bot: commands.Bot): FILE: cogs/interactions.py class Interactions (line 6) | class Interactions(commands.Cog): method __init__ (line 7) | def __init__(self, bot: commands.Bot): method get_gif (line 11) | async def get_gif(self, category: str): method create_interaction_embed (line 21) | async def create_interaction_embed( method hug (line 53) | async def hug(self, interaction: discord.Interaction, member: discord.... method pat (line 65) | async def pat(self, interaction: discord.Interaction, member: discord.... method slap (line 77) | async def slap(self, interaction: discord.Interaction, member: discord... method kiss (line 93) | async def kiss(self, interaction: discord.Interaction, member: discord... method cuddle (line 105) | async def cuddle(self, interaction: discord.Interaction, member: disco... method poke (line 117) | async def poke(self, interaction: discord.Interaction, member: discord... function setup (line 127) | async def setup(bot: commands.Bot): FILE: cogs/media.py class Media (line 10) | class Media(commands.Cog): method __init__ (line 11) | def __init__(self, bot: commands.Bot): method meme (line 17) | async def meme(self, interaction: discord.Interaction): method cat (line 35) | async def cat(self, interaction: discord.Interaction): method dog (line 52) | async def dog(self, interaction: discord.Interaction): function setup (line 68) | async def setup(bot: commands.Bot): FILE: cogs/moderation.py class Moderation (line 15) | class Moderation(commands.Cog): method __init__ (line 16) | def __init__(self, bot: commands.Bot): method setup_database (line 20) | async def setup_database(self): method _serialize_ids (line 54) | def _serialize_ids(self, ids: List[int]) -> Optional[str]: method _deserialize_ids (line 58) | def _deserialize_ids(self, raw: Optional[str]) -> List[int]: method get_automod_settings (line 67) | async def get_automod_settings(self, guild_id: int) -> Dict[str, object]: method update_automod (line 97) | async def update_automod(self, guild_id: int, **fields): method mutate_whitelist (line 104) | async def mutate_whitelist(self, guild_id: int, channel_id: int, add: ... method add_warning (line 114) | async def add_warning(self, guild_id: int, user_id: int, moderator_id:... method log_action (line 127) | async def log_action(self, guild: discord.Guild, title: str, descripti... method automod_view (line 136) | async def automod_view(self, interaction: discord.Interaction): method automod_toggle_invites (line 150) | async def automod_toggle_invites(self, interaction: discord.Interactio... method automod_toggle_links (line 156) | async def automod_toggle_links(self, interaction: discord.Interaction,... method automod_set_action (line 169) | async def automod_set_action(self, interaction: discord.Interaction, a... method automod_set_bad_words (line 175) | async def automod_set_bad_words(self, interaction: discord.Interaction... method automod_clear_bad_words (line 183) | async def automod_clear_bad_words(self, interaction: discord.Interacti... method automod_whitelist_channel (line 189) | async def automod_whitelist_channel(self, interaction: discord.Interac... method automod_remove_whitelist_channel (line 198) | async def automod_remove_whitelist_channel(self, interaction: discord.... method warn (line 208) | async def warn(self, interaction: discord.Interaction, member: discord... method warnings (line 224) | async def warnings(self, interaction: discord.Interaction, member: dis... method clear_warning (line 256) | async def clear_warning(self, interaction: discord.Interaction, warnin... method handle_violation (line 276) | async def handle_violation(self, message: discord.Message, reason: str... method automod_listener (line 317) | async def automod_listener(self, message: discord.Message): function setup (line 352) | async def setup(bot: commands.Bot): FILE: cogs/utility.py function parse_duration_spec (line 22) | def parse_duration_spec(value: str) -> Optional[int]: class Utility (line 30) | class Utility(commands.Cog): method __init__ (line 31) | def __init__(self, bot: commands.Bot): method cog_unload (line 38) | def cog_unload(self): method setup_database (line 41) | async def setup_database(self): method get_afk_status (line 86) | async def get_afk_status(self, guild_id: int, user_id: int): method get_many_afk_statuses (line 100) | async def get_many_afk_statuses(self, guild_id: int, user_ids: list[in... method set_afk_status (line 133) | async def set_afk_status(self, guild_id: int, user_id: int, reason: str): method clear_afk_status (line 148) | async def clear_afk_status(self, guild_id: int, user_id: int): method list_user_reminders (line 157) | async def list_user_reminders(self, user_id: int): method reminder_retry_delay (line 170) | def reminder_retry_delay(self, failures: int) -> timedelta: method create_reminder (line 174) | async def create_reminder( method ping (line 200) | async def ping(self, interaction: discord.Interaction): method ping_raw (line 206) | async def ping_raw(self, interaction: discord.Interaction): method memberinfo (line 230) | async def memberinfo(self, interaction: discord.Interaction, member: d... method clear (line 264) | async def clear(self, interaction: discord.Interaction, amount: app_co... method serverinfo (line 279) | async def serverinfo(self, interaction: discord.Interaction): method botinfo (line 327) | async def botinfo(self, interaction: discord.Interaction): method uptime (line 351) | async def uptime(self, interaction: discord.Interaction): method _iter_commands (line 369) | def _iter_commands(self): method _get_full_command_name (line 377) | def _get_full_command_name(self, command: Union[app_commands.Command, ... method _command_support_label (line 385) | def _command_support_label(self, command: Union[app_commands.Command, ... method _command_permission_label (line 391) | def _command_permission_label(self, command: Union[app_commands.Comman... method command_autocomplete (line 402) | async def command_autocomplete( method help_all (line 413) | async def help_all(self, interaction: discord.Interaction): method _iter_group_commands (line 459) | def _iter_group_commands(self, group: app_commands.Group): method help_command (line 470) | async def help_command(self, interaction: discord.Interaction, command... method remindme (line 504) | async def remindme(self, interaction: discord.Interaction, time: str, ... method reminders_recurring (line 540) | async def reminders_recurring(self, interaction: discord.Interaction, ... method reminders_list (line 574) | async def reminders_list(self, interaction: discord.Interaction): method reminders_cancel (line 601) | async def reminders_cancel(self, interaction: discord.Interaction, rem... method reminders_snooze (line 617) | async def reminders_snooze(self, interaction: discord.Interaction, rem... method reminders_clear (line 646) | async def reminders_clear(self, interaction: discord.Interaction): method afk (line 656) | async def afk(self, interaction: discord.Interaction, reason: str = "A... method afk_clear (line 662) | async def afk_clear(self, interaction: discord.Interaction): method afk_message_listener (line 667) | async def afk_message_listener(self, message: discord.Message): method reminder_loop (line 708) | async def reminder_loop(self): method before_reminder_loop (line 805) | async def before_reminder_loop(self): function setup (line 810) | async def setup(bot: commands.Bot): FILE: config_loader.py function _load_file_config (line 15) | def _load_file_config() -> dict[str, Any]: function _get_bool (line 23) | def _get_bool(name: str, default: bool, file_config: dict[str, Any]) -> ... function _get_list (line 37) | def _get_list(name: str, default: list[str], file_config: dict[str, Any]... function load_runtime_config (line 51) | def load_runtime_config() -> dict[str, Any]: FILE: main.py function _find_local_venv_python (line 11) | def _find_local_venv_python() -> Optional[Path]: function _maybe_reexec_into_local_venv (line 20) | def _maybe_reexec_into_local_venv() -> None: class FunBot (line 79) | class FunBot(commands.Bot): method __init__ (line 80) | def __init__(self, runtime_config: dict): method setup_hook (line 90) | async def setup_hook(self): method on_ready (line 134) | async def on_ready(self): method _flush_message_logs (line 139) | async def _flush_message_logs(self, batch: list[tuple[int, int, int, s... method _message_log_worker (line 149) | async def _message_log_worker(self) -> None: method on_message (line 181) | async def on_message(self, message: discord.Message): method close (line 231) | async def close(self): method _prune_message_logs_task (line 247) | async def _prune_message_logs_task(self): method _before_prune_message_logs (line 256) | async def _before_prune_message_logs(self): function on_app_command_error (line 264) | async def on_app_command_error(interaction: discord.Interaction, error: ... FILE: tests/test_config_loader.py function test_load_runtime_config_prefers_env_over_file (line 6) | def test_load_runtime_config_prefers_env_over_file(monkeypatch, tmp_path): function test_load_runtime_config_falls_back_to_config_json (line 30) | def test_load_runtime_config_falls_back_to_config_json(monkeypatch, tmp_... FILE: tests/test_duration_parsing.py function test_parse_duration_spec_supports_seconds_minutes_hours_days (line 5) | def test_parse_duration_spec_supports_seconds_minutes_hours_days(): function test_parse_duration_spec_rejects_invalid_values (line 12) | def test_parse_duration_spec_rejects_invalid_values(): function test_parse_duration_supports_minutes_hours_days (line 18) | def test_parse_duration_supports_minutes_hours_days(): function test_parse_duration_rejects_invalid_values (line 24) | def test_parse_duration_rejects_invalid_values(): FILE: tests/test_issue_fixes.py class FakeCursor (line 14) | class FakeCursor: method __init__ (line 15) | def __init__(self, rows=None): method __aenter__ (line 19) | async def __aenter__(self): method __aexit__ (line 22) | async def __aexit__(self, exc_type, exc, tb): method execute (line 25) | async def execute(self, query, params=()): method fetchall (line 28) | async def fetchall(self): class FakeDB (line 32) | class FakeDB: method __init__ (line 33) | def __init__(self, rows=None): method cursor (line 38) | def cursor(self): method commit (line 43) | async def commit(self): function test_afk_listener_deduplicates_repeated_mentions (line 48) | async def test_afk_listener_deduplicates_repeated_mentions(): function test_reminder_loop_queries_due_work_in_bounded_batches (line 75) | async def test_reminder_loop_queries_due_work_in_bounded_batches(): function test_schedule_loop_queries_due_work_in_bounded_batches (line 86) | async def test_schedule_loop_queries_due_work_in_bounded_batches(): function test_chat_prune_cooldowns_removes_only_expired_entries (line 97) | async def test_chat_prune_cooldowns_removes_only_expired_entries(): function test_economy_guild_lock_is_scoped_per_guild (line 113) | def test_economy_guild_lock_is_scoped_per_guild(): FILE: tests/test_retry_delays.py function test_reminder_retry_delay_grows_and_caps (line 7) | def test_reminder_retry_delay_grows_and_caps(): function test_schedule_retry_delay_grows_and_caps (line 16) | def test_schedule_retry_delay_grows_and_caps():