Beispiel #1
0
        public static void PostMemo(string guid, object contents)
        {
            MUDMemo        memo  = contents as MUDMemo;
            List <MUDMemo> memos = new List <MUDMemo>();

            if (File.Exists("memos.json"))
            {
                memos = JsonConvert.DeserializeObject <List <MUDMemo> >(File.ReadAllText("memos.json"));
            }

            memos.Add(memo);
            File.WriteAllText("memos.txt", JsonConvert.SerializeObject(memos));
        }
Beispiel #2
0
        public static void Interpret(ServerMessage msg)
        {
            Dictionary <string, object> args = null;

            try
            {
                Console.WriteLine($@"Message received from {msg.GUID}: {msg.Name}

Contents:
{msg.Contents}");

                if (!string.IsNullOrWhiteSpace(msg.Contents))
                {
                    try
                    {
                        //It's gotta be JSON.
                        if (msg.Contents.StartsWith("{"))
                        {
                            args = JsonConvert.DeserializeObject <Dictionary <string, object> >(msg.Contents);
                        }
                    }
                    catch
                    {
                        //Damnit, we were wrong.
                        args = null;
                    }
                }

                switch (msg.Name)
                {
                case "mud_login":
                    if (args["username"] != null && args["password"] != null)
                    {
                        foreach (var savefile in Directory.GetFiles("saves"))
                        {
                            try
                            {
                                var save = JsonConvert.DeserializeObject <Save>(File.ReadAllText(savefile));

                                if (save.Username == args["username"].ToString() && save.Password == args["password"].ToString())
                                {
                                    server.DispatchTo(new Guid(msg.GUID), new NetObject("mud_savefile", new ServerMessage
                                    {
                                        Name     = "mud_savefile",
                                        GUID     = "server",
                                        Contents = File.ReadAllText(savefile)
                                    }));
                                    return;
                                }
                            }
                            catch { }
                        }
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("auth_failed", new ServerMessage
                        {
                            Name = "mud_login_denied",
                            GUID = "server"
                        }));
                    }
                    else
                    {
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("auth_failed", new ServerMessage
                        {
                            Name = "mud_login_denied",
                            GUID = "server"
                        }));
                    }
                    break;

                case "legion_create":
                    List <Legion> legions = new List <Legion>();
                    if (File.Exists("legions.json"))
                    {
                        legions = JsonConvert.DeserializeObject <List <Legion> >(File.ReadAllText("legions.json"));
                    }

                    var l = JsonConvert.DeserializeObject <Legion>(msg.Contents);

                    legions.Add(l);

                    File.WriteAllText("legions.json", JsonConvert.SerializeObject(legions, Formatting.Indented));
                    break;

                case "legion_get_all":
                    List <Legion> allLegions = new List <Legion>();

                    if (File.Exists("legions.json"))
                    {
                        allLegions = JsonConvert.DeserializeObject <List <Legion> >(File.ReadAllText("legions.json"));
                    }

                    server.DispatchTo(new Guid(msg.GUID), new NetObject("alllegions", new ServerMessage
                    {
                        Name     = "legion_all",
                        GUID     = "server",
                        Contents = JsonConvert.SerializeObject(allLegions)
                    }));
                    break;

                case "legion_get_users":
                    var lgn = JsonConvert.DeserializeObject <Legion>(msg.Contents);

                    List <string> userIDs = new List <string>();

                    foreach (var savfile in Directory.GetFiles("saves"))
                    {
                        try
                        {
                            var savefilecontents = JsonConvert.DeserializeObject <Save>(File.ReadAllText(savfile));
                            if (savefilecontents.CurrentLegions.Contains(lgn.ShortName))
                            {
                                userIDs.Add($"{savefilecontents.Username}@{savefilecontents.SystemName}");
                            }
                        }
                        catch { }
                    }

                    server.DispatchTo(new Guid(msg.GUID), new NetObject("userlist", new ServerMessage
                    {
                        Name     = "legion_users_found",
                        GUID     = "server",
                        Contents = JsonConvert.SerializeObject(userIDs)
                    }));
                    break;

                case "user_get_legion":
                    var userSave = JsonConvert.DeserializeObject <Save>(msg.Contents);

                    if (File.Exists("legions.json"))
                    {
                        var legionList = JsonConvert.DeserializeObject <List <Legion> >(File.ReadAllText("legions.json"));
                        foreach (var legion in legionList)
                        {
                            if (userSave.CurrentLegions.Contains(legion.ShortName))
                            {
                                server.DispatchTo(new Guid(msg.GUID), new NetObject("reply", new ServerMessage
                                {
                                    Name     = "user_legion",
                                    GUID     = "server",
                                    Contents = JsonConvert.SerializeObject(legion)
                                }));
                                return;
                            }
                        }
                    }

                    server.DispatchTo(new Guid(msg.GUID), new NetObject("f**k", new ServerMessage
                    {
                        Name = "user_not_found_in_legion",
                        GUID = "server"
                    }));

                    break;

                case "mud_save":
                    var sav = JsonConvert.DeserializeObject <Save>(msg.Contents);
                    File.WriteAllText("saves/" + sav.Username + ".save", JsonConvert.SerializeObject(sav, Formatting.Indented));

                    server.DispatchTo(new Guid(msg.GUID), new NetObject("auth_failed", new ServerMessage
                    {
                        Name = "mud_saved",
                        GUID = "server"
                    }));

                    break;

                case "mud_checkuserexists":
                    if (args["username"] != null && args["password"] != null)
                    {
                        foreach (var savefile in Directory.GetFiles("saves"))
                        {
                            try
                            {
                                var save = JsonConvert.DeserializeObject <Save>(File.ReadAllText(savefile));

                                if (save.Username == args["username"].ToString() && save.Password == args["password"].ToString())
                                {
                                    server.DispatchTo(new Guid(msg.GUID), new NetObject("mud_savefile", new ServerMessage
                                    {
                                        Name = "mud_found",
                                        GUID = "server",
                                    }));
                                    return;
                                }
                            }
                            catch { }
                        }
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("auth_failed", new ServerMessage
                        {
                            Name = "mud_notfound",
                            GUID = "server"
                        }));
                    }
                    else
                    {
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("auth_failed", new ServerMessage
                        {
                            Name = "mud_notfound",
                            GUID = "server"
                        }));
                    }
                    break;
                    break;

                case "pong_gethighscores":
                    if (File.Exists("pong_highscores.json"))
                    {
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("pongstuff", new ServerMessage
                        {
                            Name     = "pong_highscores",
                            GUID     = "server",
                            Contents = File.ReadAllText("pong_highscores.json")
                        }));
                    }
                    break;

                case "get_memos_for_user":
                    if (args["username"] != null)
                    {
                        string usrname = args["username"].ToString();

                        List <MUDMemo> mmos = new List <MUDMemo>();

                        if (File.Exists("memos.json"))
                        {
                            foreach (var mmo in JsonConvert.DeserializeObject <MUDMemo[]>(File.ReadAllText("memos.json")))
                            {
                                if (mmo.UserTo == usrname)
                                {
                                    mmos.Add(mmo);
                                }
                            }
                        }

                        server.DispatchTo(new Guid(msg.GUID), new NetObject("mud_memos", new ServerMessage
                        {
                            Name     = "mud_usermemos",
                            GUID     = "server",
                            Contents = JsonConvert.SerializeObject(mmos)
                        }));
                    }
                    break;

                case "mud_post_memo":
                    MUDMemo        memo  = JsonConvert.DeserializeObject <MUDMemo>(msg.Contents);
                    List <MUDMemo> memos = new List <MUDMemo>();

                    if (File.Exists("memos.json"))
                    {
                        memos = JsonConvert.DeserializeObject <List <MUDMemo> >(File.ReadAllText("memos.json"));
                    }

                    memos.Add(memo);
                    File.WriteAllText("memos.txt", JsonConvert.SerializeObject(memos));


                    break;

                case "pong_sethighscore":
                    var hs = new List <PongHighscore>();
                    if (File.Exists("pong_highscores.json"))
                    {
                        hs = JsonConvert.DeserializeObject <List <PongHighscore> >(File.ReadAllText("ponghighscores.json"));
                    }

                    var newHS = JsonConvert.DeserializeObject <PongHighscore>(msg.Contents);
                    for (int i = 0; i <= hs.Count; i++)
                    {
                        try
                        {
                            if (hs[i].UserName == newHS.UserName)
                            {
                                if (newHS.HighestLevel > hs[i].HighestLevel)
                                {
                                    hs[i].HighestLevel = newHS.HighestLevel;
                                }
                                if (newHS.HighestCodepoints > hs[i].HighestCodepoints)
                                {
                                    hs[i].HighestCodepoints = newHS.HighestCodepoints;
                                }
                                File.WriteAllText("pong_highscores.json", JsonConvert.SerializeObject(hs));
                                return;
                            }
                        }
                        catch
                        {
                        }
                    }
                    hs.Add(newHS);
                    File.WriteAllText("pong_highscores.json", JsonConvert.SerializeObject(hs));
                    return;

                case "getvirusdb":
                    if (!File.Exists("virus.db"))
                    {
                        File.WriteAllText("virus.db", "{}");
                    }

                    server.DispatchTo(new Guid(msg.GUID), new NetObject("vdb", new ServerMessage
                    {
                        Name     = "virusdb",
                        GUID     = "server",
                        Contents = File.ReadAllText("virus.db")
                    }));
                    break;

                case "getvirus":
                    Dictionary <string, string> virusDB = new Dictionary <string, string>();

                    if (File.Exists("virus.db"))
                    {
                        virusDB = JsonConvert.DeserializeObject <Dictionary <string, string> >(File.ReadAllText("virus.db"));
                    }

                    foreach (var kv in virusDB)
                    {
                        if (kv.Key == msg.Contents)
                        {
                            server.DispatchTo(new Guid(msg.GUID), new NetObject("response", new ServerMessage
                            {
                                Name     = "mud_virus",
                                GUID     = "server",
                                Contents = kv.Value,
                            }));
                            return;
                        }
                    }


                    break;

                case "mud_scanvirus":
                    Dictionary <string, string> _virusDB = new Dictionary <string, string>();

                    bool addIfNotFound = true;

                    if (msg.Contents.Contains("||scanonly"))
                    {
                        addIfNotFound = false;
                    }

                    msg.Contents = msg.Contents.Replace("||scanonly", "");

                    if (File.Exists("virus.db"))
                    {
                        _virusDB = JsonConvert.DeserializeObject <Dictionary <string, string> >(File.ReadAllText("virus.db"));
                    }

                    foreach (var kv in _virusDB)
                    {
                        if (kv.Value == msg.Contents)
                        {
                            server.DispatchTo(new Guid(msg.GUID), new NetObject("response", new ServerMessage
                            {
                                Name     = "mud_virus_signature",
                                GUID     = "server",
                                Contents = kv.Key,
                            }));
                            return;
                        }
                    }

                    if (addIfNotFound == true)
                    {
                        string newguid = Guid.NewGuid().ToString();
                        _virusDB.Add(newguid, msg.Contents);
                        File.WriteAllText("virus.db", JsonConvert.SerializeObject(_virusDB, Formatting.Indented));
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("response", new ServerMessage
                        {
                            Name     = "mud_virus_signature",
                            GUID     = "server",
                            Contents = newguid,
                        }));
                    }
                    else
                    {
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("response", new ServerMessage
                        {
                            Name     = "mud_virus_signature",
                            GUID     = "server",
                            Contents = "unknown",
                        }));
                    }
                    return;

                case "chat_join":
                    if (args.ContainsKey("id"))
                    {
                        var cuser = new Save();
                        if (args.ContainsKey("user"))
                        {
                            cuser = JsonConvert.DeserializeObject <Save>(JsonConvert.SerializeObject(args["user"]));
                        }
                        int    index   = -1;
                        string chat_id = args["id"] as string;
                        foreach (var chat in chats)
                        {
                            if (chat.ID == chat_id)
                            {
                                if (chat.Users.Count < chat.MaxUsers || chat.MaxUsers == 0)
                                {
                                    //user can join chat.
                                    if (cuser != null)
                                    {
                                        index = chats.IndexOf(chat);
                                    }
                                }
                            }
                        }
                        if (index > -1)
                        {
                            chats[index].Users.Add(cuser);
                            server.DispatchAll(new NetObject("broadcast", new ServerMessage
                            {
                                Name     = "cbroadcast",
                                GUID     = "server",
                                Contents = $"{chat_id}: {cuser.Username} {{CHAT_HAS_JOINED}}"
                            }));
                        }
                        else
                        {
                            server.DispatchTo(new Guid(msg.GUID), new NetObject("broadcast", new ServerMessage
                            {
                                Name     = "cbroadcast",
                                GUID     = "server",
                                Contents = $"{chat_id}: {{CHAT_NOT_FOUND_OR_TOO_MANY_MEMBERS}}"
                            }));
                        }
                    }
                    break;

                case "chat":
                    if (args.ContainsKey("id"))
                    {
                        var cuser = new Save();
                        if (args.ContainsKey("user"))
                        {
                            cuser = JsonConvert.DeserializeObject <Save>(JsonConvert.SerializeObject(args["user"]));
                        }
                        string message = "";
                        if (args.ContainsKey("msg"))
                        {
                            message = args["msg"] as string;
                        }

                        int    index   = -1;
                        string chat_id = args["id"] as string;
                        foreach (var chat in chats)
                        {
                            if (chat.ID == chat_id)
                            {
                                if (cuser != null && !string.IsNullOrWhiteSpace(message) && UserInChat(chat, cuser))
                                {
                                    index = chats.IndexOf(chat);
                                }
                            }
                        }
                        if (index > -1)
                        {
                            server.DispatchAll(new NetObject("broadcast", new ServerMessage
                            {
                                Name     = "cbroadcast",
                                GUID     = "server",
                                Contents = $"{chat_id}/{cuser.Username}: {message}"
                            }));
                        }
                        else
                        {
                            server.DispatchTo(new Guid(msg.GUID), new NetObject("broadcast", new ServerMessage
                            {
                                Name     = "cbroadcast",
                                GUID     = "server",
                                Contents = $"{chats[index].ID}: {{CHAT_NOT_FOUND_OR_NOT_IN_CHAT}}"
                            }));
                        }
                    }

                    break;

                case "chat_leave":
                    if (args.ContainsKey("id"))
                    {
                        var cuser = new Save();
                        if (args.ContainsKey("user"))
                        {
                            cuser = JsonConvert.DeserializeObject <Save>(JsonConvert.SerializeObject(args["user"]));
                        }
                        int    index   = -1;
                        string chat_id = args["id"] as string;
                        foreach (var chat in chats)
                        {
                            if (chat.ID == chat_id)
                            {
                                if (cuser != null && UserInChat(chat, cuser))
                                {
                                    index = chats.IndexOf(chat);
                                }
                            }
                        }
                        if (index > -1)
                        {
                            server.DispatchAll(new NetObject("broadcast", new ServerMessage
                            {
                                Name     = "cbroadcast",
                                GUID     = "server",
                                Contents = $"{chats[index].ID}: {cuser.Username} {{HAS_LEFT_CHAT}}"
                            }));
                        }
                        else
                        {
                            server.DispatchTo(new Guid(msg.GUID), new NetObject("broadcast", new ServerMessage
                            {
                                Name     = "cbroadcast",
                                GUID     = "server",
                                Contents = $"{chat_id}: {{CHAT_NOT_FOUND_OR_NOT_IN_CHAT}}"
                            }));
                        }
                    }
                    break;

                case "chat_create":
                    string id        = "";
                    string topic     = "";
                    string name      = "";
                    int    max_users = 0;

                    if (args.ContainsKey("id"))
                    {
                        id = args["id"] as string;
                    }
                    if (args.ContainsKey("topic"))
                    {
                        name = args["topic"] as string;
                    }
                    if (args.ContainsKey("name"))
                    {
                        topic = args["name"] as string;
                    }
                    if (args.ContainsKey("max_users"))
                    {
                        max_users = Convert.ToInt32(args["max_users"].ToString());
                    }

                    bool id_taken = false;

                    foreach (var chat in chats)
                    {
                        if (chat.ID == id)
                        {
                            id_taken = true;
                        }
                    }

                    if (id_taken == false)
                    {
                        chats.Add(new Channel
                        {
                            ID       = id,
                            Name     = name,
                            Topic    = topic,
                            MaxUsers = max_users,
                            Users    = new List <Save>()
                        });
                        SaveChats();
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("broadcast", new ServerMessage
                        {
                            Name     = "cbroadcast",
                            GUID     = "server",
                            Contents = $"{id}: {{SUCCESSFULLY_CREATED_CHAT}}"
                        }));
                    }
                    else
                    {
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("broadcast", new ServerMessage
                        {
                            Name     = "cbroadcast",
                            GUID     = "server",
                            Contents = $"{id}: {{ID_TAKEN}}"
                        }));
                    }

                    break;

                case "broadcast":
                    string text = msg.Contents;
                    if (!string.IsNullOrWhiteSpace(text))
                    {
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("runme", new ServerMessage
                        {
                            Name     = "broadcast",
                            GUID     = "Server",
                            Contents = text
                        }));
                    }
                    break;

                case "lua_up":
                    string lua       = msg.Contents;
                    string firstLine = lua.Split(new[] { Environment.NewLine }, StringSplitOptions.None)[0];
                    firstLine = firstLine.Remove(0, 3);     //delete the comment
                    string[] a = firstLine.Split('.');
                    if (!Directory.Exists("scripts/" + a[0]))
                    {
                        Directory.CreateDirectory($"scripts/{a[0]}");
                    }
                    File.WriteAllText($"scripts/{a[0]}/{a[1]}.lua", lua);
                    break;

                case "mudhack_init":
                    if (MUDHackPasswords.ContainsKey(msg.GUID))
                    {
                        MUDHackPasswords.Remove(msg.GUID);
                    }

                    MUDHackPasswords.Add(msg.GUID, GenerateRandomPassword());


                    server.DispatchTo(new Guid(msg.GUID), new NetObject("mudhack_init", new ServerMessage
                    {
                        Name     = "mudhack_init",
                        GUID     = "SERVER",
                        Contents = MUDHackPasswords[msg.GUID],
                    }));

                    break;

                case "mudhack_verify":
                    if (!MUDHackPasswords.ContainsKey(msg.GUID))
                    {
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("mudhack_init", new ServerMessage
                        {
                            Name     = "server_error",
                            GUID     = "SERVER",
                            Contents = "{SRV_HACK_NOT_INITIATED}",
                        }));
                        return;
                    }

                    string pass = "";
                    if (args.ContainsKey("pass"))
                    {
                        pass = args["pass"] as string;
                    }

                    if (pass == MUDHackPasswords[msg.GUID])
                    {
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("mudhack_init", new ServerMessage
                        {
                            Name = "mudhack_granted",
                            GUID = "SERVER",
                        }));
                    }
                    else
                    {
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("mudhack_init", new ServerMessage
                        {
                            Name = "mudhack_denied",
                            GUID = "SERVER",
                        }));
                    }
                    break;

                case "mudhack_killpass":
                    if (MUDHackPasswords.ContainsKey(msg.GUID))
                    {
                        MUDHackPasswords.Remove(msg.GUID);
                    }
                    break;

                case "mudhack_getallusers":
                    List <OnlineUser> users = new List <OnlineUser>();

                    foreach (var chat in chats)
                    {
                        foreach (var usr in chat.Users)
                        {
                            var ousr = new OnlineUser();
                            ousr.Username   = usr.Username;
                            ousr.OnlineChat = chat.ID;
                            users.Add(ousr);
                        }
                    }

                    server.DispatchTo(new Guid(msg.GUID), new NetObject("mudhack_users", new ServerMessage
                    {
                        Name     = "mudhack_users",
                        GUID     = "SERVER",
                        Contents = JsonConvert.SerializeObject(users),
                    }));
                    break;

                case "getguid_reply":
                    msg.GUID = "server";
                    //The message's GUID was manipulated by the client to send to another client.
                    //So we can just bounce back the message to the other client.
                    server.DispatchTo(new Guid(msg.GUID), new NetObject("bounce", msg));
                    break;

                case "getguid_send":
                    string username = msg.Contents;
                    string guid     = msg.GUID;
                    server.DispatchAll(new NetObject("are_you_this_guy", new ServerMessage
                    {
                        Name     = "getguid_fromserver",
                        GUID     = guid,
                        Contents = username,
                    }));
                    break;

                case "script":
                    string user   = "";
                    string script = "";
                    string sArgs  = "";

                    if (!args.ContainsKey("user"))
                    {
                        throw new Exception("No 'user' arg specified in message to server");
                    }

                    if (!args.ContainsKey("script"))
                    {
                        throw new Exception("No 'script' arg specified in message to server");
                    }

                    if (!args.ContainsKey("args"))
                    {
                        throw new Exception("No 'args' arg specified in message to server");
                    }

                    user   = args["user"] as string;
                    script = args["script"] as string;
                    sArgs  = args["args"] as string;

                    if (File.Exists($"scripts/{user}/{script}.lua"))
                    {
                        var script_arguments = JsonConvert.DeserializeObject <Dictionary <string, object> >(sArgs);
                        server.DispatchTo(new Guid(msg.GUID), new NetObject("runme", new ServerMessage {
                            Name     = "run",
                            GUID     = "Server",
                            Contents = $@"{{
    script:""{File.ReadAllText($"scripts/{user}/{script}.lua").Replace("\"", "\\\"")}"",
    args:""{sArgs}""
}}"
                        }));
                    }
                    else
                    {
                        throw new Exception($"{user}.{script}: Script not found.");
                    }
                    break;

                default:
                    throw new Exception($"Server couldn't decipher this message:\n\n{JsonConvert.SerializeObject(msg)}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("An error occurred with that one.");
                Console.WriteLine(ex);

                server.DispatchTo(new Guid(msg.GUID), new NetObject("error", new ServerMessage {
                    Name = "Error", GUID = "Server", Contents = JsonConvert.SerializeObject(ex)
                }));
            }
        }