· 10 years ago · Sep 01, 2016, 06:52 PM
1using PlayerIO.GameLibrary;
2using System;
3using System.Collections.Generic;
4using System.Linq;
5using System.Text;
6using System.Threading.Tasks;
7using System.Net;
8using System.Text.RegularExpressions;
9using System.Threading;
10
11namespace NinjaCommunity_Gamecode
12{
13 public class MyPlayer : BasePlayer
14 {
15 // put properties here if you want them on your player
16 public bool admin;
17 public bool ipban;
18 public bool ban;
19 public bool online;
20 public string name;
21 public string ip;
22 public bool hasLoadedData;
23 public int chatVersion;
24 public List<string> friends;
25 public List<string> ignoring;
26 }
27
28 [RoomType("room")]
29 public class MyGame : Game<MyPlayer>
30 {
31 public List<string> MessageBoard = new List<string>();
32 //public List<MyPlayer> Players = new List<MyPlayer>();
33 public List<string> PlayerNames = new List<string>();
34 List<string> chatHistory = new List<string>();
35 public Dictionary<string, string> WorldsHosted = new Dictionary<string, string>();
36 public int maxChatChars = 100;
37 public int minChatChars = 1;
38 public int maxNickChars = 15;
39 public int minNickChars = 4;
40 public int totalConnections = 1;
41 public string title = "Welcome to the Ninja Community! Feel free to chat here any time with all of your favorite Ninjabot-using friends! Type /help for some commands.";
42 /*
43 * REMEMBER NOTES
44 *
45 *
46
47 public bool Valid(Message m) {
48 if (m.Type == "" ||
49 m.Type == "" ||
50 m.Type == "" ||
51 m.Type == "" ||
52 m.Type == "" ||
53 m.Type == "" ||
54 m.Type == "" ||
55 m.Type == "" ||
56 m.Type == "")
57 return true;
58 return false;
59 }
60 *
61 *
62 public void DealWith(MyPlayer player, Message message)
63 {
64 switch(message.Type)
65 {
66 #region 1
67 case "":
68 break;
69 #endregion
70 #region 2
71 case "":
72 break;
73 #endregion
74 #region 3
75 case "":
76 break;
77 #endregion
78 }
79 }
80
81 *
82 *
83 *
84 */
85
86 public override void GameStarted()
87 {
88 // a game has been created
89 PlayerIO.BigDB.Load("Extra", "Settings", delegate(DatabaseObject totalcon)
90 {
91 if (totalcon.Contains("totalConnections")) totalConnections = Convert.ToInt32(totalcon["totalConnections"]);
92 if (totalcon.Contains("title")) title = Convert.ToString(totalcon["title"]);
93 if (totalcon.Contains("maxChatChars")) maxChatChars = Convert.ToInt32(totalcon["maxChatChars"]);
94 if (totalcon.Contains("minChatChars")) minChatChars = Convert.ToInt32(totalcon["minChatChars"]);
95 if (totalcon.Contains("maxNickChars")) maxNickChars = Convert.ToInt32(totalcon["maxNickChars"]);
96 if (totalcon.Contains("minNickChars")) minNickChars = Convert.ToInt32(totalcon["minNickChars"]);
97 });
98 AddTimer(delegate
99 {
100 updateAdmin();
101 }, 30000);
102 AddTimer(delegate
103 {
104 updateSettings();
105 }, 60000);
106 }
107
108 public void updateSettings()
109 {
110 PlayerIO.BigDB.Load("Extra", "Settings", delegate(DatabaseObject totalcon)
111 {
112 if (totalcon.Contains("totalConnections")) totalConnections = Convert.ToInt32(totalcon["totalConnections"]);
113 if (totalcon.Contains("title")) title = Convert.ToString(totalcon["title"]);
114 if (totalcon.Contains("maxChatChars")) maxChatChars = Convert.ToInt32(totalcon["maxChatChars"]);
115 if (totalcon.Contains("minChatChars")) minChatChars = Convert.ToInt32(totalcon["minChatChars"]);
116 if (totalcon.Contains("maxNickChars")) maxNickChars = Convert.ToInt32(totalcon["maxNickChars"]);
117 if (totalcon.Contains("minNickChars")) minNickChars = Convert.ToInt32(totalcon["minNickChars"]);
118 });
119 }
120 public void updateAdmin()
121 {
122 foreach (MyPlayer p in Players)
123 {
124 PlayerIO.BigDB.Load("Users", p.ConnectUserId, delegate(DatabaseObject isadmin)
125 {
126 if (isadmin != null && isadmin.Contains("isAdmin"))
127 {
128 Broadcast("updateAdmins", p.Id, Convert.ToBoolean(isadmin["isAdmin"]));
129 p.admin = Convert.ToBoolean(isadmin["isAdmin"]);
130 }
131 });
132 }
133 }
134 public override void UserJoined(MyPlayer player)
135 {
136
137 PlayerIO.BigDB.Load("ipbans", "ipbans",
138 delegate(DatabaseObject result)
139 {
140 if (result != null)
141 {
142 if (result["ip"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
143 {
144 DatabaseArray dbarray = result.GetArray("ip");
145 for (int i = 0; i < dbarray.Count; i++)
146 {
147 if (dbarray[i].ToString() == player.IPAddress.ToString())
148 {
149 player.Send("info", "You are banned from this room.");
150 player.Disconnect();
151 return;
152 }
153 }
154
155 }
156
157 }
158 });
159
160 #region Checks if user is connected with the same ip more than x times.
161 int found = 0;
162 System.Net.IPAddress ip = player.IPAddress;
163 foreach (MyPlayer p in Players)
164 {
165 if (ip.Equals(p.IPAddress))
166 {
167 found += 1;
168 }
169 }
170 if (found > totalConnections)
171 {
172 player.Send("error", "You can only be connected " + totalConnections + " time(s)");
173 player.Disconnect();
174 }
175 else
176 {
177 #endregion
178
179 // a user has joind the game
180
181 //load bigdb obj
182 player.ignoring = new List<string>();
183 player.hasLoadedData = false;
184 bool loaded = false;
185
186 PlayerIO.BigDB.Load("Users", player.ConnectUserId, delegate(DatabaseObject result)
187 {
188 if (result != null)
189 {
190 loaded = true;
191 player.hasLoadedData = true;
192 DatabaseArray friendarray = new DatabaseArray();
193 DatabaseArray friendreqarray = new DatabaseArray();
194 //Change a property and save back.
195 if (result.Contains("isAdmin")) player.admin = Convert.ToBoolean(result["isAdmin"]);
196 if (result.Contains("banned")) player.ban = Convert.ToBoolean(result["banned"]);
197 if (result.Contains("username")) player.name = result["username"].ToString();
198 if (result.Contains("friends"))
199 {
200 if (result["friends"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
201 {
202 friendarray = result.GetArray("friends");
203 Message obj = Message.Create("friends");
204 if (friendarray != null && friendarray.Count > 0)
205 {
206 for (int i = 0; i < friendarray.Count; i++)
207 {
208 if (!friendreqarray.Contains(friendarray[i])) obj.Add(friendarray[i]);
209 }
210 player.Send(obj);
211 }
212 }
213 }
214
215 if (result.Contains("friendrequests"))
216 {
217 if (result["friendrequests"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
218 {
219 friendreqarray = result.GetArray("friendrequests");
220 Message obj1 = Message.Create("friendrequests");
221 if (friendreqarray != null && friendreqarray.Count > 0)
222 {
223 for (int i = 0; i < friendreqarray.Count; i++)
224 {
225 if (!friendarray.Contains(friendreqarray[i])) obj1.Add(friendreqarray[i]);
226 }
227 player.Send(obj1);
228 }
229 }
230 }
231 /*if (result.Contains("friends"))
232 {
233 foreach (object i in result.ToString().Split('|'))
234 {
235 player.friends.Add(i.ToString());
236 }
237 }
238 */
239 if (player.ban)
240 {
241 player.Send("info", "You are banned from this chat.");
242 player.Disconnect();
243 }
244 else
245 {
246 player.Send("Connected", player.Id, player.name, player.admin);
247 player.Send("title", title);
248 Broadcast("join", player.Id, player.name, "", player.admin);
249 player.hasLoadedData = loaded;
250 if (chatHistory.Count < 10 && chatHistory.Count > 0)
251 {
252 for (int i = 0; i < chatHistory.Count; i++)
253 {
254 player.Send("chathistory", chatHistory[i]);
255 }
256 }
257 foreach (MyPlayer pl in Players)
258 {
259 if (player.Id != pl.Id)
260 {
261 player.Send("playerBefore", pl.Id, pl.name, pl.admin);
262 }
263 }
264 }
265 }
266 else
267 {
268 player.Send("info", "You haven't set a nickname. Write /setnick <nickname> to set your nickname.");
269
270 }
271 });
272 }
273 //if (player.friends.Count > 0) Broadcast("join", player.Id, player.name, player.friends, player.admin);
274 //else Broadcast("join", player.Id, player.name, "", player.admin);
275
276
277 }
278
279 public override void UserLeft(MyPlayer player)
280 {
281 // a user has left a game
282 Broadcast("leave", player.Id, player.name);
283 }
284
285
286 public bool DetectCorrectMessages(Message m, int message, string type)
287 {
288 if (m[(uint)message].GetType().ToString() == type) { return true; }
289 return false;
290 }
291
292
293 public override void GotMessage(MyPlayer player, Message message)
294 {
295 switch(message.Type)
296 {
297 case "uploadfont":
298 if (message.Count > 3)
299 if (DetectCorrectMessages(message, 0, "System.Int32"))
300 if (DetectCorrectMessages(message, 1, "System.String"))
301 if (DetectCorrectMessages(message, 2, "System.String"))
302 if (DetectCorrectMessages(message, 3, "System.String"))
303 {
304 string name = message.GetString(1);
305 string description = message.GetString(2);
306 string owner = "";
307
308 //get username
309 PlayerIO.BigDB.LoadOrCreate("Users", player.ConnectUserId, delegate(DatabaseObject resultasdf)
310 {
311 if (resultasdf != null)
312 {
313 owner = resultasdf.GetString("username");
314 }
315
316 int nextUpdate = 0;
317
318 PlayerIO.BigDB.LoadOrCreate("Fonts", "desc", delegate(DatabaseObject resultdfgh)
319 {
320 nextUpdate = resultdfgh.GetInt("addArrayKey");
321
322 int fontversion = message.GetInt(0);
323
324 DatabaseObject uploadFont = new DatabaseObject();
325 uploadFont.Set("name", name);
326 uploadFont.Set("owner", owner);
327 uploadFont.Set("description", description);
328 uploadFont.Set("fontversion", fontversion);
329
330 switch (fontversion)
331 {
332 case 0:
333 string upload = message.GetString(3).ToLower();
334 if (Regex.IsMatch(upload, @"^[0-9|]+$"))
335 {
336 //edit
337 PlayerIO.BigDB.LoadOrCreate("Fonts", "desc", delegate(DatabaseObject result)
338 {
339 result.Set("addArrayKey", result.GetInt("addArrayKey") + 1);
340 result.Save();
341 DatabaseArray modify = result.GetArray("existingArrays");
342 modify.Set(result.GetInt("addArrayKey") - 1, result.GetInt("addArrayKey"));
343 result.Set("existingArrays", modify);
344 result.Save();
345 uploadFont.Set("font", upload);
346
347 PlayerIO.BigDB.CreateObject("Fonts", nextUpdate.ToString(), uploadFont, delegate(DatabaseObject resultgaer)
348 {
349 player.Send("info", "Your font has been uploaded. When an administrator approves of it, they will allow it to be downloaded.");
350 });
351 });
352 }
353 else
354 {
355 player.Send("error", "Please make sure that the data you are uploading contains only numbers 0-9 and |");
356 }
357 break;
358 default:
359 player.Send("error", "That's not a valid font version for uploading the font");
360 return;
361 }
362 });
363 });
364 }
365 else
366 {
367 player.Send("error", "You need to send a System.String");
368 }
369 else
370 player.Send("error", "You need to send a System.String");
371 else
372 player.Send("error", "You need to send a System.Int32");
373 else
374 player.Send("error", "You need to send a total of 3 messages");
375 break;
376 case "downloadfont":
377
378 if (message.Count == 1)
379 if (DetectCorrectMessages(message, 0, "System.Int32"))
380 {
381
382 string SendInfo = "";
383
384 int GetFont = Convert.ToInt32(message[0]);
385
386 int FontVersion = 0;
387
388 //Check if it exists
389
390 PlayerIO.BigDB.LoadOrCreate("Fonts", "desc", delegate(DatabaseObject result)
391 {
392 DatabaseArray arr = result.GetArray("existingArrays");
393
394 if (!arr.Contains(GetFont))
395 {
396 player.Send("error", "You cannot download a font that doesn't exist!");
397 return;
398 }
399
400 });
401
402 Message Serialize = Message.Create("downloadfont"); //For serializing an array
403
404 PlayerIO.BigDB.LoadOrCreate("Fonts", GetFont.ToString(), delegate(DatabaseObject result)
405 {
406 SendInfo = result.GetString("name") + " by " + result.GetString("owner");
407 Serialize.Add(result.GetInt("fontversion")); //Make sure the client knows about the font version
408 Serialize.Add(result.GetString("name"));
409 switch (result.GetInt("fontversion"))
410 {
411 case 0: //For earlier fonts
412
413 //Send a simple string with the data
414 Serialize.Add(result.GetString("font"));
415 break;
416 }
417 player.Send(Serialize);
418
419 player.Send("info", "Please enjoy " + SendInfo);
420 });
421
422 //Send it
423 }
424 else
425 {
426 player.Send("error", "You need to send a System.Int32");
427 }
428
429 break;
430
431 case "getmorefontinfo":
432 if (message.Count == 1)
433 if (DetectCorrectMessages(message, 0, "System.Int32"))
434 {
435 //Get more info about the font
436 int fontId = message.GetInt(0);
437
438 PlayerIO.BigDB.LoadOrCreate("Fonts", "desc", delegate(DatabaseObject result)
439 {
440 if (result != null)
441 {
442 DatabaseArray arr = result.GetArray("existingArrays");
443
444 if (!arr.Contains(fontId))
445 {
446 player.Send("error", "That font doesn't exist!");
447 return;
448 }
449 }
450 });
451
452 string fId = fontId.ToString();
453
454 PlayerIO.BigDB.Load("Fonts", fontId.ToString(), delegate(DatabaseObject result)
455 {
456 if (result != null)
457 {
458 string name = result.GetString("name");
459 string owner = result.GetString("owner");
460 string description = result.GetString("description");
461 int fontversion = result.GetInt("fontversion");
462
463 player.Send("getmorefontinfo", name, owner, description, fontversion);
464 }
465 else
466 {
467 player.Send("error", "Couldn't retrieve font data.");
468 }
469
470 });
471
472 }
473 else
474 {
475 player.Send("error", "You need to send a System.Int32");
476 }
477 else
478 {
479 player.Send("error", "Only supposed to be 1, you sent " + message.Count);
480 }
481 break;
482
483 case "getfontlist":
484
485 //SEND USAGE: con.Send("getfontlist", 10, 0); - Gives player 'fontlist' with 10 fonts, starting at 0 (in the font array)
486
487 //Get the amount of arrays to "get"
488
489
490
491 List<string> ExistingArrays = new List<string>();
492
493 PlayerIO.BigDB.Load("Fonts", "desc", delegate(DatabaseObject result)
494 {
495 if (result != null)
496 {
497 DatabaseArray arr = result.GetArray("existingArrays");
498
499 for (int i = 0; i < arr.Count; i++)
500 ExistingArrays.Add(arr.GetInt(i).ToString());
501
502 //Get all array names
503
504 List<string> ExistingArrayNames = new List<string>();
505
506 foreach (string iss in ExistingArrays)
507 {
508
509 PlayerIO.BigDB.LoadOrCreate("Fonts", iss, delegate(DatabaseObject result22)
510 {
511 if (result22 == null)
512 {
513 player.Send("fontlist", "0\\1\\ERROR");
514 }
515 else
516 {
517 player.Send("fontlist", result22.GetInt("fontversion").ToString() + "\\" + (Convert.ToInt32(iss)-1).ToString() + "\\" + result22.GetString("name"));
518 }
519 });
520 //The client will recieve the name as '0\EE Font', for example, 0 representing
521 //the splitting charecter (since you cant use it in the font name when you
522 //create it), and after the \ is the name.
523 //
524 //The reason for the 0\EE Font is so that you can put a big red **OUTDATED**
525 //on the font, so you can notify users that the font is outdated, but you can
526 //still download it and convert it to a new version of downloading fonts.
527 //
528 //Keep in mind the font version is for fonts, and the chat version for chats.
529
530 }
531 }
532 else
533 {
534 player.Send("error", "Couldn't download fonts.");
535 }
536 });
537
538 break;
539 }
540
541 // when getting a message, simply send it to all players connected
542 // to the room.
543 switch (message.Type)
544 {
545 case "command":
546 case "cmd":
547 if (DetectCorrectMessages(message, 0, "System.String"))
548 {
549 string[] cmd;
550 if (message[0].ToString().Contains("/")) cmd = message[0].ToString().Replace("/", string.Empty).Trim().Split(' ');
551 else cmd = message[0].ToString().Trim().Split(' ');
552 if (cmd.Length >= 1)
553 {
554
555 if (cmd[0] == "settitle")
556 {
557 if (player.admin)
558 {
559 title = message.GetString(0).Substring(cmd[0].Length + 1, message.GetString(0).Length - cmd[0].Length - 1).Trim();
560 PlayerIO.BigDB.Load("Extra", "Settings", delegate(DatabaseObject dbo)
561 {
562 dbo.Set("title", title);
563 dbo.Save();
564 });
565 Broadcast("title", title);
566 player.Send("info", "You have changed the title.");
567 }
568 }
569 else if (cmd[0] == "setcon")
570 {
571 if (player.admin)
572 {
573 PlayerIO.BigDB.Load("Extra", "Settings", delegate(DatabaseObject dbo)
574 {
575 dbo.Set("totalConnections", Convert.ToInt32(cmd[1]));
576 dbo.Save();
577 });
578 totalConnections = Convert.ToInt32(cmd[1]);
579 player.Send("info", "Total Player connections is now set to: " + cmd[1]);
580 }
581 }
582 else if (cmd[0] == "getip")
583 {
584 if (player.admin)
585 {
586 foreach (MyPlayer pl in Players)
587 {
588 if (pl.name == cmd[1].ToString())
589 {
590 player.Send("info", "Player: " + pl.name + " Ip Address: " + pl.IPAddress);
591 break;
592 }
593 }
594 }
595 }
596 else if (cmd[0] == "addadmin")
597 {
598 if (player.admin)
599 {
600 if (cmd.Length == 3)
601 {
602 bool saveToDatabase = Convert.ToBoolean(cmd[2].ToString());
603 /*foreach (MyPlayer pl in Players)
604 {
605 if (pl.name == cmd[1].ToString())
606 {
607 break;
608 }
609 }
610 */
611 }
612 }
613 }
614 else
615 {
616 if (cmd.Length >= 2)
617 {
618 if (cmd[0] == "friendremove")
619 {
620 PlayerIO.BigDB.Load("Users", player.ConnectUserId, delegate(DatabaseObject result)
621 {
622 if (result != null)
623 {
624 DatabaseArray friends = new DatabaseArray();
625 if (result.Contains("friends"))
626 {
627 if (result["friends"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
628 {
629 friends = result.GetArray("friends");
630 if (friends != null && friends.Count > 0)
631 {
632 for (int i = 0; i < friends.Count; i++)
633 {
634 if (friends.GetString(i) == cmd[1])
635 {
636 friends.Remove(cmd[1]);
637 result.Set("friends", friends);
638 result.Save();
639 player.Send("info", cmd[1] + " has been removed from your friends list.");
640 }
641 }
642
643 player.Send("refreshFriendFeed");
644 }
645 }
646 }
647 }
648 });
649 }
650 if (cmd[0] == "frienddecline")
651 {
652 PlayerIO.BigDB.Load("Users", player.ConnectUserId, delegate(DatabaseObject result)
653 {
654 if (result != null)
655 {
656 DatabaseArray friends = new DatabaseArray();
657 if (result.Contains("friendpendings"))
658 {
659 if (result["friendpendings"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
660 {
661 friends = result.GetArray("friendpendings");
662 if (friends != null && friends.Count > 0)
663 {
664 for (int i = 0; i < friends.Count; i++)
665 {
666 if (friends[i] == cmd[1])
667 {
668 friends.Remove(cmd[1]);
669 result.Set("friendpendings", friends);
670 result.Save();
671 }
672 }
673
674 player.Send("refreshFriendFeed");
675 }
676 }
677 }
678 }
679 });
680 }/*
681 if (cmd[0] == "friendblock")
682 {
683 PlayerIO.BigDB.Load("Users", player.ConnectUserId, delegate(DatabaseObject result)
684 {
685 if (result != null)
686 {
687 DatabaseArray friends = new DatabaseArray();
688 if (result.Contains("friendpendings"))
689 {
690 if (result["friendpendings"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
691 {
692 friends = result.GetArray("friendpendings");
693 if (friends != null && friends.Count > 0)
694 {
695 for (int i = 0; i < friends.Count; i++)
696 {
697 if (friends[i] == cmd[1])
698 {
699 friends.Remove(cmd[1]);
700 }
701 }
702
703 player.Send("refreshFriendFeed");
704 }
705 }
706 }
707 }
708 });
709 }
710 if (cmd[0] == "friendunblock")
711 {
712 PlayerIO.BigDB.Load("Users", player.ConnectUserId, delegate(DatabaseObject result)
713 {
714 if (result != null)
715 {
716 DatabaseArray friends = new DatabaseArray();
717 if (result.Contains("friendpendings"))
718 {
719 if (result["friendpendings"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
720 {
721 friends = result.GetArray("friendpendings");
722 if (friends != null && friends.Count > 0)
723 {
724 for (int i = 0; i < friends.Count; i++)
725 {
726 if (friends[i] == cmd[1])
727 {
728 friends.Remove(cmd[1]);
729 }
730 }
731
732 player.Send("refreshFriendFeed");
733 }
734 }
735 }
736 }
737 });
738 }*/
739 }
740 if(cmd[0] == "getFriendFeed")
741 {
742 PlayerIO.BigDB.Load("Users", player.ConnectUserId, delegate(DatabaseObject result)
743 {
744 if (result != null)
745 {
746 DatabaseArray friendarray = new DatabaseArray();
747 DatabaseArray friendreqarray = new DatabaseArray();
748 if (result.Contains("friends"))
749 {
750 if (result["friends"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
751 {
752 friendarray = result.GetArray("friends");
753 Message obj = Message.Create("friends");
754 if (friendarray != null && friendarray.Count > 0)
755 {
756 for (int i = 0; i < friendarray.Count; i++)
757 {
758 if (!friendreqarray.Contains(friendarray[i])) obj.Add(friendarray[i]);
759 }
760 player.Send(obj);
761 }
762 }
763 }
764 if (result.Contains("friendrequests"))
765 {
766 if (result["friendrequests"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
767 {
768 friendreqarray = result.GetArray("friendrequests");
769 Message obj1 = Message.Create("friendrequests");
770 if (friendreqarray != null && friendreqarray.Count > 0)
771 {
772 for (int i = 0; i < friendreqarray.Count; i++)
773 {
774 if (!friendarray.Contains(friendreqarray[i])) obj1.Add(friendreqarray[i]);
775 }
776 player.Send(obj1);
777 }
778 }
779 }
780 if (result.Contains("friendblocks"))
781 {
782 if (result["friendblocks"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
783 {
784 friendreqarray = result.GetArray("friendblocks");
785 Message obj1 = Message.Create("friendblocks");
786 if (friendreqarray != null && friendreqarray.Count > 0)
787 {
788 for (int i = 0; i < friendreqarray.Count; i++)
789 {
790 if (!friendarray.Contains(friendreqarray[i])) obj1.Add(friendreqarray[i]);
791 }
792 player.Send(obj1);
793 }
794 }
795 }
796 if (result.Contains("friendpendings"))
797 {
798 if (result["friendpendings"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
799 {
800 friendreqarray = result.GetArray("friendpendings");
801 Message obj1 = Message.Create("friendpendings");
802 if (friendreqarray != null && friendreqarray.Count > 0)
803 {
804 for (int i = 0; i < friendreqarray.Count; i++)
805 {
806 if (!friendarray.Contains(friendreqarray[i])) obj1.Add(friendreqarray[i]);
807 }
808 player.Send(obj1);
809 }
810 }
811 }
812 }
813 });
814 }
815
816 if (cmd[0] == "help")
817 {
818 player.Send("info", "The commands you can use are:\r\n/help - look at all the possible commands\r\n/pm <player> <message> - privately message a player\r\n/clear - clear the chat on your screen\r\n/mute <player> - prevent that player from being able to hear what you're saying, and you cant hear what they are saying, aka muting that player.\r\n/unmute <player> - unmute a player\r\n/report <player> <reason> - report a player");
819 if (player.admin)
820 {
821 player.Send("info", "[Admin commands]\r\n/getip <player> - get the ip of a player\r\n/pubclear - clear the chat for all players");
822 }
823 }
824
825 #region setnick / register
826 if (cmd[0] == "setnick")
827 {
828 if (player.hasLoadedData == false)
829 {
830 PlayerIO.BigDB.LoadSingle("Users", "playername", new object[] { cmd[1].ToString().ToLower() },
831 delegate(DatabaseObject result)
832 {
833 if (result != null)
834 {
835 player.Send("error", "Nickname: \"" + cmd[1].ToLower() + "\" Already exists. Please choose another.");
836 }
837 else
838 {
839 if (!Regex.IsMatch(cmd[1].ToString().ToLower(), "^[a-z0-9]{" + minNickChars + "," + maxNickChars + "}$"))
840 {
841 if (cmd[1].ToString().Length <= maxNickChars && cmd[1].ToString().Length >= minNickChars)
842 {
843 player.Send("error", "Your nickname must contain letters or numbers");
844 }
845 else
846 {
847 player.Send("error", "Please choose a nickname that contains " + minNickChars + " to " + maxNickChars + " letters or numbers.");
848 }
849 return;
850 }
851 //Make new object and set some properties
852 DatabaseObject obj = new DatabaseObject();
853 obj.Set("username", cmd[1].ToLower());
854 obj.Set("banned", false);
855 obj.Set("isAdmin", false);
856 obj.Set("ip", player.IPAddress.ToString());
857 obj.Set("friends", new DatabaseArray());
858 obj.Set("friendrequests", new DatabaseArray());
859 obj.Set("friendpendings", new DatabaseArray());
860 obj.Set("friendblocks", new DatabaseArray());
861 //Create object in table Users with ConnectUserId as key
862 PlayerIO.BigDB.CreateObject("Users", player.ConnectUserId, obj,
863 delegate(DatabaseObject dbo)
864 {
865 },
866 delegate(PlayerIOError error)
867 {
868
869
870 });
871
872 player.Send("registername", true, message[0].ToString());
873 player.Disconnect();
874
875 }
876 },
877 delegate(PlayerIOError error)
878 {
879 player.Send("error", error.Message);
880 });
881 }
882 else
883 {
884 player.Send("error", "You are already registered.");
885 }
886 }
887 #endregion
888
889 if (cmd[0] == "kick")
890 {
891 if (player.admin)
892 {
893 foreach (MyPlayer pl in Players)
894 {
895 if (pl.name == cmd[1])
896 {
897 if (!pl.admin)
898 {
899 Broadcast("info", "Player: \"" + cmd[1] + "\" Got kicked out of the room.");
900 pl.Disconnect();
901 }
902 else
903 {
904 player.Send("info", " Can't kick \"" + cmd[1] + "\" because the person have Admin rights.");
905 }
906 break;
907 }
908 }
909 }
910 }
911 if (cmd[0] == "ban")
912 {
913 if (player.admin)
914 {
915 foreach (MyPlayer pl in Players)
916 {
917 if (pl.name == cmd[1])
918 {
919 if (!pl.admin)
920 {
921 PlayerIO.BigDB.LoadSingle("Users", "playername", new object[] { cmd[1].ToString() },
922 delegate(DatabaseObject result)
923 {
924 pl.ban = true;
925 result.Set("banned", true);
926 result.Save();
927 Broadcast("info", "Player: \"" + cmd[1] + "\" Got banned from the chat.");
928 pl.Disconnect();
929 });
930
931 }
932 else
933 {
934 player.Send("info", " Can't ban \"" + cmd[1] + "\" because the person have Admin rights.");
935 }
936 break;
937 }
938 }
939 }
940 }
941 if (cmd[0] == "ipban")
942 {
943 if (player.admin)
944 {
945 foreach (MyPlayer pl in Players)
946 {
947 if (pl.name == cmd[1])
948 {
949 if (!pl.admin)
950 {
951
952 PlayerIO.BigDB.Load("ipbans", "ipbans",
953 delegate(DatabaseObject result)
954 {
955 if (result != null)
956 {
957 if (result["ip"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
958 {
959 DatabaseArray dbarray = result.GetArray("ip");
960 dbarray.Add(pl.IPAddress.ToString());
961 result.Save();
962 pl.Send("info", "You got banned from this chat.");
963 pl.Disconnect();
964 }
965
966 }
967 });
968 }
969 else
970 {
971 player.Send("info", " Can't Ipban \"" + cmd[1] + "\" because they person have Admin rights.");
972 }
973 break;
974 }
975 }
976 }
977 }
978 if (cmd[0] == "friendreq")
979 {
980 PlayerIO.BigDB.LoadSingle("Users", "playername", new object[] { cmd[1].ToString().ToLower() },
981 delegate(DatabaseObject result)
982 {
983 if (result != null)
984 {
985 if (result["friendrequests"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
986 {
987 bool userExists = false;
988 DatabaseArray dbarray = result.GetArray("friendrequests");
989 for (int i = 0; i < dbarray.Count; i++)
990 {
991 if (dbarray[i].ToString() == player.name.ToString())
992 {
993 userExists = true;
994 break;
995 }
996 }
997 if (userExists)
998 {
999 player.Send("info", "You already exist in \"" + cmd[1] + "\"'s invite list.");
1000 }
1001 else
1002 {
1003 dbarray.Add(player.name.ToString());
1004 result.Save();
1005 player.Send("info", "Sucessfully sent a friend request.");
1006 }
1007
1008
1009 }
1010
1011 }
1012 else
1013 {
1014 player.Send("error", "Nickname: \"" + cmd[1].ToString() + "\" Doesn't exists.");
1015 }
1016 });
1017 }
1018 if (cmd[0] == "friendaccept")
1019 {
1020 PlayerIO.BigDB.Load("Users", player.ConnectUserId, delegate(DatabaseObject result)
1021 {
1022 if (result != null)
1023 {
1024 if (result["friendrequests"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
1025 {
1026 bool userExists = false;
1027 DatabaseArray dbarray = result.GetArray("friendrequests");
1028 for (int i = 0; i < dbarray.Count; i++)
1029 {
1030 if (dbarray[i].ToString() == cmd[1])
1031 {
1032 userExists = true;
1033 break;
1034 }
1035 }
1036 if (userExists)
1037 {
1038 PlayerIO.BigDB.Load("Users", player.ConnectUserId, delegate(DatabaseObject result1)
1039 {
1040 if (result1 != null)
1041 {
1042 if (result1["friends"].GetType().ToString() == "PlayerIO.ServerCore.PlayerIOClient.DatabaseArrayImpl")
1043 {
1044 bool userExists1 = false;
1045 DatabaseArray dbarray1 = result1.GetArray("friends");
1046 for (int i = 0; i < dbarray1.Count; i++)
1047 {
1048 if (dbarray1[i].ToString() == cmd[1])
1049 {
1050 userExists1 = true;
1051 break;
1052 }
1053 }
1054 if (!userExists1)
1055 {
1056 player.Send("info", "0: " + dbarray.Count.ToString());
1057 dbarray.Remove(cmd[1]);
1058 result.Save();
1059 player.Send("info", "1: " + dbarray.Count.ToString());
1060 dbarray1.Add(cmd[1]);
1061 result1.Save();
1062 player.Send("friends", cmd[1]);
1063 player.Send("info", cmd[1] + " Sucessfully added as friend.");
1064 }
1065 else
1066 {
1067 player.Send("info", cmd[1] + "Already exists as a friend.");
1068 }
1069
1070 }
1071
1072 }
1073 else
1074 {
1075 player.Send("info", "Your account doesn't exist.");
1076 }
1077 });
1078
1079 }
1080 else
1081 {
1082 player.Send("info", cmd[1] + " Doesn't exists in your friend invite list.");
1083 }
1084
1085
1086 }
1087 }
1088 else
1089 {
1090 player.Send("info", "Your account doesn't exist.");
1091 }
1092 });
1093 }
1094 }
1095 }
1096 }
1097 else
1098 {
1099 player.Send("error", "Unknown Message.");
1100 }
1101 break;
1102 case "chat":
1103 if (DetectCorrectMessages(message, 0, "System.String"))
1104 {
1105 if (player.hasLoadedData == true)
1106 {
1107 if (message.GetString(0).Length <= maxChatChars && message.GetString(0).Length >= minChatChars)
1108 {
1109
1110 if (chatHistory.Count < 10 && chatHistory.Count >= 0)
1111 {
1112
1113 if (chatHistory.Count == 9)
1114 {
1115 chatHistory.RemoveAt(0);
1116 chatHistory.Add(player.name + ": " + message.GetString(0).Trim());
1117 }
1118 else
1119 {
1120 chatHistory.Add(player.name + ": " + message.GetString(0).Trim());
1121 }
1122 }
1123 Broadcast("chat", player.Id, message.GetString(0).Trim());
1124 }
1125 else
1126 {
1127 player.Send("error", "Chatlimit reached.");
1128 }
1129 }
1130 }
1131 else
1132 {
1133 player.Send("error", "Unknown message.");
1134 }
1135 break;
1136
1137 case "getfontamount":
1138 int amt = 0;
1139 bool sent = false;
1140
1141 PlayerIO.BigDB.LoadOrCreate("Fonts", "desc", delegate(DatabaseObject result)
1142 {
1143 if (result != null)
1144 {
1145 DatabaseArray arr = result.GetArray("existingArrays");
1146
1147 amt = 0;
1148 foreach(int i in arr)
1149 {
1150 amt++;
1151 }
1152 sent = true;
1153 player.Send("getfontamount", amt);
1154 }
1155 });
1156 if(sent == false)
1157 {
1158 player.Send("getfontamount", -1);
1159 }
1160 break;
1161 #region register
1162 case "register":
1163 if (player.hasLoadedData == false)
1164 {
1165 PlayerIO.BigDB.LoadSingle("Users", "playername", new object[] { message[0].ToString() },
1166 delegate(DatabaseObject result)
1167 {
1168 if (result != null)
1169 {
1170 player.Send("error", "Nickname: \"" + message[0].ToString().ToLower() + "\" Already exists. Please choose another.");
1171 }
1172 else
1173 {
1174 if (!Regex.IsMatch(message[0].ToString().ToLower(), "^[a-z0-9]{" + minNickChars + "," + maxNickChars + "}$"))
1175 {
1176 if (message[0].ToString().Length <= maxNickChars && message[0].ToString().Length >= minNickChars)
1177 {
1178 player.Send("error", "Your nickname must contain letters or numbers.");
1179 }
1180 else
1181 {
1182 player.Send("error", "Please choose a nickname that contains " + minNickChars + " to " + maxNickChars + " letters or numbers.");
1183 }
1184 return;
1185 }
1186 //Make new object and set some properties
1187 DatabaseObject obj = new DatabaseObject();
1188 obj.Set("username", message[0].ToString().ToLower());
1189 obj.Set("banned", false);
1190 obj.Set("isAdmin", false);
1191 obj.Set("ip", player.IPAddress.ToString());
1192 obj.Set("friends", new DatabaseArray());
1193 obj.Set("friendrequests", new DatabaseArray());
1194 //Create object in table Users with ConnectUserId as key
1195 PlayerIO.BigDB.CreateObject("Users", player.ConnectUserId, obj,
1196 delegate(DatabaseObject result1)
1197 {
1198 }
1199 );
1200 obj.Save();
1201 player.Send("registername", true, message[0].ToString());
1202 player.Disconnect();
1203
1204
1205 }
1206 },
1207 delegate(PlayerIOError error)
1208 {
1209 player.Send("error", error.Message);
1210 });
1211 }
1212 break;
1213 #endregion
1214
1215 }
1216 /*if (ValidChatMessage(message))
1217 DealWithChat(player, message);
1218 if (ValidFontMessage(message))
1219 DealWithFont(player, message);
1220 if (ValidFriendMessage(message))
1221 DealWithFriend(player, message);
1222 if (ValidGeneralMessage(message))
1223 DealWithGeneral(player, message);
1224 */
1225 }
1226
1227 #region valid messages
1228 public bool ValidChatMessage(Message m)
1229 {
1230 if (m.Type == "chat" ||
1231 m.Type == "command" ||
1232 m.Type == "cmd")
1233 return true;
1234 return false;
1235 } //chat msg
1236 public bool ValidGeneralMessage(Message m)
1237 {
1238 if (m.Type == "isonline" ||
1239 m.Type == "getupdates" ||
1240 m.Type == "register" ||
1241 m.Type == "downloadupdates")
1242 return true;
1243 return false;
1244 } //general msg
1245 public bool ValidFontMessage(Message m)
1246 {
1247 if (m.Type == "publishfont" ||
1248 m.Type == "downloadfont" ||
1249 m.Type == "getamt")
1250 return true;
1251 return false;
1252 } //font msg
1253 public bool ValidFriendMessage(Message m)
1254 {
1255 if (m.Type == "friendreq" ||
1256 m.Type == "friendaccept" ||
1257 m.Type == "frienddecline" ||
1258 m.Type == "friends")
1259 return true;
1260 return false;
1261 } //friend msg
1262 #endregion
1263
1264
1265 public void DealWithChat(MyPlayer player, Message message)
1266 {
1267 #region sendRegister
1268 if ((message.Type == "chat" ||
1269 message.Type == "command") && !player.hasLoadedData)
1270 {
1271 player.Send("needregister");
1272 return;
1273 }
1274 #endregion
1275 #region proofChat
1276 if (message.Type == "chat" || message.Type == "register" || message.Type == "isonline")
1277 if (message.Count < 1)
1278 {
1279 player.Send("chat", "[GOODBYE] You need to have at least one object in the message sent");
1280 player.Disconnect();
1281 return;
1282 }
1283 #endregion
1284 switch (message.Type)
1285 {
1286 #region chat
1287 case "chat":
1288 if (message.GetString(0).Length < 101)
1289 {
1290 foreach (MyPlayer pl in Players)
1291 {
1292 if (!(pl.ignoring.Contains(player.name) || player.ignoring.Contains(pl.name)))
1293 {
1294 pl.Send("chat", player.Id, message.GetString(0));
1295 }
1296 }
1297 }
1298 break;
1299 #endregion
1300 #region command
1301 case "command":
1302 #region admin
1303 if (player.admin)
1304 {
1305 switch (message.GetString(0))
1306 {
1307 #region getip
1308 case "/getip":
1309 foreach (MyPlayer i in Players)
1310 {
1311 if (i.name == message.GetString(1))
1312 {
1313 player.Send("chat", "That player's IP Address is " + i.IPAddress.ToString());
1314 }
1315 }
1316 break;
1317 #endregion
1318 #region pubclear
1319 case "/pubclear":
1320 Broadcast("clear");
1321 break;
1322 #endregion
1323 }
1324 }
1325 #endregion
1326 #region normal
1327 switch (message.GetString(0))
1328 {
1329 #region help
1330 case "/help":
1331 player.Send("chat",
1332 new object[] {
1333 "The commands you can use are:\r\n",
1334 "/help - look at all the possible commands\r\n",
1335 "/pm <player> <message> - privately message a player\r\n",
1336 "/clear - clear the chat on your screen\r\n",
1337 "/mute <player> - prevent that player from being able to hear what you're saying, and you cant hear what they are saying, aka muting that player.\r\n",
1338 "/unmute <player> - unmute a player\r\n",
1339 "/report <player> <reason> - report a player"
1340 });
1341 if (player.admin)
1342 player.Send("chat", new object[] {
1343 "/getip <player> - get the ip of a player\r\n",
1344 "/pubclear - clear the chat for all players"
1345 });
1346 break;
1347 #endregion
1348 #region unmute
1349 case "/unmute":
1350 try
1351 {
1352 player.ignoring.Remove(message[1].ToString());
1353 foreach (MyPlayer i in Players)
1354 if (i.name == message[1].ToString())
1355 i.Send("chat", "You have just been un-ignored by " + player.name);
1356 }
1357 catch { }
1358 break;
1359 #endregion
1360 #region mute
1361 case "/mute":
1362 try
1363 {
1364 player.ignoring.Add(message[1].ToString());
1365 foreach (MyPlayer i in Players)
1366 if (i.name == message[1].ToString())
1367 i.Send("chat", "You have just been ignored by " + player.name);
1368 }
1369 catch { }
1370 break;
1371 #endregion
1372 #region clear
1373 case "/clear":
1374 player.Send("clear");
1375 break;
1376 #endregion
1377 #region pm
1378 case "/pm":
1379 string msg = "";
1380 for (uint c = 0; c < message.Count; c++)
1381 if (c > 1)
1382 msg += message[c].ToString() + " ";
1383 foreach (MyPlayer i2 in Players)
1384 if (i2.name == message.GetString(1))
1385 i2.Send("chat", player.name + " > you > " + msg);
1386 player.Send("chat", "you > " + message.GetString(1) + " > " + msg);
1387 break;
1388 #endregion
1389 #region report
1390 case "/report":
1391 //send msg to them
1392 string msg3 = "";
1393 for (uint c = 2; c < message.Count; c++)
1394 if (c > 1)
1395 msg3 += message[c].ToString() + " ";
1396 foreach (MyPlayer i3 in Players)
1397 if (i3.name == message.GetString(1))
1398 i3.Send("chat", player.name + " Reported you for " + msg3);
1399
1400 //create report obj
1401 PlayerIO.BigDB.LoadOrCreate("Reports", player.ConnectUserId, delegate(DatabaseObject result)
1402 {
1403 if (result != null)
1404 {
1405 result.Set("report_" + DateTime.Today.Date.ToString() + "__" + DateTime.Now.ToString(), message.GetString(1) + "> " + msg3);
1406 result.Save();
1407 player.Send("chat", "The report has sucessfully been sent to ninjasupeatsninja for inspection.");
1408 }
1409 });
1410
1411 break;
1412 #endregion
1413 }
1414 #endregion
1415 break;
1416 #endregion
1417 }
1418 }
1419 public void DealWithGeneral(MyPlayer player, Message message)
1420 {
1421 switch (message.Type)
1422 {
1423 #region isonline
1424 case "isonline":
1425 foreach (MyPlayer i in Players)
1426 {
1427 if (i.name == message[0].ToString() && i.online)
1428 {
1429 player.Send("isonline", true);
1430 return;
1431 }
1432 }
1433 player.Send("isonline", false);
1434 break;
1435 #endregion
1436 #region getupdates
1437 case "getupdates":
1438 PlayerIO.BigDB.Load("Extra", "Updates", delegate(DatabaseObject result)
1439 {
1440 if (result != null)
1441 {
1442 player.Send("getupdates", result["curver"].ToString());
1443 }
1444 });
1445 break;
1446 #endregion
1447 #region downloadupdates
1448 case "downloadupdates":
1449 PlayerIO.BigDB.Load("Extra", "Updates", delegate(DatabaseObject result)
1450 {
1451 if (result != null)
1452 {
1453 player.Send("downloadupdates", result["curdownload"].ToString());
1454 }
1455 });
1456 break;
1457 #endregion
1458 }
1459 }
1460 public void DealWithFont(MyPlayer player, Message message)
1461 {
1462 string fontName = "";
1463 string owner = "";
1464 string font = "?";
1465 string description = "";
1466 switch (message.Type)
1467 {
1468 #region publishfont
1469 case "publishfont":
1470 int space = 0; //set key thing
1471 Regex r = new Regex("^[a-zA-Z0-9_]*$");
1472 Match match = r.Match(message.GetString(2));
1473 if (match.Success && message.GetString(2).Length < 20)
1474 {
1475 PlayerIO.BigDB.Load("Fonts", "desc", delegate(DatabaseObject result) //load item 0
1476 {
1477 if (result != null)
1478 {
1479 int amt = (int)result["amt"];
1480 string newnum = (amt + 1).ToString();
1481 result.Set("amt", amt + 1);
1482 result.Save();
1483 space = amt + 1;
1484 PlayerIO.BigDB.LoadOrCreate("Fonts", (amt + 1).ToString(), delegate(DatabaseObject result2)
1485 {
1486 if (result2 != null)
1487 {
1488 result2.Set("name", message.GetString(2));
1489 result2.Set("owner", player.name);
1490 result2.Set("font", message.GetString(0));
1491 result2.Set("description", message.GetString(1));
1492 result2.Save();
1493 }
1494 });
1495 }
1496 });
1497 }
1498 else
1499 {
1500 player.Send("chat", "Bad font name. Please do not include \"\\\" or \"/\"");
1501 }
1502 break;
1503 #endregion
1504 #region downloadfont
1505 case "downloadfont":
1506 PlayerIO.BigDB.Load("Fonts", message.GetString(0), delegate(DatabaseObject result) //load item 0
1507 {
1508 if (result != null)
1509 {
1510 fontName = result["name"].ToString();
1511 owner = result["owner"].ToString();
1512 font = result["font"].ToString();
1513 description = result["description"].ToString();
1514 player.Send("downloadfont", fontName, owner, description, font, message.GetString(0));
1515 }
1516 });
1517 break;
1518 #endregion
1519 #region getamt
1520 case "getamt":
1521 PlayerIO.BigDB.Load("Fonts", "desc", delegate(DatabaseObject result) //load item 0
1522 {
1523 if (result != null)
1524 {
1525 player.Send("getamt", result["amt"].ToString());
1526 }
1527 });
1528 break;
1529 #endregion
1530 }
1531 }
1532 public void DealWithFriend(MyPlayer player, Message message)
1533 {
1534 switch (message.Type)
1535 {
1536 #region 1
1537 #endregion
1538 #region 2
1539 case "friendaccept":
1540 PlayerIO.BigDB.Load("Users", player.ConnectUserId, delegate(DatabaseObject result)
1541 {
1542 if (result != null)
1543 {
1544 if (result["friendrequests"].ToString().Contains(message.GetString(0) + "|"))
1545 {
1546 result.Set("friends", result["friends"].ToString() + message.GetString(0) + "|");
1547 result.Set("friendrequests", result["friendrequests"].ToString().Replace(message.GetString(0) + "|", ""));
1548 result.Save();
1549 player.Send("msgbox", "Accepted friend request!");
1550 }
1551 else
1552 player.Send("msgbox", "The person you're trying to accept doesn't exist.");
1553 }
1554 else
1555 {
1556 player.Send("msgbox", "Your account doesn't exist.");
1557 }
1558 });
1559 break;
1560 #endregion
1561 #region 3
1562 case "frienddecline":
1563 PlayerIO.BigDB.Load("Users", player.ConnectUserId, delegate(DatabaseObject result)
1564 {
1565 if (result != null)
1566 {
1567 if (result["friendrequests"].ToString().Contains(message.GetString(0) + "|"))
1568 {
1569 result.Set("friendrequests", result["friendrequests"].ToString().Replace(message.GetString(0) + "|", ""));
1570 result.Save();
1571 player.Send("msgbox", "Declined friend request!");
1572 }
1573 else
1574 player.Send("msgbox", "The person you're trying to decline doesn't exist.");
1575 }
1576 });
1577 break;
1578 #endregion
1579 #region friends
1580 case "friends":
1581 PlayerIO.BigDB.Load("Users", player.ConnectUserId, delegate(DatabaseObject result)
1582 {
1583 if (result != null)
1584 {
1585 player.Send("friends", result["friends"].ToString().Split('|'));
1586 }
1587 });
1588 break;
1589 #endregion
1590 }
1591 }
1592 }
1593}