using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Collections; namespace Chop.Game.Moderation { public class CryForHelpManager { private Hashtable mMessages; private Thread Cleaner; public CryForHelpManager() { mMessages = new Hashtable(); } public void Init() { Cleaner = new Thread(new ThreadStart(deleteSolvedCFHs)); Cleaner.Start(); } public CryForHelp GetMessage(string pUsername) { lock (mMessages) { foreach (CryForHelp message in mMessages.Values) if (message.Username == pUsername && message.PickedUp == false) return message; return null; } } public CryForHelp GetMessage(int pID) { lock (mMessages) { foreach (CryForHelp message in mMessages.Values) if (message.ID == pID) return message; return null; } } public void DeleteMessage(int pID) { // we need to make a clone so we don't get any errors Hashtable copy = (Hashtable)mMessages.Clone(); foreach (CryForHelp message in copy.Values) if (message.ID == pID) { ResponseBuilder Message = new ResponseBuilder(273); // "DQ": [[#hobba_handler, #handle_delete_cry]] Message.AppendWired(pID); Message.AppendChar(2); Core.ClientManager.SendMessage(Message, "fuse_receive_calls_for_help"); mMessages.Remove(pID); } } public void AddMessage(string Username, string IP, string Message, int RoomID, string RoomName) { int ID = getFreeID(); mMessages.Add(ID, new CryForHelp(ID, Username, IP, Message, RoomID, RoomName)); } public void SendReply(int messageID, string message) { CryForHelp CFH = GetMessage(messageID); if (CFH != null && Core.ClientManager.GetClientByHabbo(CFH.Username) != null) { ResponseBuilder Message = new ResponseBuilder(274); // "DR" Message.AppendString(message); Core.ClientManager.GetClientByHabbo(CFH.Username).SendMessage(Message); } } public void PickupMessage(int messageID) { CryForHelp message = GetMessage(messageID); message.PickedUp = true; message.Picked = DateTime.Now; } private int getFreeID() { int i = 0; while (mMessages.ContainsKey(i)) i++; return i; } private void deleteSolvedCFHs() { while (true) { // we need to make a clone so we don't get any errors Hashtable copy = (Hashtable)mMessages.Clone(); foreach (CryForHelp Message in copy.Values) { if (Message.PickedUp && (Message.Picked - DateTime.Now).Minutes >= 5) // Give the moderator 5 minutes to handle the message before it is deleted. TODO: Deletion time configureable in database? DeleteMessage(Message.ID); } Thread.Sleep(10000); // check every 10 secs } } } }