public void TestSend() { var slack = new Slack(); Assert.IsTrue(slack.Init(Token), "Invalid Token"); Assert.IsTrue(slack.Connect(), "Failed to Connect"); while (!slack.RecievedHello) { Thread.Sleep(0); } slack.SendMessage(slack.GetChannel("#botspam").Id, "Test!"); slack.SendMessage("#botspam", "Test2"); }
bool ICommand.Run(string MessageText, Message RawMessage, bool IsTargeted, Slack Instance) { // ’ var match = Regex.Match( MessageText, @"(Who['’]?s|(Any|Some)(one|body)) in\?", RegexOptions.IgnoreCase); if (match.Success) { Singleton <NetworkData> .Instance.Refresh(); var hosts = Singleton <NetworkData> .Instance.CertainHosts().ToList(); var unknowns = Singleton <NetworkData> .Instance.UnknownHosts().Count(); var people = new List <string>(); Host h = null; foreach (var host in hosts.ToArray()) { if (people.Contains(host.Owner)) { hosts.Remove(host); } else { people.Add(host.Owner); } } if (hosts.Count > 0) { Instance.SendMessage(RawMessage.Channel, string.Format("{0} {1} here. {2}", string.Join(", ", hosts.Select(host => String.Format("{0}'s {1} '{2}'", host.Owner, host.Type, host.FriendlyName))), hosts.Count == 1 ? "is" : "are", unknowns > 0 ? string.Format("There are also {0} unknown devices.", unknowns) : "")); } else if ((h = Singleton <NetworkData> .Instance.PickIncompleteHost()) != null) { Instance.SendMessage(RawMessage.Channel, String.Format("I don't know. But there is a device I don't recognise: {0}", h.FriendlyName)); } else { Instance.SendMessage(RawMessage.Channel, "Nobody. It's lonely here :frowning:"); } Instance.SetLastHost(h); return(true); } return(false); }
public static void Introduce(Slack instance, Channel channel) { var settings = PersistentSingleton <Settings> .Instance; instance.SendMessage(channel, "Hi, I'm {0}!", instance.Self.Name); instance.SendMessage(channel, "I'm here to keep an eye on your building while you're not around.\n" + "I do this by watching your wifi network. " + "I'll keep notes on each device that connects to the wifi, and with your help, be able to work out who's in the building.\n"); instance.SendMessage(channel, "If you ever need me, just ask _Who's in?_ or _Anyone in?_, and I'll let you know.\n" + "If there's a device I don't recognise, just say _@{0}: That's my iThing_, or _@{0}: That's @somebody's bright pink phone_.\n" + "I try to work out what belongs here, and try not to ask about the router or printer, but if I ever do, feel free to let me know by saying _@{0}: Ignore that_.", instance.Self.Name); settings.HasDoneIntroSpiel = true; }
internal void Check(Slack slack) { try { var whosin = Singleton <NetworkData> .Instance.CertainHosts().Select(h => h.Owner).Distinct(); foreach (var item in Notes.ToArray()) { var who = slack.GetUser(item.Who); var name = "@" + who.Name; if (whosin.Contains(name, System.StringComparer.CurrentCultureIgnoreCase)) { var im = slack.Ims.FirstOrDefault(i => i.Name == who.Id); if (im == null) { im = who.OpenIm(); } slack.SendMessage(im.Id, "Reminder: " + item.Text); Notes.Remove(item); } } PersistentSingleton <Reminders> .Dirty(); } catch (Exception c) { Console.WriteLine(c); } }
public static void Reply(this Message message, Slack Instance, string Text, bool targeted = false) { if (targeted) { Text = string.Format("{1}: {0}", Text, Instance.GetUser(message.User).Name); } Instance.SendMessage(message.Channel, Text); }
private static Action IdleFunc(Slack slack) { return(() => { try { Thread.CurrentThread.Name = slack.TeamInfo.Domain + "_idlefunc"; Thread.CurrentThread.IsBackground = true; if (!PersistentSingleton <Settings> .Instance.HasDoneIntroSpiel) { Thread.Sleep(TimeSpan.FromMinutes(1)); } DateTime LastQuestion = new DateTime(); int askchannel = random.Next(0, slack.JoinedChannels.Count()); while (true) { Singleton <NetworkData> .Instance.Refresh(); #if REMINDERS try { PersistentSingleton <Reminders> .Instance.Check(slack); } catch (Exception) { } #endif if (DateTime.Now.Hour < 7) { continue; } var inc = Singleton <NetworkData> .Instance.PickIncompleteHost(); if (inc != null && LastQuestion.Date != DateTime.Now.Date) { LastQuestion = DateTime.Now; string chan = slack.JoinedChannels.ElementAt(askchannel).Id; slack.SendMessage(chan, "Excuse me, but does anyone recognise '{0}'?", inc.FriendlyName); askchannel++; if (askchannel == slack.JoinedChannels.Count()) { askchannel = 0; } slack.SetLastHost(inc); } Thread.Sleep(new TimeSpan(0, 5, 0)); } } catch (Exception c) { Console.WriteLine("!An Error has been caught!\n{0}", c); File.WriteAllText("Idlefunc_error.txt", c.ToString()); } }); }
public void Process() { try { var stats = Get(); if (stats == null) { return; } foreach (var x in stats.members) { foreach (var m in x) { if (!Stars.ContainsKey(m.name.ToString())) { Stars.Add(m.name.ToString(), new List <int>()); if (!Initializing) { Slack.SendMessage($"{m.name} joined the Advent of Code challenge! Welcome to the team!", "#aoc", ":aoc:", "Advent of Code"); } } foreach (var s in m.completion_day_level) { foreach (var y in s) { foreach (var p in y) { var star = int.Parse(s.Name) * 100 + int.Parse(p.Name); if (Stars[m.name.ToString()].Contains(star)) { continue; } Stars[m.name.ToString()].Add(star); if (!Initializing) { Slack.SendMessage($"{m.name} solved part {p.Name} of day {s.Name}.", "#aoc", ":aoc:", "Advent of Code"); } } } } } } Initializing = false; } catch { // ignored } }
public bool Run(string MessageText, Message RawMessage, bool IsTargeted, Slack Instance) { var match = Regex.Match( MessageText, @"(Call|Name|Nickname) it (?<Nickname>[\w _:]+)", RegexOptions.IgnoreCase); if (match.Success) { if (!IsTargeted) { //TODO: Rate Limit to once per day. RawMessage.Reply(Instance, "Was that to me?"); return(true); } var LastHost = Instance.GetLastHost(); if (LastHost == null) { RawMessage.Reply(Instance, "I have no idea what you're talking about.", true); return(true); } var oldname = LastHost.FriendlyName; LastHost.Name = match.Groups["Nickname"].Value; RawMessage.Reply(Instance, string.Format("Ok. It'll call {0} \"{1}\" from now on.", oldname, LastHost.FriendlyName)); return(true); } match = Regex.Match( MessageText, @"(Call|Name|Nickname) (?<name>[\w:]+) (as|to) (?<Nickname>[\w _:]+)", RegexOptions.IgnoreCase); if (match.Success) { if (!IsTargeted) { //TODO: Rate Limit to once per day. RawMessage.Reply(Instance, "Was that to me?"); return(true); } Host LastHost; NetworkData network = Singleton <NetworkData> .Instance; Instance.SetLastHost(LastHost = network.Find(match.Groups["name"].Value)); if (LastHost == null) { Instance.SendMessage(RawMessage.Channel, "I couldn't find anything by that name"); return(true); } var oldname = LastHost.FriendlyName; LastHost.Name = match.Groups["Nickname"].Value; RawMessage.Reply(Instance, string.Format("Ok. It'll call {0} \"{1}\" from now on.", oldname, LastHost.FriendlyName)); return(true); } return(false); }
public static void Score(IDbConnection conn, string winner, string loser) { const int k = 40; var winnerRating = conn.Query <int>("SELECT Rating FROM [User] WHERE Id = @Winner", new { Winner = winner }).First(); var loserRating = conn.Query <int>("SELECT Rating FROM [User] WHERE Id = @Loser", new { Loser = loser }).First(); var loserIsProvisional = conn.Query <int>("SELECT COUNT(*) FROM Match WHERE (Winner = @Loser OR Loser = @Loser) AND IsWinnerConfirmed = 1 AND IsLoserConfirmed = 1", new { Loser = loser }).First() < 10; var odds = (10 ^ (winnerRating / 400)) / ((double)(10 ^ (winnerRating / 400)) + (10 ^ (loserRating / 400))); var newWinnerRating = winnerRating + (int)(k * (1 - odds) * (loserIsProvisional ? 0.5 : 1)); var newLoserRating = loserRating - (int)(k * (1 - odds)); Slack.SendMessage($"{winner} (+{newWinnerRating - winnerRating}) [{newWinnerRating}] just won from {loser} (-{loserRating - newLoserRating}) [{newLoserRating}]!", "#ranked", ":ranked:", "Ranked"); conn.Execute( @"UPDATE [User] SET Rating = @WinnerRating WHERE Id = @Winner; UPDATE [User] SET Rating = @LoserRating WHERE Id = @Loser", new { Winner = winner, WinnerRating = newWinnerRating, Loser = loser, LoserRating = newLoserRating }); }
public void Process() { try { var games = new Dictionary <long, GameStats>(); foreach (var s in Summoners) { // do API call and get response var json = GetJSON(string.Format(MatchUrl, s.SummonerID, ApiKey)); if (json == null) { continue; } // get and compare game ID var game = json["games"][0]; var gameId = long.Parse((string)game["gameId"]); if (!s.LastMatchID.HasValue) { s.LastMatchID = gameId; } if (s.LastMatchID == gameId) { continue; } // save game data if (!games.ContainsKey(gameId)) { games[gameId] = new GameStats(game); } games[gameId].Players[s.Name] = new PlayerStats(s.Name, game); // update last game ID s.LastMatchID = gameId; } // report foreach (var game in games) { // report quadrakills foreach (var p in game.Value.Players.Where(p => p.Value.QuadraKills > 0 && p.Value.PentaKills == 0)) { Slack.SendMessage(string.Format("{0} had {1} QUADRAKILL{2}!!", p.Value.ToString(), p.Value.QuadraKills == 1 ? "A" : p.Value.QuadraKills.ToString(CultureInfo.InvariantCulture), p.Value.QuadraKills > 1 ? "S" : "" ), "#lol", ":quadra:", "League of Legends"); } // report pentakills foreach (var p in game.Value.Players.Where(p => p.Value.PentaKills > 0)) { Slack.SendMessage(string.Format("{0} had {1} PENTAKILL{2}!! @channel", p.Value.ToString(), p.Value.PentaKills == 1 ? "A" : p.Value.PentaKills.ToString(CultureInfo.InvariantCulture), p.Value.PentaKills > 1 ? "S" : "" ), "#lol", ":penta:", "League of Legends"); } // report game stats Slack.SendMessage(game.Value.ToString(), "#lol", ":lol:", "League of Legends"); } } catch { // ignored } }
public void Test1() { Hale.Alert.Slack slack = new Slack(); slack.SendMessage(); }
private static void OnSlackMessage(SlackMessage message) { Console.WriteLine($"[{message.Sender}] : {message.Message}"); foreach (var handler in Handlers) { var inst = handler.Value.ServiceInstance; var regex = handler.Key; var handlerInfo = handler.Value; var methodInfo = handler.Value.Handler; // SUBSCRIBER TARGET if (handlerInfo.Target == SubscribeTarget.All) { ; // skip } if (handlerInfo.Target == SubscribeTarget.Myself && message.Sender.IsMe == false) { continue; } if (handlerInfo.Target == SubscribeTarget.BotUser && message.Sender.IsBot == false) { continue; } if (handlerInfo.Target == SubscribeTarget.OtherUser && message.Sender.IsMe) { continue; } var matches = regex.Match(message.Message); if (matches.Success == false) { continue; } if (handlerInfo.PermissionGroupName != null) { if (message.Sender.Permissions.Contains(handlerInfo.PermissionGroupName) == false) { continue; } } var parameters = methodInfo.GetParameters(); var args = new List <object>(); var errorContinue = false; try { args.Add(message); for (int i = 1; i < matches.Groups.Count; i++) { var type = parameters[i].ParameterType; if (type == typeof(string)) { args.Add(matches.Groups[i].Value); } else if (type == typeof(int)) { args.Add(Convert.ToInt32(matches.Groups[i].Value)); } else if (type == typeof(long)) { args.Add(Convert.ToInt64(matches.Groups[i].Value)); } else if (type == typeof(float)) { args.Add(Convert.ToSingle(matches.Groups[i].Value)); } else if (type == typeof(double)) { args.Add(Convert.ToDouble(matches.Groups[i].Value)); } } } catch (Exception e) { if (handlerInfo.Usage != null) { Slack.SendMessage(message.Channel.Name, "@" + message.Sender + " : " + handlerInfo.Usage); } errorContinue = true; } if (errorContinue) { continue; } try { methodInfo?.Invoke(inst, args.ToArray()); } catch (Exception e) { Console.WriteLine(e); } } }