Пример #1
0
        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;
                }
            }
        }