· 9 years ago · Jul 11, 2017, 01:58 AM
1using DarkRift;
2using DarkRift.ConfigTools;
3using DarkRift.Storage;
4using System;
5using System.Collections.Generic;
6
7
8namespace LoginPlugin
9{
10 public class LoginPlugin : Plugin
11 {
12 /// Plugin Discription
13
14 public override string name { get { return "LoginPlugin"; } }
15 public override string version { get { return "1.0"; } }
16 public override string author { get { return "Ken McClelland"; } }
17 public override string supportEmail { get { return "admin@knktech.com"; } }
18
19 public override Command[] commands
20 {
21 get
22 {
23 return new Command[]
24 {
25 new Command("AddUser", "Adds a User To the DB [AddUser name password]", new Action<string[]>(AddUserCommand)),
26 new Command("LPDebug", "Turns on Plugin Debug", new Action<string[]>(DebugCommand))
27
28 };
29 }
30 }
31
32 /// All Variables we going to Read out of the Config File
33 private ConfigReader _settings;
34
35 private byte _loginT;
36 private ushort _loginSUserLogin;
37 private ushort _loginSLogoutUser;
38 private ushort _loginSAddUser;
39 private ushort _loginSLoginSuccess;
40 private ushort _loginSLoginFailed;
41 private ushort _loginSLogoutSuccess;
42 private ushort _loginSAddUserSuccess;
43 private ushort _loginSAddUserFailed;
44
45 private bool _allowAddUser = false;
46 private bool _debug = false;
47
48 private object _obj;
49
50 public LoginPlugin()
51 {
52 /// <summary> If not Installed Make Plugin Directory under ./Plugins/Pluginname Also Create Database Table for this.
53 if (!IsInstalled())
54 {
55 InstallSubdirectory(
56 new Dictionary<string, byte[]>()
57 {
58 {"settings.cnf", System.Text.ASCIIEncoding.ASCII.GetBytes("LoginTag:\t\t\t\t\t10\n"+
59 "LoginSubjectUserLogin:\t\t1\n"+
60 "LoginSubjectLogoutUser:\t\t2\n"+
61 "LoginSubjectAddUser:\t\t3\n"+
62 "LoginSubjectLoginSuccess:\t4\n"+
63 "LoginSubjectLoginFailed:\t5\n"+
64 "LoginSubjectLogoutSuccess:\t6\n"+
65 "LoginSubjectAddUserSuccess:\t7\n"+
66 "LoginSubjectAddUserFailed:\t7\n"+
67 "AllowAddUser:\t\t\tTrue\n"+
68 "Debug:\t\t\t\t\t\tTrue") }
69 }
70 );
71 try
72 {
73 DarkRiftServer.database.ExecuteNonQuery(
74 "CREATE TABLE IF NOT EXISTS tblPlayer(" +
75 "id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, " +
76 "username VARCHAR(50) NOT NULL, " +
77 "password VARCHAR(200) NOT NULL ) ", new QueryParameter[0]
78 );
79 }
80 catch (DatabaseException e)
81 {
82 Interface.LogError("[LoginPlugin] SQL error during step:" + e.ToString());
83
84 if (_debug)
85 Interface.Log("[LoginPlugin] SQL error during setup:");
86 }
87 }
88
89 /// Read Settings from settings.cnf
90
91 _settings = new ConfigReader(GetSubdirectory() + "/settings.cnf");
92
93 /// Read Variables
94
95 if (!byte.TryParse(_settings["LoginTag"], out _loginT))
96 {
97 Interface.LogFatal("[LoginPlugin] Plugin Tag could not be found in settings.cnf");
98 DarkRiftServer.Close(true);
99 }
100 if (!ushort.TryParse(_settings["LoginSubjectUserLogin"], out _loginSUserLogin))
101 {
102 Interface.LogFatal("[LoginPlugin] User Login Subject could not be found in settings.cnf");
103 DarkRiftServer.Close(true);
104 }
105 if (!ushort.TryParse(_settings["LoginSubjectLogoutUser"], out _loginSLogoutUser))
106 {
107 Interface.LogFatal("[LoginPlugin] User Logout Subject could not be found in settings.cnf");
108 DarkRiftServer.Close(true);
109 }
110 if (!ushort.TryParse(_settings["LoginSubjectAddUser"], out _loginSAddUser))
111 {
112 Interface.LogFatal("[LoginPlugin] Add User Subject could not be found in settings.cnf");
113 DarkRiftServer.Close(true);
114 }
115 if (!ushort.TryParse(_settings["LoginSubjectLoginSuccess"], out _loginSLoginSuccess))
116 {
117 Interface.LogFatal("[LoginPlugin] User Login Success Subject could not be found in settings.cnf");
118 DarkRiftServer.Close(true);
119 }
120 if (!ushort.TryParse(_settings["LoginSubjectLoginFailed"], out _loginSLoginFailed))
121 {
122 Interface.LogFatal("[LoginPlugin] User Login Failed Subject could not be found in settings.cnf");
123 DarkRiftServer.Close(true);
124 }
125 if (!ushort.TryParse(_settings["LoginSubjectLogoutSuccess"], out _loginSLogoutSuccess))
126 {
127 Interface.LogFatal("[LoginPlugin] User Logout Success Subject could not be found in settings.cnf");
128 DarkRiftServer.Close(true);
129 }
130 if (!ushort.TryParse(_settings["LoginSubjectAddUserSuccess"], out _loginSAddUserSuccess))
131 {
132 Interface.LogFatal("[LoginPlugin] Add User Success Subject could not be found in settings.cnf");
133 DarkRiftServer.Close(true);
134 }
135 if (!ushort.TryParse(_settings["LoginSubjectAddUserFailed"], out _loginSAddUserFailed))
136 {
137 Interface.LogFatal("[LoginPlugin] Add User Failed Subject could not be found in settings.cnf");
138 DarkRiftServer.Close(true);
139 }
140 if (!bool.TryParse(_settings["AllowAddUser"], out _allowAddUser))
141 {
142 Interface.LogFatal("[LoginPlugin] Allow Add User could not be found in settings.cnf");
143 DarkRiftServer.Close(true);
144 }
145 if (!bool.TryParse(_settings["Debug"], out _debug))
146 {
147 Interface.LogFatal("[LoginPlugin] Debug Setting could not be found in settings.cnf");
148 DarkRiftServer.Close(true);
149 }
150
151 /// Add us to the one Server message Event
152
153 ConnectionService.onServerMessage += OnServerMessage;
154 }
155
156 private void OnServerMessage(ConnectionService con, NetworkMessage data)
157 {
158 if (data.tag == _loginT)
159 {
160 /// Did we get an User Login Message
161 if (data.subject == _loginSUserLogin)
162 {
163 #region Login
164
165 bool isloggedin = false;
166 if (con.HasData(name, "ISLoggedIn"))
167 isloggedin = (bool)con.GetData(name, "IsLoggedIn");
168
169 if (!isloggedin)
170 {
171 try
172 {
173 using (DarkRiftReader reader = (DarkRiftReader)data.data)
174 {
175 string _username = reader.ReadString();
176 string _password = reader.ReadString();
177
178 DatabaseRow[] rows = DarkRiftServer.database.ExecuteQuery(
179 "SELECT id FROM tblPlayer WHERE username = @username AND password = @password LIMIT 1 ",
180 new QueryParameter("username", _username),
181 new QueryParameter("password", _password)
182 );
183 if (rows.Length == 1)
184 {
185 bool _hasuma = false;
186 int id = Convert.ToInt32(rows[0]["id"]);
187
188 con.SetData(name, "IsLoggedIn", true);
189 con.SetData(name, "UserID", id);
190 DarkRiftWriter writer = new DarkRiftWriter();
191
192 writer.Write(_hasuma);
193 writer.Write(id);
194
195 con.SendReply(_loginT, _loginSLoginSuccess, writer);
196
197 if (_debug)
198 Interface.Log("[LoginPlugin] Successfull login (" + id + ").");
199 }
200 }
201 }
202 catch (InvalidCastException)
203 {
204 if (_debug)
205 Interface.Log("[LoginPlugin] Invalid data receieved in a Login request.");
206 }
207 }
208
209 #endregion Login
210 }
211 /// Did we get an User Logout Message
212 if (data.subject == _loginSLogoutUser)
213 {
214 Interface.Log("Logout");
215 }
216 /// Did we get an Add User Message
217 if (data.subject == _loginSAddUser)
218 {
219 if (_allowAddUser)
220 {
221 try
222 {
223 using (DarkRiftReader reader = (DarkRiftReader)data.data)
224 {
225 string _username = reader.ReadString();
226 string _password = reader.ReadString();
227
228 if (!CheckUser(_username, _password))
229 {
230 AddUser(_username, _password);
231 }
232 }
233 }
234 catch (InvalidCastException)
235 {
236 if (_debug)
237 Interface.Log("[LoginPlugin] Add user Failed, Invalid data recieved. ");
238 }
239 }
240 }
241
242 }
243 }
244
245 private void AddUser(String _username, String _password)
246 {
247 try
248 {
249 DarkRiftServer.database.ExecuteNonQuery(
250 "INSERT INTO tblPlayer(username, password) VALUES(@username, @password)",
251 new QueryParameter("username", _username),
252 new QueryParameter("password", _password)
253 );
254 if (_debug)
255 Interface.Log("[LoginPlugin] New User : " + _username);
256 }
257 catch (DatabaseException e)
258 {
259 if (_debug)
260 {
261 Interface.Log("[LoginPlugin] Add user failed. \n" + e.ToString());
262 }
263 }
264 }
265
266 private void AddUserCommand(String[] _commandStr)
267 {
268 if (_commandStr.Length != 2) return;
269
270 string _username = _commandStr[0];
271 string _password = HashHelper.ReturnHash(_commandStr[1], HashType.SHA256);
272
273 if (!CheckUser(_username, _password))
274 {
275 AddUser(_username, _password);
276 }
277 }
278
279 private void DebugCommand(String[] _commandStr)
280 {
281 _debug = !_debug;
282 Interface.Log("[LoginPlugin] Debug is " + _debug);
283 }
284
285 private bool CheckUser(String _username, String _password)
286 {
287 try
288 {
289 _obj = DarkRiftServer.database.ExecuteScalar(
290 "SELECT EXISTS(SELECT 1 FROM tblPlayer WHERE username = @username ) ",
291 new QueryParameter("username", _username)
292 );
293 return Convert.ToBoolean(_obj);
294 }
295 catch (DatabaseException e)
296 {
297 if (_debug)
298 {
299 Interface.Log("[LoginPlugin] Add user failed." + e.ToString());
300 }
301 return true;
302 }
303 }
304 }
305}