python ircd using asyncio
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

50 lines
1.7 KiB

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)