Refactor channel management and give +o on creation

This commit is contained in:
Les De Ridder 2017-04-30 21:05:41 +02:00
parent 0bd65fd449
commit 3c43cfa64b
No known key found for this signature in database
GPG Key ID: 5EC132DFA85DB372
3 changed files with 43 additions and 10 deletions

View File

@ -10,24 +10,32 @@ import ircd.message;
class Channel class Channel
{ {
string name; string name;
Connection[] members;
Connection owner;
string topic = ""; string topic = "";
Connection[] members;
char[] modes; char[] modes;
char[][Connection] memberModes;
private Server _server; private Server _server;
this(string name, Connection owner, Server server) this(string name, Server server)
{ {
this.name = name; this.name = name;
this.owner = owner; this.members = [];
this.members = [owner];
this._server = server; this._server = server;
} }
void join(Connection connection)
{
members ~= connection;
memberModes[connection] = null;
if(members.length == 1)
{
memberModes[connection] ~= 'o';
}
}
void sendNames(Connection connection, bool sendRplEndOfNames = true) void sendNames(Connection connection, bool sendRplEndOfNames = true)
{ {
string channelType; string channelType;
@ -47,7 +55,7 @@ class Channel
auto onChannel = members.canFind(connection); auto onChannel = members.canFind(connection);
connection.send(Message(_server.name, "353", [connection.nick, channelType, name, members.filter!(m => onChannel || !m.modes.canFind('i')).map!(m => m.nick).join(' ')], true)); connection.send(Message(_server.name, "353", [connection.nick, channelType, name, members.filter!(m => onChannel || !m.modes.canFind('i')).map!(m => prefixedNick(m)).join(' ')], true));
if(sendRplEndOfNames) if(sendRplEndOfNames)
{ {
@ -55,6 +63,16 @@ class Channel
} }
} }
string prefixedNick(Connection member)
{
if(memberModes[member].canFind('o'))
{
return '@' ~ member.nick;
}
return member.nick;
}
void sendPrivMsg(Connection sender, string text) void sendPrivMsg(Connection sender, string text)
{ {
foreach(member; members.filter!(m => m.nick != sender.nick)) foreach(member; members.filter!(m => m.nick != sender.nick))

View File

@ -60,6 +60,21 @@ class Connection
return 0; return 0;
} }
override bool opEquals(Object o)
{
Connection other;
if((other = cast(Connection)o) !is null)
{
return nick == other.nick;
}
return false;
}
override ulong toHash()
{
return typeid(nick).getHash(&nick);
}
bool visibleTo(Connection other) bool visibleTo(Connection other)
{ {
return !modes.canFind('i') || channels.any!(c => c.members.canFind(other)); return !modes.canFind('i') || channels.any!(c => c.members.canFind(other));

View File

@ -130,14 +130,14 @@ class Server
Channel channel; Channel channel;
if(channelRange.empty) if(channelRange.empty)
{ {
channel = new Channel(channelName, connection, this); channel = new Channel(channelName, this);
channels ~= channel; channels ~= channel;
} }
else else
{ {
channel = channelRange[0]; channel = channelRange[0];
channel.members ~= connection;
} }
channel.join(connection);
foreach(member; channel.members) foreach(member; channel.members)
{ {