mirror of
https://github.com/deavminet/dnetd
synced 2024-09-21 09:43:37 +02:00
Leave all channels you were a member of on socket read error (caused by disconnect)
This commit is contained in:
parent
e12688c38a
commit
5983f090e3
@ -102,6 +102,30 @@ public class DChannel
|
|||||||
return memberCount;
|
return memberCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool isMember(DConnection client)
|
||||||
|
{
|
||||||
|
/* Whether or not you are a member */
|
||||||
|
bool isMem;
|
||||||
|
|
||||||
|
/* Lock the members list */
|
||||||
|
memberLock.lock();
|
||||||
|
|
||||||
|
/* CHeck if you are in this channel */
|
||||||
|
foreach(DConnection member; members)
|
||||||
|
{
|
||||||
|
if(member is client)
|
||||||
|
{
|
||||||
|
isMem = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unlock the members list */
|
||||||
|
memberLock.unlock();
|
||||||
|
|
||||||
|
return isMem;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the given client from this channel
|
* Removes the given client from this channel
|
||||||
*/
|
*/
|
||||||
@ -125,6 +149,8 @@ public class DChannel
|
|||||||
/* Set it as the new list */
|
/* Set it as the new list */
|
||||||
members = newMembers;
|
members = newMembers;
|
||||||
|
|
||||||
|
/* TODO: Send left message here */
|
||||||
|
|
||||||
/* Unlock the members list */
|
/* Unlock the members list */
|
||||||
memberLock.unlock();
|
memberLock.unlock();
|
||||||
}
|
}
|
||||||
@ -132,9 +158,12 @@ public class DChannel
|
|||||||
public bool sendMessage(DConnection sender, string message)
|
public bool sendMessage(DConnection sender, string message)
|
||||||
{
|
{
|
||||||
bool status;
|
bool status;
|
||||||
/* TODO: Generate message */
|
|
||||||
/* TODO: Spec out in protocol */
|
/* The protocol data to send */
|
||||||
/* TODO: Reserved tag 0 for notifications */
|
byte[] msg;
|
||||||
|
|
||||||
|
/* Set the notificaiton type */
|
||||||
|
msg ~= [0];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Format
|
* Format
|
||||||
@ -143,7 +172,7 @@ public class DChannel
|
|||||||
* byte length of name of channel/person (dm case)
|
* byte length of name of channel/person (dm case)
|
||||||
* message-bytes
|
* message-bytes
|
||||||
*/
|
*/
|
||||||
byte[] msg = [cast(byte)1,(cast(byte)sender.getUsername().length)]~cast(byte[])sender.getUsername()~cast(byte[])message;
|
msg ~= [cast(byte)1,(cast(byte)sender.getUsername().length)]~cast(byte[])sender.getUsername()~cast(byte[])message;
|
||||||
|
|
||||||
/* Send the message to everyone else in the channel */
|
/* Send the message to everyone else in the channel */
|
||||||
foreach(DConnection member; members)
|
foreach(DConnection member; members)
|
||||||
@ -152,9 +181,9 @@ public class DChannel
|
|||||||
if(!(member is sender))
|
if(!(member is sender))
|
||||||
{
|
{
|
||||||
/* Send the message */
|
/* Send the message */
|
||||||
writeln("Delivering message for channel '"~name~"' to user '"~member.getUsername()~"'...");
|
writeln("Delivering message '"~message~"' for channel '"~name~"' to user '"~member.getUsername()~"'...");
|
||||||
status = member.writeSocket(0, msg);
|
status = member.writeSocket(0, msg);
|
||||||
writeln("Delivered message for channel '"~name~"' to user '"~member.getUsername()~"'!");
|
writeln("Delivered message '"~message~"' for channel '"~name~"' to user '"~member.getUsername()~"'!");
|
||||||
|
|
||||||
/* TODO: Errors from status */
|
/* TODO: Errors from status */
|
||||||
}
|
}
|
||||||
|
@ -125,8 +125,36 @@ public class DConnection : Thread
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* TODO: Error handling */
|
/* TODO: Error handling */
|
||||||
|
writeln("Error with receive: "~to!(string)(this));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Clean up */
|
||||||
|
cleanUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cleanUp()
|
||||||
|
{
|
||||||
|
writeln(to!(string)(this)~" Cleaning up connection...");
|
||||||
|
|
||||||
|
/* Remove this user from all channels he is in */
|
||||||
|
DChannel[] channels = server.getChannels();
|
||||||
|
|
||||||
|
/* Loop through each channel */
|
||||||
|
foreach(DChannel currentChannel; channels)
|
||||||
|
{
|
||||||
|
/* Check if you are a member of it */
|
||||||
|
if(currentChannel.isMember(this))
|
||||||
|
{
|
||||||
|
/* Leave the channel */
|
||||||
|
currentChannel.leave(this);
|
||||||
|
writeln(to!(string)(this)~" Leaving '"~currentChannel.getName()~"'...");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove this user from the connection queue */
|
||||||
|
/* TODO: Implement me */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: add mutex for writing with message and funciton for doing so */
|
/* TODO: add mutex for writing with message and funciton for doing so */
|
||||||
@ -482,7 +510,12 @@ public class DConnection : Thread
|
|||||||
|
|
||||||
public override string toString()
|
public override string toString()
|
||||||
{
|
{
|
||||||
string toStr = "["~to!(string)(connType)~"]: ";
|
string toStr = "["~to!(string)(connType)~" (";
|
||||||
|
toStr ~= socket.remoteAddress.toString();
|
||||||
|
|
||||||
|
|
||||||
|
toStr ~= ")]: ";
|
||||||
|
|
||||||
|
|
||||||
if(connType == ConnectionType.CLIENT)
|
if(connType == ConnectionType.CLIENT)
|
||||||
{
|
{
|
||||||
|
@ -17,6 +17,7 @@ import dnetd.dchannel;
|
|||||||
import std.string : cmp;
|
import std.string : cmp;
|
||||||
import core.sync.mutex : Mutex;
|
import core.sync.mutex : Mutex;
|
||||||
import std.stdio;
|
import std.stdio;
|
||||||
|
import std.conv : to;
|
||||||
|
|
||||||
public class DServer : Thread
|
public class DServer : Thread
|
||||||
{
|
{
|
||||||
@ -121,6 +122,7 @@ public class DServer : Thread
|
|||||||
|
|
||||||
/* Add to the connection queue */
|
/* Add to the connection queue */
|
||||||
connectionQueue ~= connection;
|
connectionQueue ~= connection;
|
||||||
|
writeln("Added new connection to queue "~to!(string)(connection));
|
||||||
|
|
||||||
/* Unlock the connections list */
|
/* Unlock the connections list */
|
||||||
connectionLock.unlock();
|
connectionLock.unlock();
|
||||||
|
Loading…
Reference in New Issue
Block a user