-
Notifications
You must be signed in to change notification settings - Fork 0
/
Room.cs
182 lines (140 loc) · 5.44 KB
/
Room.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
namespace wssserver
{
using System.Collections.Generic;
using System.Collections.Concurrent;
using Fleck;
using System.Linq;
using System.Text.Json;
using System;
using System.Text;
public class Room
{
readonly string roomId;
readonly string path;
ConcurrentDictionary<IWebSocketConnection, Client> clients = new ConcurrentDictionary<IWebSocketConnection, Client> ();
ConcurrentQueue <IOutboundMessage> history = new ConcurrentQueue<IOutboundMessage>();
public string RoomId => roomId;
public string Path => path;
protected DateTime lastHistoryModificationTime;
protected DateTime lastHistoryBackupTime;
protected System.Timers.Timer timer;
public Room(string roomId, string path)
{
this.roomId = roomId;
this.path = path;
lastHistoryModificationTime = DateTime.Now;
lastHistoryBackupTime = lastHistoryModificationTime;
timer = new System.Timers.Timer();
timer.Elapsed += new System.Timers.ElapsedEventHandler(BackupHistory);
timer.Interval = 5000;
timer.Enabled = true;
}
public void BackupHistory(Object source, System.Timers.ElapsedEventArgs e)
{
if ( lastHistoryBackupTime < lastHistoryModificationTime )
{
DateTime backupTime = DateTime.Now;
System.IO.Directory.CreateDirectory("backup");
//string historyJson = JsonSerializer.Serialize(history.ToArray());
System.IO.File.WriteAllText("backup/" + RoomId + "_" + backupTime.ToString(), getHistoryMessage());
lastHistoryBackupTime = backupTime;
}
}
public void setUser(IWebSocketConnection socketConnection, string user)
{
clients[socketConnection].User = new User(user);
}
public void addClient(IWebSocketConnection socket)
{
clients.TryAdd(socket, new Client(socket));
}
public List<string> getUser()
{
List<string> User = new List<string>();
foreach (KeyValuePair<IWebSocketConnection, Client> client in clients)
{
string currentUserName = client.Value?.User?.getUsername();
User.Add((currentUserName == null ? "[unknown]" : currentUserName));
}
return User;
}
public string getUserNameFromSender(IWebSocketConnection sender)
{
string userName = clients[sender]?.User?.getUsername();
if ( string.IsNullOrEmpty(userName) )
{
userName = "[unknown]";
}
Console.WriteLine("getUserNameFromSender" + userName);
return userName;
}
public string getUserMessage()
{
string userMessage = "";
List<string> user = getUser();
if ( user.Count > 0 )
{
userMessage = "\"" + string.Join("\",\"",user) + "\"";
}
userMessage = "{\"type\":\"UserList\",\"userlist\":[" + userMessage + "]}";
return userMessage;
}
public string getHistoryMessage()
{
var tempHistoryMessages = new List<string>();
string historyMessageContent = "";
foreach(var msg in history)
{
string messagecontent = msg?.getOutboundMessageAsJson();
if ( !string.IsNullOrEmpty(messagecontent))
{
tempHistoryMessages.Add(messagecontent);
}
}
if ( tempHistoryMessages.Count > 0 )
{
historyMessageContent = string.Join(',',tempHistoryMessages);
}
string historyMessage = "{ \"type\":\"History\", \"history\": [ " + historyMessageContent + " ] }";
return historyMessage;
}
public void processMessage(string message, IWebSocketConnection socket)
{
OLDMessage receivedMessage = JsonSerializer.Deserialize<OLDMessage>(message);
if ( receivedMessage.type == "GetUser" )
{
socket.Send( getUserMessage() );
}
else if ( receivedMessage.type == "ChatMessage" || receivedMessage.type == "GetHistory" ||
receivedMessage.type == "AddStickyNote" || receivedMessage.type == "User" )
{
IMessage msg = MessageFactory.createMessageFromString(message,this,socket);
msg.processInbound();
msg.processOutbound();
}
else
{
broadCastMessage(message);
}
}
public void broadCastMessage(string message)
{
lastHistoryModificationTime = DateTime.Now;
history.Enqueue(new RawMessage(message));
clients.ToList().ForEach(s => s.Value?.sendMessage(message));
}
public void deleteClient(IWebSocketConnection socket)
{
Client client;
clients.TryRemove(socket,out client);
client?.closeClient();
}
public void closeRoom()
{
foreach( var client in clients.Keys )
{
deleteClient(client);
}
}
}
}