From 4f8aedddc988e2656dbba8866501b2d82b17b112 Mon Sep 17 00:00:00 2001 From: Les De Ridder Date: Mon, 20 Mar 2017 05:35:26 +0100 Subject: [PATCH] Implement NOTICE --- source/ircd/channel.d | 8 ++++++++ source/ircd/connection.d | 32 +++++++++++++++++++++++++++++++- source/ircd/server.d | 12 ++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/source/ircd/channel.d b/source/ircd/channel.d index 3aa891d..46b6092 100644 --- a/source/ircd/channel.d +++ b/source/ircd/channel.d @@ -45,4 +45,12 @@ class Channel member.send(Message(sender.mask, "PRIVMSG", [name, text], true)); } } + + void sendNotice(Connection sender, string text) + { + foreach(member; members.filter!(m => m.nick != sender.nick)) + { + member.send(Message(sender.mask, "NOTICE", [name, text], true)); + } + } } diff --git a/source/ircd/connection.d b/source/ircd/connection.d index 0c169da..0051e52 100644 --- a/source/ircd/connection.d +++ b/source/ircd/connection.d @@ -137,6 +137,10 @@ class Connection if(!registered) sendErrNotRegistered(); else onPrivMsg(message); break; + case "NOTICE": + if(!registered) sendErrNotRegistered(); + else onNotice(message); + break; case "WHO": if(!registered) sendErrNotRegistered(); else onWho(message); @@ -332,6 +336,32 @@ class Connection } } + void onNotice(Message message) + { + //TODO: Support special message targets + auto target = message.parameters[0]; + auto text = message.parameters[1]; + + //TODO: Figure out what we are allowed to send exactly + + if(message.parameters.length < 2) + { + return; + } + + if(Server.isValidChannelName(target)) + { + if(_server.channels.canFind!(c => c.name == target)) + { + _server.noticeToChannel(this, target, text); + } + } + else if(Server.isValidNick(target) && _server.connections.canFind!(c => c.nick == target)) + { + _server.noticeToUser(this, target, text); + } + } + void onWho(Message message) { if(message.parameters.length == 0) @@ -377,7 +407,7 @@ class Connection void sendWhoReply(string channel, Connection user, uint hopCount) { auto flags = user.modes.canFind('a') ? "G" : "H"; - if(user.isOperator) flags ~= "*"; + if(user.isOperator) flags ~= "*"; //TODO: Add channel prefix send(Message(_server.name, "352", [nick, channel, user.user, user.hostname, user.servername, user.nick, flags, hopCount.to!string ~ " " ~ user.realname], true)); diff --git a/source/ircd/server.d b/source/ircd/server.d index 20bb7cd..ce3093d 100644 --- a/source/ircd/server.d +++ b/source/ircd/server.d @@ -182,6 +182,18 @@ class Server user.send(Message(sender.mask, "PRIVMSG", [target, text], true)); } + void noticeToChannel(Connection sender, string target, string text) + { + auto channel = channels.find!(c => c.name == target)[0]; + channel.sendNotice(sender, text); + } + + void noticeToUser(Connection sender, string target, string text) + { + auto user = connections.find!(c => c.nick == target)[0]; + user.send(Message(sender.mask, "NOTICE", [target, text], true)); + } + void listen(ushort port = 6667) { listenTCP(port, &acceptConnection);