예제 #1
0
        public override void Call(Message m, TgGroup g, TgUser u, string[] args, bool dev)
        {
            var plots = new List <PlottableData>();

            foreach (var item in g.Servers)
            {
                plots.Add(item.GetPingData());
            }

            if (plots.Count > 0)
            {
                using (var bm = Utils.PlotData(plots.ToArray(), "Minutes Ago", "Response time (ms)"))
                {
                    using (var ms = new MemoryStream())
                    {
                        bm.Save(ms, ImageFormat.Png);
                        bm.Dispose();
                        ms.Position = 0;
                        var iof = new Telegram.Bot.Types.InputFiles.InputOnlineFile(ms);
                        TgBot.Client.SendPhotoAsync(m.Chat.Id, iof).Wait();
                        ms.Close();
                    }
                }
            }
        }
예제 #2
0
        public override void Call(Message m, TgGroup g, TgUser u, string[] args, bool dev)
        {
            var msg   = "Player Online:";
            var plots = new List <PlottableData>();

            foreach (var item in g.Servers)
            {
                msg += "\r\n[<code>" + item.Label + "</code>] ";
                if (!item.IsOnline)
                {
                    msg += "Offline";
                }
                else
                {
                    msg += item.PlayerCount + " / " + item.MaxPlayerCount;
                }

                if (TgBot.Conf.DrawPlots)
                {
                    plots.Add(item.GetUserData());
                }

                // add player names if any
                if (item.PlayerList.Count <= 0)
                {
                    continue;
                }

                var n = "";
                foreach (var plr in item.PlayerList)
                {
                    if (!string.IsNullOrEmpty(n))
                    {
                        n += ", ";
                    }
                    n += plr.Name;
                }
                msg += "\r\nNames: <code>" + n + "</code>";
            }

            if (TgBot.Conf.DrawPlots && plots.Count > 0)
            {
                using (var bm = Utils.PlotData(plots.ToArray(), "Minutes Ago", "Player Online"))
                {
                    using (var ms = new MemoryStream())
                    {
                        bm.Save(ms, ImageFormat.Png);
                        bm.Dispose();
                        ms.Position = 0;
                        var iof = new Telegram.Bot.Types.InputFiles.InputOnlineFile(ms);
                        TgBot.Client.SendPhotoAsync(m.Chat.Id, iof, msg, ParseMode.Html).Wait();
                        ms.Close();
                    }
                }
            }
            else
            {
                Respond(m.Chat.Id, msg, ParseMode.Html);
            }
        }
예제 #3
0
파일: CmdList.cs 프로젝트: hexxone/mcswbot2
        public override void Call(Message m, TgGroup g, TgUser u, string[] args, bool dev)
        {
            var msg = "Watchlist:<code> " + g.Servers.Count + " / 3</code>";

            foreach (var s in g.Servers)
            {
                msg += "\r\n=== == = = = = = = == ===";
                msg += "\r\n[<code>" + s.Label + "</code>] <b>" + s.Base.Address + ":" + s.Base.Port +
                       "</b>\r\n  Status: ";
                if (s.IsOnline)
                {
                    msg += "Online 🌐";
                    msg += "\r\n  Version:<code> " + s.Version;
                    msg += "</code>\r\n  MOTD:<code> " + s.MOTD;
                    msg += "</code>\r\n  Player:<code> " + s.PlayerCount + " / " + s.MaxPlayerCount + "</code>";
                }
                else
                {
                    msg += "Offline ❌";
                    msg += "\r\n  Error:<code> " + s.LastError + "</code>";
                }
            }

            Respond(m.Chat.Id, msg, ParseMode.Html);
        }
예제 #4
0
        public override void Call(Message m, TgGroup g, TgUser u, string[] args, bool dev)
        {
            var msg = "Global Bot stats:";

            msg += "\r\n  known users:<code> " + TgBot.TgUsers.Length;
            msg += "</code>\r\n  known groups:<code> " + TgBot.TgGroups.Length;
            var serverCount = 0;
            var userCount   = 0;

            foreach (var gr in TgBot.TgGroups)
            {
                serverCount += gr.Servers.Count;
                foreach (var sr in gr.Servers)
                {
                    userCount += sr.PlayerCount;
                }
            }

            msg += "</code>\r\n  watched servers:<code> " + serverCount;
            msg += "</code>\r\n  online MC users:<code> " + userCount;

            double totalSize = Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024;

            msg += $"</code>\r\n  live ram usage:<code> {totalSize:0.00} MB";

            Respond(m.Chat.Id, msg + "</code>", ParseMode.Html);
        }
예제 #5
0
        public override void Call(Message m, TgGroup g, TgUser u, string[] args, bool dev)
        {
            var usage = "Usage: /notify <label> (<option> [true|false])";

            usage += "\r\nOptions:";
            usage += "\r\n- state (server online status)";
            usage += "\r\n- count (server user count)";
            usage += "\r\n- name (player name samples)";

            switch (args.Length)
            {
            default:
                Respond(m.Chat.Id, usage);
                break;

            case 2:
                var srv = g.GetServer(args[1]);
                if (srv != null)
                {
                    Respond(m.Chat.Id, GetSrvNotifications(srv), ParseMode.Html);
                }
                else
                {
                    Respond(m.Chat.Id, "Server label not found.\r\n\r\n" + usage);
                }
                break;

            case 4:
                var srv2 = g.GetServer(args[1]);
                if (srv2 != null)
                {
                    var argl = args[3].ToLower() == "true";
                    switch (args[2].ToLower())
                    {
                    case "state":
                        srv2.NotifyServer = argl;
                        break;

                    case "count":
                        srv2.NotifyCount = argl;
                        break;

                    case "name":
                        srv2.NotifyNames = argl;
                        break;

                    default:
                        Respond(m.Chat.Id, "Unknown setting.\r\n\r\n" + usage);
                        return;
                    }
                    Respond(m.Chat.Id, GetSrvNotifications(srv2), ParseMode.Html);
                }
                else
                {
                    Respond(m.Chat.Id, "Server label not found.\r\n\r\n" + usage);
                }
                break;
            }
        }
예제 #6
0
        public override void Call(Message m, TgGroup g, TgUser u, string[] args, bool dev)
        {
            var use = "Usage: /add [label] [address] (port default 25565)";

            try
            {
                if (g.Servers.Count > 2 && !dev)
                {
                    throw new Exception("Only up to 3 servers are allowed per group.");
                }
                if (args.Length < 3 || args.Length > 4)
                {
                    throw new Exception("Invalid arguments.");
                }
                Utils.VerifyLabel(args[1]);
                if (g.GetServer(args[1]) != null)
                {
                    throw new Exception("Label name already in use.");
                }

                var addr = args[2];
                var port = 25565;
                // try to parse port if given
                if (args.Length == 4 && !int.TryParse(args[3], out port))
                {
                    throw new Exception("Port is not a number.");
                }

                try
                {
                    Utils.VerifyAddress(addr, port);
                }
                catch (Exception e)
                {
                    // bypass ip check if user is developer
                    if (dev)
                    {
                        Respond(m.Chat.Id, "Verify Warning: " + e.Message);
                    }
                    else
                    {
                        throw e;
                    }
                }

                // add & respond
                g.AddServer(args[1], addr, port);
                Respond(m.Chat.Id, "Server added to watchlist: [" + EventBase.Wrap(Types.Formatting.Html, args[1]) + "]",
                        ParseMode.Html);
            }
            catch (Exception ex)
            {
                Respond(m.Chat.Id, "Error adding server: " + ex.Message + "\r\n" + use);
            }
        }
예제 #7
0
        public override void Call(Message m, TgGroup g, TgUser u, string[] args, bool dev)
        {
            if (args.Length != 2)
            {
                Respond(m.Chat.Id, "Usage: /remove [label]");
                return;
            }

            var res = g.RemoveServer(args[1]);
            var msg = res
                ? "Server removed from watchlist: [" + EventBase.Wrap(Types.Formatting.Html, args[1]) + "]"
                : "Label not found.";

            Respond(m.Chat.Id, msg, ParseMode.Html);
        }
예제 #8
0
파일: CmdSven.cs 프로젝트: hexxone/mcswbot2
 public override void Call(Message m, TgGroup g, TgUser u, string[] args, bool dev)
 {
     Respond(m.Chat.Id, "stinkt", ParseMode.Default, m.MessageId);
 }
예제 #9
0
        public void HandleUpdate(Update update)
        {
            int?userId = update?.Message?.From?.Id ?? update?.CallbackQuery?.From?.Id;

            if (!userId.HasValue)
            {
                return;
            }

            // read or create user
            var user = _dbService.ById <TgUser>(userId.Value.ToString());

            if (user == null)
            {
                user = new TgUser {
                    Id = userId.Value.ToString()
                };
                _dbService.Update(user);
            }

            // on idle state
            if (user.LastWord == null && update.Message != null)
            {
                string input = update.Message.Text;
                if (input.StartsWith("/word"))
                {
                    string[] inputData = input.Split(" ");
                    string   forceWord = inputData.Length > 1 ? inputData[1] : "";

                    // command to give new word
                    GiveNewWord(user, false, forceWord);
                }
                else
                {
                    string m = "Это бот для набора определений слов в игру <b>Шляпа</b>. " +
                               "Он присылает кривое определение из словаря, а вам нужно вместо него написать " +
                               "<i>хорошее</i> определение для игры.\n\n<b>Как писать:</b>\n" +
                               "Вместе с заданием бот будет подсказывать первую букву слова, поэтому определение " +
                               "должно быть не слишком простым по смыслу, но коротким по длине: " +
                               "в идеале 1-4 слова. Думайте, как такое слово было бы определено <b>в сканворде</b>. " +
                               "Используйте ассоциации и переносные значения. Но если слово само по себе сложное, можно " +
                               "описывать его буквально." +
                               "\n\n<b>Хорошо</b>:\n" +
                               "<i>Усатый плавун (сом)</i>; <i>«Оркестр» для монаха (звонница)</i>;\n" +
                               "<b>Плохо:</b>\n" +
                               "<i>Большая пресноводная рыба с усами (сом)</i>; <i>Колокольный блок в церкви (звонница)</i>;" +
                               "\n<b>Допустимо</b>:\n<i>Военное пальто с подкладкой " +
                               "(бушлат, определение буквальное, потому что слово сложное)</i>" +
                               "\n\n/word — получить новое слово\nПо всем вопросам — @peshekhonov";

                    if (user.WordsProcessed > 0)
                    {
                        int count = _dbService.Collection <WordData>().Count(w => w.Status == WordStatus.Ready);
                        m += $"\n\nВы обработали слов: <b>{user.WordsProcessed}</b>" +
                             $"\nВсего в базе обработанных слов: <b>{count}</b>";
                    }

                    _telegram.SendTextMessageAsync(new ChatId(userId.Value), m, ParseMode.Html);
                }
            }
            else if (user.LastWord != null)
            {
                if (update.Message?.Text != null && update.Message.Text != "")
                {
                    string input = update.Message.Text;

                    if (input == "/word")
                    {
                        GiveNewWord(user, true);
                        return;
                    }

                    string m;
                    if (input == "/keep")
                    {
                        m = $"Определение слова оставлено как есть.\n\n{GetWordInfo(user.LastWord, true)}\n\n" +
                            "Можете изменить его. Для завершения выберите сложность, " +
                            "как вы думаете, насколько это сложное слово?";
                    }
                    else
                    {
                        string[] tokens = Regex.Split(input.ToLower(), @"[\.,\-\s\(\)""'!?—:;]+");
                        if (tokens.Count(t => t.Length > 3) > 4)
                        {
                            _telegram.SendTextMessageAsync(
                                new ChatId(userId.Value),
                                "Определение слишком длинное. Используйте переносные значения, метафоры, игру слов. " +
                                "Или можете пропустить слово командой /word",
                                ParseMode.Html
                                );
                            return;
                        }

                        user.LastWord.Definition = input.ToLowerFirst();
                        _dbService.Update(user);

                        m = $"Определение слова обновлено.\n\n{GetWordInfo(user.LastWord, true)}\n\n" +
                            "Можете изменить его ещё раз. Для завершения выберите сложность, " +
                            "как вы думаете, насколько это сложное слово?";
                    }

                    var kb = new InlineKeyboardMarkup(new InlineKeyboardButton[]
                    {
                        new()
                        {
                            CallbackData = Complexity.Low.ToString(),
                            Text         = "Простое"
                        },
                        new()
                        {
                            CallbackData = Complexity.Medium.ToString(),
                            Text         = "Среднее"
                        },
                        new()
                        {
                            CallbackData = Complexity.Low.ToString(),
                            Text         = "Сложное"
                        },
                    });
예제 #10
0
 /// <summary>
 ///     Needs to be overwritten by the command-sepcific logic
 /// </summary>
 /// <param name="m">Message which contained the calling command</param>
 /// <param name="g">Group where the message was sent in</param>
 /// <param name="u">Bot-user equivalent of the command sender</param>
 /// <param name="args">command arguments splitted by space</param>
 /// <param name="dev">message was sent by developer</param>
 public abstract void Call(Message m, TgGroup g, TgUser u, string[] args, bool dev);
예제 #11
0
 public override void Call(Message m, TgGroup g, TgUser u, string[] args, bool dev)
 {
     Respond(m.Chat.Id,
             "This bot keeps track of your Minecraft servers and the online users. It should support any server version upward from beta 1.3.1 including Modpacks since it only uses the 'server list' information.");
 }
예제 #12
0
파일: User.cs 프로젝트: wooferclaw/Triglav
 public User(TgUser user)
 {
     Id     = user.Id.ToString();
     Name   = user.FirstName + " " + user.LastName;
     Domain = user.Username;
 }