Files

79 lines
2.4 KiB
Python

"""LangChain tools for the Discord bot."""
from __future__ import annotations
import logging
from typing import Any
from langchain_core.tools import tool
logger = logging.getLogger(__name__)
def _format_member(member: Any) -> str:
"""Format a single member for display."""
raw_display = getattr(member, "display_name", None)
raw_name = getattr(member, "name", "Unknown")
display_name = str(raw_display) if raw_display else str(raw_name)
parts: list[str] = [display_name]
nick = getattr(member, "nick", None)
if nick and nick != display_name:
parts.append(f"(nickname: {nick})")
global_name = getattr(member, "global_name", None)
if global_name and global_name != getattr(member, "name", ""):
parts.append(f"(global name: {global_name})")
status = getattr(member, "status", None)
if status:
parts.append(f"[{status.value}]")
return " ".join(parts)
def get_channel_members_impl(channel: Any) -> str:
"""Get a list of all members in the Discord channel the bot is part of.
Use this tool when asked about who is in the channel, who the members are,
or to get a roster of people present in the current channel.
Returns:
A formatted string listing all members in the channel with their usernames,
display names, and nicknames.
"""
try:
members = getattr(channel.guild, "members", None)
if not members:
return "No members found in this channel."
lines: list[str] = [f"Members in this channel ({len(members)} total):"]
for member in sorted(
members,
key=lambda m: (
getattr(m, "display_name", "") or getattr(m, "name", "")
).lower(),
):
lines.append(f"- {_format_member(member)}")
return "\n".join(lines)
except Exception:
logger.exception("Error fetching channel members")
return "Failed to retrieve channel members."
@tool
def get_channel_members() -> str:
"""Get a list of all members in the Discord channel the bot is part of.
Use this tool when asked about who is in the channel, who the members are,
or to get a roster of people present in the current channel.
Returns:
A formatted string listing all members in the channel with their usernames,
display names, and nicknames.
"""
return "No channel provided."