private void ReportStatus(object state) { MatrixRoom room = Client.GetRoom (statusOpts.Room); if (room == null) { room = Client.JoinRoom (statusOpts.Room); } if (room == null) { //Couldn't update status. //TODO: Fail somehow. StopStatusReporting(); } HSStatusEvent evt = new HSStatusEvent(){ name = statusOpts.ProductName, status = HSStatusEvent.STATUS_UP, code = "OK", message = "Bot Operational", version = statusOpts.Version, timestamp = (long)((DateTime.Now - new DateTime(1970,01,01)).TotalMilliseconds) }; room.SendState(evt, "uk.half-shot.status", statusOpts.ItemName); }
public MatrixBot( string cmdprefix, string host, string user, string pass, string[] rooms, bool AutoAcceptInvite = false, StatusOptions statusOptions = null ) { prefix = cmdprefix; Client = new MatrixClient (host); Client.AddStateEventType ("uk.half-shot.status", typeof(HSStatusEvent)); this.AutoAcceptInvite = AutoAcceptInvite; Client.OnInvite += (roomid, joined) => { if (AutoAcceptInvite) { MatrixRoom room = Client.JoinRoom (roomid); if (room != null) { room.OnMessage += Room_OnMessage; } } }; Client.LoginWithPassword (user, pass); MatrixRoom[] existingRooms = Client.GetAllRooms (); foreach (string roomid in rooms) { MatrixRoom room = roomid.StartsWith ("#") ? Client.GetRoomByAlias (roomid) : Client.GetRoom (roomid); if (existingRooms.Contains (room)) { continue; } if (room == null) { room = Client.JoinRoom (roomid); if (room != null) { Console.WriteLine ("\tJoined " + roomid); } else { Console.WriteLine ("\tCouldn't find " + roomid); } } } existingRooms = Client.GetAllRooms (); foreach (MatrixRoom room in existingRooms) { room.OnMessage += Room_OnMessage; } //Find commands foreach (MethodInfo method in typeof(T).GetMethods(BindingFlags.Static|BindingFlags.Public)) { BotCmd cmd = method.GetCustomAttribute<BotCmd> (); if (cmd != null) { Cmds.Add (cmd, method); } if (method.GetCustomAttribute<BotFallback> () != null) { if (fallback != null) { Console.WriteLine ("WARN: You have more than one fallback command set, overwriting previous"); } fallback = method; } } if (statusOptions != null && statusOptions.StartAutomatically) { //Start Status Thread. statusOpts = statusOptions; StartStatusReporting(statusOptions.IntervalMinutes); } }