static void Connect(object socketO) { Socket socket = (Socket)socketO; string ip = socket.RemoteEndPoint.ToString().Split(':')[0]; while (socket.Connected) { byte[] b = new byte[1001]; int e; e = socket.Receive(b) - 1; byte tag = b[0]; b = b.Skip(1).ToArray(); if (e == -1) { socket.Disconnect(true); return; } Civ civ; ushort id; switch (tag) { //Get civ case 0: id = BitConverter.ToUInt16(b.Take(e).ToArray(), 0); if (id == 0) { if (!cfg.HasPerm(ip, Permission.Civ)) { break; } civ = new Civ(GetLowestID()); Log.WriteLine("Reserved civ #" + civ.CivID + ".", ip); Civilians.Add(civ); socket.Send(new byte[] { 0 }.Concat(civ.ToBytes()).ToArray()); } else { try { if (!cfg.HasPerm(ip, Permission.Civ) && !cfg.HasPerm(ip, Permission.Dispatch)) { break; } socket.Send(new byte[] { 0 }.Concat(Civilians.Find(x => x.CivID == id).ToBytes()).ToArray()); Log.WriteLine("Sent civ #" + id + ".", ip); } catch { socket.Send(new byte[] { 1 }); Log.WriteLine("Retrieving civ #" + id + " returned empty.", ip); } } break; //Update civ case 1: if (!cfg.HasPerm(ip, Permission.Civ)) { break; } civ = Civ.ToCiv(b.Take(e).ToArray()); Civ fCiv = Civilians.Find(x => x.CivID == civ.CivID); if (fCiv != null) { int i = Civilians.IndexOf(fCiv); List <Ticket> Tickets = Civilians[i].Tickets; Civilians[i] = civ; Civilians[i].Tickets = Tickets; Log.WriteLine("Updated civ #" + civ.CivID + ".", ip); } else { Civilians.Add(civ); Log.WriteLine("Saved civ #" + civ.CivID + ".", ip); } break; //Plate check case 2: if (!cfg.HasPerm(ip, Permission.Dispatch)) { break; } string plate = Encoding.UTF8.GetString(b.Take(e).ToArray()); civ = Civilians.Find(x => x.RegisteredPlate == plate); if (civ == null) { socket.Send(new byte[] { 1 }); Log.WriteLine("Plate check \"" + plate + "\" returned empty.", ip); break; } socket.Send(new byte[] { 0 }.Concat(BitConverter.GetBytes(civ.CivID)).ToArray()); Log.WriteLine("Plate checked \"" + plate + "\".", ip); break; //Add ticket case 3: if (!cfg.HasPerm(ip, Permission.Police)) { break; } string[] vars = Encoding.UTF8.GetString(b.Take(e).ToArray()).Split('|'); civ = Civilians.Find(x => x.CivID == ushort.Parse(vars[0])); if (civ == null) { socket.Send(new byte[] { 1 }); Log.WriteLine("Ticketing civ #" + vars[0] + " returned empty.", ip); break; } civ.Tickets.Add(Ticket.Parse(vars[1])); socket.Send(new byte[] { 0 }); Log.WriteLine("Ticketed civ #" + vars[0] + ".", ip); break; //Delete records on a civ but still reserve it case 4: if (!cfg.HasPerm(ip, Permission.Civ)) { break; } id = BitConverter.ToUInt16(b.Take(e).ToArray(), 0); civ = Civilians.Find(x => x.CivID == id); if (civ == null) { socket.Send(new byte[] { 1 }); Log.WriteLine("Deleting civ #" + id + " returned empty.", ip); break; } Civilians.Remove(civ); socket.Send(new byte[] { 0 }); Log.WriteLine("Deleted civ #" + id, ip); break; //Name check case 5: if (!cfg.HasPerm(ip, Permission.Dispatch)) { break; } string name = Encoding.UTF8.GetString(b.Take(e).ToArray()); civ = Civilians.Find(x => x.Name == name); if (civ == null) { socket.Send(new byte[] { 1 }); Log.WriteLine("Name check on \"" + name + "\" returned empty.", ip); break; } socket.Send(new byte[] { 0 }.Concat(BitConverter.GetBytes(civ.CivID)).ToArray()); Log.WriteLine("Name checked \"" + name + "\"."); break; } } }