from paircd.client import Client
|
|
from paircd.command_handler import CommandHandler
|
|
from paircd.message import Message
|
|
from paircd.reply import (
|
|
ERR_CHANOPRIVSNEEDED,
|
|
ERR_NEEDMOREPARAMS,
|
|
ERR_NOTONCHANNEL,
|
|
RPL_NOTOPIC,
|
|
RPL_TOPIC,
|
|
TOPIC,
|
|
)
|
|
from paircd.server import Server
|
|
|
|
|
|
class TopicHandler(CommandHandler):
|
|
def __init__(self) -> None:
|
|
super().__init__("TOPIC")
|
|
|
|
async def handle(self, server: Server, client: Client, msg: Message) -> None:
|
|
if len(msg.args) == 0:
|
|
client.write_message(ERR_NEEDMOREPARAMS(client.nickname, "TOPIC"))
|
|
return
|
|
|
|
channel_name = msg.args[0]
|
|
channel = server.get_channel_by_name(channel_name, create=False)
|
|
if channel is None or client.nickname not in channel.clients_by_nick:
|
|
client.write_message(ERR_NOTONCHANNEL(client.nickname, channel_name))
|
|
return
|
|
|
|
topic_set = False
|
|
if len(msg.args) == 2:
|
|
user_modes = channel.get_user_modes_by_nick(client.nickname)
|
|
if "t" in channel.get_modes() and "o" not in user_modes:
|
|
client.write_message(
|
|
ERR_CHANOPRIVSNEEDED(client.nickname, channel_name)
|
|
)
|
|
return
|
|
channel.topic = msg.args[1]
|
|
topic_set = True
|
|
|
|
if topic_set:
|
|
client.log(f"updated topic for {channel_name}")
|
|
channel.write_message(
|
|
TOPIC(channel_name, channel.topic, prefix=client.id())
|
|
)
|
|
else:
|
|
topic_msg = RPL_TOPIC(client.nickname, channel_name, channel.topic)
|
|
if len(channel.topic) == 0:
|
|
topic_msg = RPL_NOTOPIC(client.nickname, channel_name)
|
|
client.write_message(topic_msg)
|