-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathChatManager.cs
128 lines (113 loc) · 3.97 KB
/
ChatManager.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
using System;
using System.Collections.Generic;
using System.Threading;
using PluginSDK;
namespace ChatModule
{
public class ChatManager
{
public IList<IChatUser> ChatUsers { get; private set; }
public IChatUser MainUser { get; private set; }
public Queue<ChatSourceMessage> NewMessages { get; private set; }
private SortedList<string, IChatSource> chatSources;
public ChatManager()
{
ChatUsers = new List<IChatUser>();
NewMessages = new Queue<ChatSourceMessage>();
chatSources = new SortedList<string, IChatSource>();
}
public void addUser(IChatUser newUser)
{
ChatUsers.Add(newUser);
}
public bool addSource(IChatSource newSource)
{
if (!chatSources.ContainsKey(newSource.SourceName))
{
chatSources.Add(newSource.SourceName.ToUpper(), newSource);
newSource.IncomingMessage += new IncomingMessageEventHandler(newSource_IncomingMessage);
if (MainUser != null)
{
//Assume that either there is only either none or at least one user account
if (MainUser.retrieve(newSource) == null)
{
UserAccount masterAccount;
if (MainUser.Profile != null)
masterAccount = newSource.createUser(MainUser.Profile.Name);
else
masterAccount = newSource.createUser("Boss");
}
else
newSource.setup(MainUser.retrieve(newSource)[0]);
}
return true;
}
else
{
return false;
}
}
public IChatSource getSource(string sourceName)
{
try
{
return chatSources[sourceName];
}
catch(NullReferenceException)
{
return null;
}
}
public void send(ChatSourceMessage message)
{
IList<UserAccount> accounts = MainUser.retrieve(message.Source);
if (accounts != null && accounts.Count > 0)
{
message.Source.send(message.Message, accounts[0]);
}
}
public void changeMainUser(IChatUser user)
{
if (MainUser != user)
{
MainUser = user;
foreach (IChatSource source in chatSources.Values)
{
IList<UserAccount> accounts = MainUser.retrieve(source);
//Check if there is an existing user account
if (accounts != null && accounts.Count > 0)
{
source.setup(accounts[0]);
}
else
{
//Create a new user account
UserAccount newAccount;
if (MainUser.Profile != null)
{
//Create a new user with its name as username
newAccount = source.createUser(MainUser.Profile.Name);
}
else
{
//Create a new user with random username
newAccount = source.createUser("User");
}
newAccount.Owner = MainUser;
source.setup(newAccount);
}
}
}
}
private void newSource_IncomingMessage(ChatSourceMessage message)
{
if (!message.Source.Muted)
{
lock (NewMessages)
{
NewMessages.Enqueue(message);
}
}
}
}
}