예제 #1
0
        void Room_OnEvent(MatrixRoom room, MatrixEvent evt)
        {
            if (evt.sender == null)
            {
                return;
            }
            MatrixUser user = client.GetUser(evt.sender);

            //Deal with players leaving or joining
            if (evt.type == "m.room.member")
            {
                EMatrixRoomMembership memtype = ((MatrixMRoomMember)evt.content).membership;
                if (memtype == EMatrixRoomMembership.Leave)
                {
                    PlayerLeave(user);
                }
                else if (memtype == EMatrixRoomMembership.Join)
                {
                    PlayerJoin(user);
                }
            }
            else if (evt.type == "m.room.message")
            {
                PlayerMessage(user, (MatrixMRoomMessage)evt.content);
            }
        }
예제 #2
0
        private MatrixRoom CreateLobbyRoom(MatrixUser sender, string gamename)
        {
            MatrixRoom room = client.CreateRoom(new MatrixSDK.Structures.MatrixCreateRoom()
            {
                invite = new string[1] {
                    sender.UserID
                },
                name       = "[Card] " + gamename + " Lobby",
                topic      = gamename + " Lobby for " + sender.DisplayName,
                visibility = EMatrixCreateRoomVisibility.Public
            });

            room.ApplyNewPowerLevels(new MatrixSDK.Structures.MatrixMRoomPowerLevels()
            {
                events_default = 10,
                users          = new System.Collections.Generic.Dictionary <string, int>()
                {
                    { "@cardbot:half-shot.uk", 100 }, { sender.UserID, 80 }
                },
                state_default = 80,
                redact        = 20,
                ban           = 80,
                kick          = 80,
                users_default = 10
            });
            return(room);
        }
예제 #3
0
 public virtual void PlayerJoin(MatrixUser user)
 {
     if (users.Count < MaxPlayers && !GameInSession && user.UserID != "@cardbot:half-shot.uk")
     {
         users.Add(user);
     }
 }
예제 #4
0
        public static void Main(string[] args)
        {
            MatrixClient client = new MatrixClient("");

            client.LoginWithPassword("", "");
            MatrixUser user = client.GetUser("");
        }
예제 #5
0
        private void CallCheatOnPlayer(MatrixUser caller)
        {
            room.SendNotice(caller.DisplayName + " called " + users[lastPlayer].DisplayName + " a cheat...");
            System.Threading.Thread.Sleep(1000);
            cheatCalled = true;
            string reciever;

            if (playerLied)
            {
                room.SendNotice("They are correct! The cheat will recieve " + deck.Count + " cards.");
                reciever = users[lastPlayer].UserID;
            }
            else
            {
                room.SendNotice("They are incorrect! The caller will recieve " + deck.Count + " cards.");
                reciever = caller.UserID;
            }

            while (deck.Count > 0)
            {
                hands[reciever].Add(deck[0]);
                deck.RemoveAt(0);
            }
            SendDeckUpdate(reciever);
        }
예제 #6
0
        public void CreateCheatLobby(string sender)
        {
            MatrixUser user = client.GetUser(sender);
            MatrixRoom room = CreateLobbyRoom(user, "Cheat");

            Lobby lobby = new CheatLobby(room, user, client);

            lobbies.Add(lobby);
        }
예제 #7
0
        public void CreateTicTacToeLobby(string sender)
        {
            MatrixUser user = client.GetUser(sender);
            MatrixRoom room = CreateLobbyRoom(user, "Tic Tac Toe");

            Lobby lobby = new TicTacToe(room, user, client);

            lobbies.Add(lobby);
        }
예제 #8
0
 public Lobby(MatrixRoom Room, MatrixUser Owner, MatrixClient Client)
 {
     room   = Room;
     owner  = Owner;
     client = Client;
     room.SendMessage("You've created a new lobby, the game will commence once the owner has said 'START'");
     room.OnEvent += Room_OnEvent;
     users         = new List <MatrixUser>();
 }
예제 #9
0
 public CheatLobby(MatrixRoom Room, MatrixUser Owner, MatrixClient Client) : base(Room, Owner, Client)
 {
     room.SendMessage("This lobby is for 'Cheat'.");
     room.SendMessage(new MMessageCustomHTML()
     {
         body           = "See https://en.wikipedia.org/wiki/Cheat_%28game%29#Gameplay for help",
         formatted_body = " See <a href=\"https://en.wikipedia.org/wiki/Cheat_%28game%29#Gameplay\">the wikipedia page</a> for help"
     });
     room.SendNotice("This game requires you to keep your hand hidden, so a secondary invite has also been sent");
     room.SendNotice("To call cheat on the current player, say 'Cheat! in this room.'");
     MinPlayers = 2;
     MaxPlayers = 8;
 }
예제 #10
0
        public virtual void PlayerLeave(MatrixUser user)
        {
            int before = users.Count;

            users.RemoveAll(x => x.UserID == user.UserID);
            if (users.Count == 0)
            {
                this.Dispose();
            }
            if (GameInSession && before != users.Count)
            {
                room.SendMessage("The game was abandoned by " + user.DisplayName);
                this.Dispose();
            }
        }
예제 #11
0
 private void CheckForWinner()
 {
     if (lastPlayer != -1)
     {
         if (hands[users[lastPlayer].UserID].Count == 0)
         {
             MatrixUser user = users[lastPlayer];
             room.SendNotice("🎉" + user.DisplayName + " has cleared their hand!");
             users.Remove(user);
             if (users.Count == 1)
             {
                 GameInSession = true;
                 room.SendNotice("🎉 Game Over! Everyone wins except " + users[0].DisplayName);
                 Dispose();
             }
         }
     }
 }
예제 #12
0
        public void AddTextMessage(MatrixUser sender, MatrixEvent message)
        {
            string   messageText = message.content.mxContent["body"].ToString();
            DateTime time        = EpochStart.AddMilliseconds(message.origin_server_ts);

            var aMsg = new AndersonMessage(message.sender, messageText, time, MessageStatus.Sent);

            if (message.sender == _lastMessage?.User && (time - _lastMessage.SentTime) < InactiveDelay)
            {
                _lastParagraph.Messages.Add(aMsg);
            }
            else
            {
                var newLast = new AndersonParagraph(sender);
                newLast.Messages.Add(aMsg);
                Paragraphs.Add(newLast);
                _lastParagraph = newLast;
            }
            _lastMessage = aMsg;
        }
예제 #13
0
 public virtual bool PlayerMessage(MatrixUser user, MatrixMRoomMessage message)
 {
     if (user.UserID == "@cardbot:half-shot.uk")
     {
         return(true);
     }
     if (message.ToString() == "START" && user.UserID == owner.UserID)
     {
         if (users.Count < MinPlayers)
         {
             room.SendMessage("Cannot start, you need " + (MinPlayers - users.Count).ToString() + " more players");
         }
         else
         {
             GameStart();
         }
         return(true);
     }
     return(false);
 }
예제 #14
0
 public override bool PlayerMessage(MatrixUser user, MatrixMRoomMessage message)
 {
     if (!base.PlayerMessage(user, message))
     {
         if (GameInSession)
         {
             if (message.body.ToLower() == "count")
             {
                 string msg = "Card counts:\n";
                 foreach (MatrixUser u in users)
                 {
                     msg += user.DisplayName + " has " + hands[user.UserID].Count + " cards\n";
                 }
                 room.SendMessage(msg);
             }
             else if (message.body.ToLower() == "deck")
             {
                 room.SendMessage("The deck contains " + deck.Count + " cards");
             }
             else if (lastPlayer != -1)
             {
                 if (message.body.ToLower() == "cheat!" && user.UserID != users[lastPlayer].UserID)
                 {
                     if (!cheatCalled)
                     {
                         CallCheatOnPlayer(user);
                         CheckForWinner();
                     }
                     else
                     {
                         room.SendNotice("Cheat has already been called this round!");
                     }
                 }
             }
         }
     }
     return(false);
 }
예제 #15
0
        public override bool PlayerMessage(MatrixUser user, MatrixMRoomMessage message)
        {
            if (!base.PlayerMessage(user, message))
            {
                if (GameInSession)
                {
                    if (user.UserID != users[currentPlayer].UserID)
                    {
                        return(true);
                    }
                    string cmd = message.body.Trim().ToLower();
                    if (cmd.Length == 2)
                    {
                        int a = ((int)cmd[0]) - 96;
                        int b = int.Parse(new string(cmd[1], 1));
                        if (a < 1 || a > 3 || b < 1 || b > 3)
                        {
                            room.SendMessage("Invalid position");
                        }

                        int square = ((a - 1) * 3) + (b - 1);
                        if (brd[square] == 0)
                        {
                            brd[square] = currentPlayer + 1;
                            room.SendMessage(GetBoardString());
                            currentPlayer = currentPlayer == 0 ? 1 : 0;
                        }
                        else
                        {
                            room.SendMessage("That spot is taken");
                        }
                        CheckForWin();
                    }
                }
            }
            return(true);
        }
예제 #16
0
 public AndersonParagraph(MatrixUser user)
 {
     User = user;
 }
예제 #17
0
 public TicTacToe(MatrixRoom Room, MatrixUser Owner, MatrixClient Client) : base(Room, Owner, Client)
 {
     MinPlayers = 2;
     MaxPlayers = 2;
     room.SendMessage("The rules are simple, get a straight set of Xs or 0s. Type A1 for top left and C3 for bottom right.");
 }
예제 #18
0
    public void MatrixRoutine()
    {
        var storage = new Storage();

        client = new MatrixClient(storage.Server);
        cache  = new Cache(client);

        try{
            client.UseExistingToken(storage.UserId, storage.Token);
            this.user = client.GetUser();
            Gtk.Application.Invoke(delegate {
                var statusContext = statusbar.GetContextId("matrix");
                statusbar.Push(statusContext, "Logged in to " + storage.Server + " as " + storage.UserId);
                displayName.Text = user.DisplayName;
            });
        }catch (Exception loginException) {
            Gtk.Application.Invoke(delegate {
                var statusContext = statusbar.GetContextId("matrix");
                statusbar.Push(statusContext, "Login failed: " + loginException.Message);
            });

            storage.Token = null;
            storage.Save();
        }

        var rooms = client.GetAllRooms();

        channelList.AppendColumn("Icon", new Gtk.CellRendererPixbuf(), "pixbuf", 0);
        channelList.AppendColumn("Artist", new Gtk.CellRendererText(), "text", 1);


        var liststore = new ListStore(typeof(Gdk.Pixbuf), typeof(string));

        int roomIndex = 0;

        foreach (var channel in rooms)
        {
            var label = getRoomLabel(channel);
            var icon  = AvatarGenerator.createRoomAvatar(label, channel.Encryption != null);
            liststore.AppendValues(icon, label);
            this.rooms.Add(roomIndex, channel);
            roomIndex++;

            foreach (var member in channel.Members)
            {
                if (!this.users.ContainsKey(member.Key))
                {
                    this.users.Add(member.Key, member.Value);
                }
            }
        }

        channelList.Model = liststore;
        var avatar       = cache.GetAvatarObject(user.AvatarURL);
        var avatarScaled = Utils.resizeImage(System.Drawing.Image.FromStream(avatar), 48, 48);

        profileImage.Pixbuf = Utils.bitmapToPixbuf(avatarScaled);

        foreach (var member in this.users)
        {
            if (member.Value.avatar_url != null)
            {
                var memberAvatar = cache.GetAvatarObject(member.Value.avatar_url);
                var scaled       = Utils.resizeImage(System.Drawing.Image.FromStream(memberAvatar), 32, 32);
                this.avatars.Add(member.Key, scaled);
            }
        }
        refreshRoomList();
        Console.WriteLine("Matrix thread done");
    }