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); } }
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); }
public virtual void PlayerJoin(MatrixUser user) { if (users.Count < MaxPlayers && !GameInSession && user.UserID != "@cardbot:half-shot.uk") { users.Add(user); } }
public static void Main(string[] args) { MatrixClient client = new MatrixClient(""); client.LoginWithPassword("", ""); MatrixUser user = client.GetUser(""); }
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); }
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); }
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); }
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>(); }
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; }
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(); } }
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(); } } } }
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; }
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); }
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); }
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); }
public AndersonParagraph(MatrixUser user) { User = user; }
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."); }
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"); }