Implement NOTICE

This commit is contained in:
Les De Ridder 2017-03-20 05:35:26 +01:00
parent 4df3b43138
commit 4f8aedddc9
No known key found for this signature in database
GPG Key ID: 5EC132DFA85DB372
3 changed files with 51 additions and 1 deletions

View File

@ -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));
}
}
}

View File

@ -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));

View File

@ -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);