示例#1
0
    public async Task Remind(int h, int m, [Remainder] string text)
    {
        await Context.Message.DeleteAsync();

        DiscordWrapper.Log($"Lời nhắc của {Context.Message.Author.Username} ({Context.Message.Author.Id}) ở guild {Context.Guild.Name} ({h}:{m} / {text})");

        try
        {
            WqlEventQuery query = new WqlEventQuery
                                      ("__InstanceModificationEvent", new TimeSpan(0, 0, 60),
                                      $"TargetInstance isa 'Win32_LocalTime' AND TargetInstance.Hour={h} AND TargetInstance.Minute={m} AND TargetInstance.Second=0");

            ManagementEventWatcher watcher = new ManagementEventWatcher(query);
            watcher.EventArrived += async(object sender, EventArrivedEventArgs e) =>
            {
                await DiscordWrapper.SendMessage(Context, $"*Đây là lời nhắc dành cho {Context.Message.Author.Mention}:*\n{text}");
            };
            watcher.Start();
        }
        catch (Exception e)
        {
            DiscordWrapper.Log($"[log] ScheduledTask in Module: {e}");
            DiscordWrapper.Log($"Lỗi {e} ở lời nhác của {Context.Message.Author.Id} ở guild {Context.Guild.Name} ({h}:{m} / {text})");

            await DiscordWrapper.SendMessage(Context, $"Có lỗi xảy ra. Bạn nhắc lại giúp Mèo thời gian và lời nhắn với, {Context.Message.Author.Mention}.");
        }
    }
    public async Task CancelFFmpeg()
    {
        Global.cts.Cancel();

        DiscordWrapper.Log("[log] Playback terminated.");
        await Task.Delay(TimeSpan.FromMilliseconds(1000));
    }
    private static bool SetControl(ref ChessBoard chess)
    {
        try
        {
            for (var i = 0; i < 8; i++)
            {
                for (var j = 0; j < 8; j++)
                {
                    chess.Control[0, i, j] = chess.Control[1, i, j] = 0;
                }
            }

            for (var i = 0; i < 8; i++)
            {
                for (var j = 0; j < 8; j++)
                {
                    if (chess.Board[i, j] != ChessBoard.Empty &&
                        !SetControlPos(ref chess, i, j))
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
        catch (Exception e)
        {
            DiscordWrapper.Log($"{log} {e}");
            return(false);
        }
    }
示例#4
0
    public async Task New()
    {
        ulong UserId = Context.Message.Author.Id;
        await DiscordWrapper.SendMessage(Context, $"{MentionUtils.MentionUser(UserId)}, bạn có chắc muốn tạo trò chơi mới? (Yes/No)");

        string        content = null;
        SocketMessage msg;

        Stopwatch s = new Stopwatch();

        s.Start();
        do
        {
            msg = await NextMessageAsync(fromSourceUser : true, inSourceChannel : true, timeout : TimeSpan.FromMinutes(5));

            if (msg == null)
            {
                break;
            }

            content = msg.Content.ToLower();
            if (content == "yes" || content == "no")
            {
                break;
            }
        } while (s.Elapsed < TimeSpan.FromMinutes(5));

        if (msg == null)
        {
            await DiscordWrapper.SendMessage(Context, $"Mèo không nhận được phản hồi của {MentionUtils.MentionUser(UserId)}... :cry:");

            return;
        }
        else if (content == "no")
        {
            await DiscordWrapper.SendMessage(Context, $"Trò chơi mới sẽ không được tạo.");

            await Task.Delay(TimeSpan.FromSeconds(5));

            await(Context.Channel as ITextChannel).DeleteMessagesAsync(await Context.Channel.GetMessagesAsync(4).FlattenAsync());
            return;
        }
        await(Context.Channel as ITextChannel).DeleteMessagesAsync(await Context.Channel.GetMessagesAsync(2).FlattenAsync());

        Puzzle puzzle = new Puzzle(UserId);

        Save(ref puzzle);

        DiscordWrapper.Log($"puzzle new | {Context.Message.Author.Username} ({Context.Message.Author.Id})");

        if (!(await Host()))
        {
            var embed = new EmbedBuilder
            {
                Description = $"Trò chơi của {MentionUtils.MentionUser(puzzle.PlayerId) } đã tạm dừng.",
                Color       = Color.Blue
            };
            await DiscordWrapper.SendMessage(Context, embed : embed.Build());
        }
    }
示例#5
0
        public static async Task Main(string[] args)
        {
            var config = new ConfigurationBuilder()
                         .SetBasePath(Directory.GetCurrentDirectory())
                         .AddJsonFile("appsettings.json", true)
                         .AddEnvironmentVariables()
                         .Build();
            var configWrapper        = new ConfigurationWrapper(config);
            var topClipsModuleHelper = new TopClipsModuleHelper(configWrapper);
            var botHelper            = new BotHelper(configWrapper);

            using (var functionWrapper = new FunctionWrapper(configWrapper))
                using (var discordWrapper = new DiscordWrapper(configWrapper["BotToken"]))
                    using (var services = new ServiceCollection()
                                          .AddSingleton <IDiscordWrapper>(discordWrapper)
                                          .AddSingleton <IConfigurationWrapper>(configWrapper)
                                          .AddSingleton <IFunctionWrapper>(functionWrapper)
                                          .AddSingleton <ITopClipsModuleHelper>(topClipsModuleHelper)
                                          .AddSingleton <IBotHelper>(botHelper)
                                          .AddLogging(s => s.AddConsole())
                                          .BuildServiceProvider())
                    {
                        var bot = new Bot(services);
                        await bot.RunAsync();

                        await Task.Delay(-1);
                    }
        }
示例#6
0
        public static async Task Run([TimerTrigger("%PostGifsFunctionCron%")] TimerInfo myTimer, ILogger log)
        {
            var connectionString = Environment.GetEnvironmentVariable("TrendingGiphyBotConnectionString");
            var botToken         = Environment.GetEnvironmentVariable("BotToken");
            var hourOffsetString = Environment.GetEnvironmentVariable("HourOffset");
            var hourOffset       = int.Parse(hourOffsetString);
            var now = DateTime.Now.AddHours(-hourOffset);
            var validMinutesString  = Environment.GetEnvironmentVariable("ValidMinutes");
            var validMinutes        = validMinutesString.Split(',', options: StringSplitOptions.RemoveEmptyEntries).Select(int.Parse);
            var validHoursString    = Environment.GetEnvironmentVariable("ValidHours");
            var validHours          = validHoursString.Split(',', options: StringSplitOptions.RemoveEmptyEntries).Select(int.Parse);
            var validHoursAsMinutes = validHours.Select(s => s * 60);
            var allValidMinutes     = validMinutes.Concat(validHoursAsMinutes).ToList();
            var giphyRandomEndpoint = Environment.GetEnvironmentVariable("GiphyRandomEndpoint");
            var warningResponses    = Environment.GetEnvironmentVariable("WarningResponses").Split(',', options: StringSplitOptions.RemoveEmptyEntries).ToList();
            var logWrapper          = new LoggerWrapper(log);

            using (var context = new TrendingGiphyBotContext(connectionString))
                using (var giphyWrapper = new GiphyWrapper())
                    using (var discordWrapper = new DiscordWrapper(botToken))
                    {
                        var gifPostingHelper = new GifPostingHelper(logWrapper, context, giphyWrapper, discordWrapper, warningResponses);
                        var postGifsHelper   = new PostGifsHelper(gifPostingHelper);
                        await postGifsHelper.RunAsync(now, allValidMinutes, giphyRandomEndpoint);
                    }
        }
    public async Task JoinAudio(IGuild guild, IVoiceChannel target)
    {
        try
        {
            if (isGuildAdded(guild).Result)
            {
                if (connectedVChannel(guild).Result != null)
                {
                    return;
                }
                ConnectedChannels.Clear();
            }

            if (target.Guild.Id != guild.Id)
            {
                return;
            }

            var audioClient = await target.ConnectAsync();

            if (ConnectedChannels.TryAdd(guild.Id, audioClient))
            {
                DiscordWrapper.Log($"[info][{LogSeverity.Info}] Connected to voice on {guild.Name}.");
            }
        }
        catch (Exception ex)
        {
            DiscordWrapper.Log($"[log] {ex}");
        }
    }
    public async Task Help()
    {
        //return;

        var embed = new EmbedBuilder {
            Description = "**>> Cùng điểm qua những câu lệnh Mèo có nào!**",
            Color       = Color.Magenta
        };

        embed.AddField("*'hi*",
                       "Cùng chào nhau nhé!")
        .AddField("*'react <ID tin nhắn> <emoji_1> <emoji_2> ... <emoji_n>*",
                  "Mèo sẽ \"thả tym\" vào tin nhắn có ID đó!")
        .AddField("*'say <true/false>(true nếu ẩn danh, mặc định là false) <thời gian chờ>(theo giây, mặc định là 0) <tin nhắn>*",
                  "Mèo sẽ giúp bạn gửi tin nhắn đó!")
        .AddField("*'party*",
                  "Đến lúc quẩy rồi!!! :partying_face:")
        .AddField("*'rmd <giờ>(0 - 23) <phút>(0 - 59) <lời nhắc>*",
                  "Mèo sẽ nhắc nhở bạn vào thời điểm đó!")
        .AddField("*'wait <giây> <lời nhắn>*",
                  "Mèo sẽ gửi lời nhắn đó sau số giây nhất định!")
        .AddField("Ngoài ra, bạn có thể thử *'join*, *'play*, *'stop* và *'leave*~ :notes:",
                  "Dùng *'help exam* để xem các lệnh về các bài kiểm tra~\n" +
                  "Dùng *'help game* để xem các lệnh về trò chơi~\n" +
                  "Dùng *'help CF* để xem các lệnh về Codeforces~\n" +
                  " *^^Chúc bạn một ngày tốt lành!^^*");


        await DiscordWrapper.SendMessage(Context, embed : embed.Build());
    }
示例#9
0
        public async Task Remove(int day)
        {
            await Context.Channel.TriggerTypingAsync();

            try
            {
                var schedule = JsonSerializer.Deserialize <TestSchedule>(File.ReadAllText(_config.GetValue <string>("json:TestSchedule.json")));
                schedule.Day[day - 2].Clear();

                File.WriteAllText(_config.GetValue <string>("json:TestSchedule.json"), JsonSerializer.Serialize(schedule));

                await LogDiscord($"remove {day}");

                var msg = await ReplyAsync($"Đã xoá bài các kiểm tra thứ {day} thành công! :partying_face::tada::confetti_ball:");

                await Task.Delay(TimeSpan.FromSeconds(3));

                await msg.DeleteAsync();
            }
            catch (Exception e)
            {
                DiscordWrapper.Log($"[log] {e}");

                var msg = await ReplyAsync("Có lỗi xảy ra. Hãy chắc chắn bạn đã nhập đúng cú pháp, với các thứ trong ngày là từ 2 đến 6.");

                await Task.Delay(TimeSpan.FromSeconds(3));

                await msg.DeleteAsync();
            }
            finally
            {
                await Context.Message.DeleteAsync();
            }
        }
    public async Task Continue()
    {
        var chess = Load();

        if (chess.IsOver)
        {
            var embed = new EmbedBuilder
            {
                Description = "Không có trận đấu nào chưa kết thúc.",
                Color       = Color.Blue
            };
            await Context.Channel.TriggerTypingAsync();
            await ReplyAndDeleteAsync(content : null, embed : embed.Build(), timeout : TimeSpan.FromSeconds(5));
        }
        else if (!(await Host()))
        {
            var embed = new EmbedBuilder
            {
                Description = $"Trận đấu giữa {MentionUtils.MentionUser(chess.Player[ChessBoard.WhitePlayerIndex])} và {MentionUtils.MentionUser(chess.Player[ChessBoard.BlackPlayerIndex])} đã tạm dừng.",
                Color       = Color.Blue
            };
            //await ReplyAsync(embed: embed.Build());
            await DiscordWrapper.SendMessage(Context, embed : embed.Build());
        }
    }
示例#11
0
 public VoiceManager(IGuildProvider guildProvider, DiscordWrapper discordWrapper,
                     IOptions <CustomVoiceOptions> options, ILogger <VoiceManager> logger)
 {
     _guildProvider  = guildProvider;
     _discordWrapper = discordWrapper;
     _voiceConfig    = options.Value;
     _logger         = logger;
 }
示例#12
0
        private async Task HandleCommandAsync(SocketMessage messageParam)
        {
            var msg = messageParam as SocketUserMessage;

            if (msg == null || msg.Author.Id == _config.GetValue <ulong>("discord:ClientID"))
            {
                return;
            }

            int argPos  = 0;
            var context = new SocketCommandContext(_client, msg);

            // Attachments
            if ((msg.Channel as SocketGuildChannel).Guild.Id == _config.GetValue <ulong>("guild:Lollipop:ID") &&
                msg.Author.Id != _config.GetValue <ulong>("discord:AuthorID"))
            {
                Atachments(context);
            }

            // Prefix, Mention
            if (!(msg.HasCharPrefix(_config.GetValue <string>("discord:CommandPrefix")[0], ref argPos)))
            {
                if (msg.Content.Contains($"<@!{_config.GetValue<ulong>("discord:ClientID")}>") ||
                    msg.Content.Contains($"<@{_config.GetValue<ulong>("discord:ClientID")}>"))
                {
                    DiscordWrapper.Log($"{log_discord} Activity in guild {context.Guild.Name}");

                    await msg.Channel.TriggerTypingAsync();

                    await msg.Channel.SendMessageAsync($"*meo meoo*. Bạn cần gì nè, {msg.Author.Mention}?");
                }
                else if (msg.Content == "&party")
                {
                    DiscordWrapper.Log($"{log_discord} Activity in guild {context.Guild.Name}");
                    Party_with_goat(context);
                }
                return;
            }

            // Execute command
            DiscordWrapper.Log($"{log_discord} Activity in guild {context.Guild.Name}");

            var result = await _commands.ExecuteAsync(
                context : context,
                argPos : argPos,
                services : _services);

            if (!result.IsSuccess)
            {
                if (result.ErrorReason == "Unknown command.")
                {
                    await msg.Channel.TriggerTypingAsync();

                    await msg.Channel.SendMessageAsync($"Có phải bạn vừa gọi Mèo không, {msg.Author.Mention}?");
                }
                DiscordWrapper.Log($"{log} {result.ErrorReason}");
            }
        }
示例#13
0
    public async Task Say([Remainder] string text)
    {
        await Context.Message.DeleteAsync();

        string author = Context.Message.Author.Mention;

        if (text.StartsWith("||") && text.EndsWith("||"))
        {
            text = text.Substring(2, text.Length - 4);
        }
        await DiscordWrapper.SendMessage(Context, $"*Từ {author}:*\n{text}");
    }
示例#14
0
 private bool Save(ref Puzzle puzzle)
 {
     try
     {
         File.WriteAllText(_config.GetValue <string>("json:Puzzle.json"), JsonConvert.SerializeObject(puzzle));
         return(true);
     }
     catch (Exception e)
     {
         DiscordWrapper.Log($"{log} {e}");
         return(false);
     }
 }
示例#15
0
    private async Task <bool> Host()
    {
        try
        {
            IEnumerable <IMessage> print;
            Puzzle puzzle;

            while (true)
            {
                puzzle = Load();

                print = await Print();

                IMessage msg = print.First();

                int EnPos = puzzle.EmptySqrPos, StPos = await WaitForMove(msg);

                //DiscordWrapper.Log($"move {StPos}");

                if (StPos == -1)
                {
                    break;
                }
                else if (!puzzle.Move(StPos, EnPos))
                {
                    await Context.Channel.TriggerTypingAsync();
                    await ReplyAndDeleteAsync(content : $"{MentionUtils.MentionUser(puzzle.PlayerId)}, có lỗi xảy ra. Bạn vui lòng thử lại.", timeout : TimeSpan.FromSeconds(5));
                }
                else
                {
                    Save(ref puzzle);
                    if (puzzle.IsOver)
                    {
                        await Print();

                        break;
                    }
                }

                await(Context.Channel as ITextChannel).DeleteMessagesAsync(print);
            }

            puzzle = Load();
            return(puzzle.IsOver);
        }
        catch (Exception e)
        {
            DiscordWrapper.Log($"{log} {e}");
            return(false);
        }
    }
示例#16
0
        public static async Task Run([TimerTrigger("%PostClipsFunctionCron%")] TimerInfo myTimer, ILogger log)
        {
            var config = new ConfigurationBuilder()
                         .SetBasePath(Directory.GetCurrentDirectory())
                         .AddJsonFile("local.settings.json", true)
                         .AddEnvironmentVariables()
                         .Build();
            var configWrapper = new ConfigurationWrapper(config);
            //TODO use config wrapper
            var topClipsEndpoint          = Environment.GetEnvironmentVariable("TwitchTopClipsEndpoint");
            var clientId                  = Environment.GetEnvironmentVariable("TwitchClientId");
            var accept                    = Environment.GetEnvironmentVariable("TwitchAcceptHeaderValue");
            var botToken                  = Environment.GetEnvironmentVariable("BotToken");
            var connectionString          = Environment.GetEnvironmentVariable("TopTwitchClipBotConnectionString");
            var enableNumberOfClipsPerDay = bool.Parse(Environment.GetEnvironmentVariable("EnableNumberOfClipsPerDay"));
            var clipOrderMappings         = configWrapper.Get <List <ClipOrderMapping> >("ClipOrderMappings");
            var now        = DateTime.UtcNow;
            var yesterday  = now.AddDays(-1);
            var logWrapper = new LoggerWrapper(log);

            using (var twitchWrapper = new TwitchWrapper())
                using (var discordWrapper = new DiscordWrapper(botToken))
                    using (var context = new TopTwitchClipBotContext(connectionString))
                    {
                        var helper = new PostClipsHelper(logWrapper, context, twitchWrapper, discordWrapper);
                        logWrapper.LogInformation("Posting clips.");
                        await discordWrapper.LogInAsync();

                        var containers = await context.GetPendingChannelConfigsAsync(now.Hour);

                        var afterTimeBetweenClipsContainers = helper.AfterTimeBetweenClips(containers, now);
                        var readyToPostContainers           = helper.ReadyToPostContainers(afterTimeBetweenClipsContainers, yesterday, enableNumberOfClipsPerDay);
                        var pendingClipContainers           = await helper.BuildClipContainers(topClipsEndpoint, clientId, accept, readyToPostContainers);

                        var clipsWithMinViews    = helper.ClipsWithMinViews(pendingClipContainers);
                        var unseenClipContainers = helper.BuildUnseenClipContainers(clipsWithMinViews);
                        var results     = helper.AtATimeContainers(unseenClipContainers, clipOrderMappings);
                        var unseenClips = results.SelectMany(s => s.UnseenClips).ToList();
                        await helper.InsertHistories(unseenClips);

                        var channelContainers = await helper.BuildChannelContainers(results);

                        foreach (var channelContainer in channelContainers)
                        {
                            await helper.SendMessagesAsync(channelContainer);
                        }
                        await discordWrapper.LogOutAsync();

                        logWrapper.LogInformation("Posted clips.");
                    }
        }
示例#17
0
 private bool Save(TaskList taskList)
 {
     try
     {
         taskList.Unlock();
         File.WriteAllText(_config.GetValue <string>("json:ReminderTaskList.json"), JsonConvert.SerializeObject(taskList));
         return(true);
     }
     catch (Exception e)
     {
         DiscordWrapper.Log($"{log} {e}");
         return(false);
     }
 }
示例#18
0
    public async Task PlayCmd([Remainder] string file_name)
    {
        if (!_service.isGuildAdded(Context.Guild).Result)
        {
            var channel = (Context.User as IGuildUser)?.VoiceChannel;
            if (channel == null)
            {
                await Context.Channel.TriggerTypingAsync();

                await Context.Channel.SendMessageAsync("Mèo cần ở trong một kênh thoại!");

                return;
            }
            await _service.JoinAudio(Context.Guild, (Context.User as IVoiceState).VoiceChannel);
        }

        string Path = _config.GetValue <string>("config:songPath");

        if (!File.Exists($"{Path}{file_name}"))
        {
            file_name = _songs.GetValue <string>($"filename:{file_name}");
        }
        if (file_name == null)
        {
            await Context.Channel.TriggerTypingAsync();
            await ReplyAsync($"Tên bài hát không hợp lệ.");

            return;
        }

        DiscordWrapper.Log("metadata.");

        /*var metadata = TagLib.File.Create($"{Path}{file_name}");
         * var embed = new EmbedBuilder {
         *  Title = "Hiện đang phát",
         *  Description = $"{metadata.Tag.Title} - {metadata.Tag.FirstPerformer}",
         *  Color = Color.Blue
         * };
         * embed.WithFooter(footer => footer.Text = $"[{Context.Message.Author.Username}]")
         *  .WithCurrentTimestamp();
         * var msg = await ReplyAsync(embed: embed.Build());*/

        DiscordWrapper.Log("set-up done.");

        await _service.SendAudioAsync(Context.Guild, $"{Path}{file_name}");

        DiscordWrapper.Log("playback done.");
        //await msg.DeleteAsync();
    }
示例#19
0
    public async Task Party()
    {
        string[] emotes = new string[4];
        emotes[0] = "\uD83D\uDC08";    // cat2
        emotes[1] = "\ud83e\udd73";    // partying_face
        emotes[2] = "\uD83C\uDF89";    // tada
        emotes[3] = "\uD83C\uDF8A";    // confetti_ball

        var msg = await DiscordWrapper.SendMessage(Context, ":cat2::partying_face::tada::confetti_ball::confetti_ball::confetti_ball::tada::partying_face::cat2:");

        foreach (var emote in emotes)
        {
            await msg.AddReactionAsync(new Emoji(emote));
        }
    }
示例#20
0
        private void Atachments(SocketCommandContext context)
        {
            var attachments = context.Message.Attachments;

            if (attachments.Count > 0)
            {
                WebClient client = new WebClient();
                foreach (var attachment in attachments)
                {
                    client.DownloadFileAsync(new Uri(attachment.Url), $"{_config.GetValue<string>("config:downloadPath")}{attachment.Filename}");
                }

                DiscordWrapper.Log($"{log_discord} Downloaded {attachments.Count} file(s) from guild {context.Guild.Name}.");
            }
        }
示例#21
0
    public async Task Say(int wait_sec, [Remainder] string text)
    {
        await Context.Message.DeleteAsync();

        string author = Context.Message.Author.Mention;

        if (text.StartsWith("||") && text.EndsWith("||"))
        {
            text = text.Substring(2, text.Length - 4);
        }

        await Task.Delay(TimeSpan.FromMilliseconds(Math.Max(0, wait_sec * 1000 - 1900)));

        await DiscordWrapper.SendMessage(Context, $"*Từ {author}:*\n{text}");
    }
示例#22
0
    public async Task <IEnumerable <IMessage> > Print(ISocketMessageChannel Channel = null)
    {
        if (Channel == null)
        {
            Channel = Context.Channel;
        }
        Puzzle puzzle = Load();

        if (puzzle.IsOver)
        {
            var embed = new EmbedBuilder
            {
                Description = $"*{ MentionUtils.MentionUser(puzzle.PlayerId) }* đã kết thúc trò chơi trong ***{puzzle.MoveCount}*** bước! :partying_face::tada::confetti_ball:",
                Color       = Color.Red
            };
            await DiscordWrapper.SendMessage(Context, embed : embed.Build(), Channel : Channel);
        }
        else
        {
            var embed = new EmbedBuilder
            {
                Description = $"*Người chơi: { MentionUtils.MentionUser(puzzle.PlayerId) }*\nSố bước đã đi: {puzzle.MoveCount}.",
                Color       = Color.Magenta
            };
            await DiscordWrapper.SendMessage(Context, embed : embed.Build(), Channel : Channel);
        }

        string output = "";

        for (var i = 0; i < Puzzle.Size; i++)
        {
            for (var j = 0; j < Puzzle.Size; j++)
            {
                output += $"{puzzle.Board[i, j]} ";
            }
            if (i == 0)
            {
                output += $"{Puzzle.IconFull}\n";
            }
            else
            {
                output += ":black_large_square:\n";
            }
        }
        await Channel.SendMessageAsync(output);

        return(await Channel.GetMessagesAsync(2).FlattenAsync());
    }
示例#23
0
        public async Task Remove(string s_name, int day, int duration, [Remainder] string note = null)
        {
            await Context.Channel.TriggerTypingAsync();

            try
            {
                var schedule = JsonSerializer.Deserialize <TestSchedule>(File.ReadAllText(_config.GetValue <string>("json:TestSchedule.json")));
                var idx      = _subjects.GetValue <int>($"idx:{s_name}");
                if (idx == default && s_name != "Toan")
                {
                    throw new NullReferenceException("Subject name not found.");
                }

                if (note != null)
                {
                    note = $" ({note})";
                }

                schedule.Day[day - 2].Remove($"{s_name} - {duration}'{note}");
                schedule.Subject[idx].Remove($"Thứ {day} - {duration}'{note}");

                File.WriteAllText(_config.GetValue <string>("json:TestSchedule.json"), JsonSerializer.Serialize(schedule));

                await LogDiscord($"remove {s_name} {day} {duration}'{note}");

                var msg = await ReplyAsync($"Đã xoá bài kiểm tra môn {s_name} thành công! :partying_face::tada::confetti_ball:");

                await Task.Delay(TimeSpan.FromSeconds(3));

                await msg.DeleteAsync();
            }
            catch (Exception e)
            {
                DiscordWrapper.Log($"[log] {e}");

                var msg = await ReplyAsync("Có lỗi xảy ra. Hãy chắc chắn bạn đã nhập đúng cú pháp, với tên các môn học là: Toan, QP, TD, TCMN, CN, Tin, GDCD, Dia, Su, Anh, Van, Sinh, Hoa, Ly, và các thứ trong ngày là từ 2 đến 6.");

                await Task.Delay(TimeSpan.FromSeconds(3));

                await msg.DeleteAsync();
            }
            finally
            {
                await Context.Message.DeleteAsync();
            }
        }
    public async Task HelpCF()
    {
        var embedCF = new EmbedBuilder {
            Color = Color.Red
        };

        embedCF.AddField("*>> 'cf*",
                         "**>> Những lệnh liên quan Codeforces:**")
        .AddField("*'cf contest <số lượng, mặc định là 0>",
                  "Mèo cho bạn danh sách các contest sắp diễn ra, ưu tiên contest diễn ra (nếu số lượng là 0 thì in tất cả).")
        .AddField("*'cf user <handle>*",
                  "Mèo cho bạn thông tin về <handle>, gồm *rank*, *rating*, *maxRating*, *lastOnlineTime*.")
        .AddField("Các lệnh có thể không thực hiện được nếu máy chủ Codeforces đang trong giờ cao điểm.",
                  "*^^Chúc bạn thi thật tốt và vui vẻ!^^*");

        await DiscordWrapper.SendMessage(Context, embed : embedCF.Build());
    }
    public async Task KillFFmpeg()
    {
        Process          killFFmpeg        = new Process();
        ProcessStartInfo taskkillStartInfo = new ProcessStartInfo
        {
            FileName        = "taskkill",
            Arguments       = "/F /IM FFmpeg.exe",
            UseShellExecute = false,
            CreateNoWindow  = true
        };

        killFFmpeg.StartInfo = taskkillStartInfo;
        killFFmpeg.Start();

        DiscordWrapper.Log("[log] Playback terminated.");
        await Task.Delay(TimeSpan.FromMilliseconds(1000));
    }
示例#26
0
        public async Task Get(string s_name)
        {
            await Context.Channel.TriggerTypingAsync();

            try
            {
                var schedule = JsonSerializer.Deserialize <TestSchedule>(File.ReadAllText(_config.GetValue <string>("json:TestSchedule.json")));
                var idx      = _subjects.GetValue <int>($"idx:{s_name}");
                if (idx == default && s_name != "Toan")
                {
                    throw new NullReferenceException("Subject name not found.");
                }

                var embed = new EmbedBuilder
                {
                    Color = Color.LightOrange
                };
                if (schedule.Subject[idx].Any())
                {
                    embed.AddField($"*Môn {s_name}*", string.Join(", ", schedule.Subject[_subjects.GetValue <int>($"idx:{s_name}")]));
                }
                else
                {
                    embed.AddField($"*Môn {s_name}*", $"Không có bài kiểm tra nào cho môn {s_name} 7 ngày tới cả! :partying_face:");
                }

                await ReplyAsync(embed : embed.Build());
            }
            catch (Exception e)
            {
                DiscordWrapper.Log($"[log] {e}");

                await Context.Channel.TriggerTypingAsync();

                var msg = await ReplyAsync("Có lỗi xảy ra. Hãy chắc chắn bạn đã nhập đúng cú pháp, với tên các môn học là: Toan, QP, TD, TCMN, CN, Tin, GDCD, Dia, Su, Anh, Van, Sinh, Hoa, Ly.");

                await Task.Delay(TimeSpan.FromSeconds(3));

                await msg.DeleteAsync();
            }
            finally
            {
                await Context.Message.DeleteAsync();
            }
        }
    public async Task HelpExam()
    {
        var embedExam = new EmbedBuilder {
            Color = Color.LightOrange
        };

        embedExam.AddField("*>> 'exam*", "**>> Những lệnh liên quan đến các bài kiểm tra trong lớp T.T:**")
        .AddField("*'exam add <môn học> <thứ>(2 - 6) <thời lượng kiểm tra> <ghi chú>(nếu có)*", "Thêm bài kiểm tra vào danh sách của Mèo~")
        .AddField("*'exam get <thứ>(2 - 6)*", "Xem tất cả các bài kiểm tra có trong ngày hôm đó.")
        .AddField("*'exam get <môn học>*", "Xem tất cả các bài kiểm tra của môn học đó.")
        .AddField("*'exam all*", "Xem tất cả các bài kiểm tra có trong 7 ngày tới!")
        .AddField("*'exam rm <thứ>(2 - 6)*", "Xoá các bài kiểm tra của ngày đó trong danh sách của Mèo! :partying_face:")
        .AddField("*'exam rm <môn học> <thứ>(2 - 6) <thời lượng kiểm tra> <ghi chú>(nếu có)*", "Xoá bài kiểm tra trong danh sách của Mèo! :partying_face:")
        .AddField("*'exam clear*", "Xoá toàn bộ các bài kiểm tra trong danh sách của Mèo!!! :partying_face::tada::confetti_ball:")
        .AddField("^^Cố gắng lên nào!^^ :fist::fist:", "*^^Chúc bạn làm bài thật tốt!^^*");

        await DiscordWrapper.SendMessage(Context, embed : embedExam.Build());
    }
示例#28
0
        public async Task <bool> StartupAsync()
        {
            var splash = new SplashScreen();

            splash.Show();

            _vm = new MainViewModel()
            {
                AddDropCommand    = new RelayCommand(() => _vm.DiscordDrops.Insert(0, new DiscordDropViewModel())),
                RemoveDropCommand = new RelayCommand <DiscordDropViewModel>(drop => _vm.DiscordDrops.Remove(drop))
            };
            HotkeyManager.HotkeyFired += OnHotkeyFired;

            splash.DisplayTask(LoadingTask.LoadingSettings);
            _settings = await Task.Factory.StartNew(_serializer.Deserialize) ?? new Settings();

            splash.DisplayTask(LoadingTask.RegisteringHotkeys);
            if (_settings?.DiscordDrops != null)
            {
                foreach (var drop in _settings.DiscordDrops)
                {
                    if (HotkeyManager.Register(drop.HotKey, drop.Modifier, out int id))
                    {
                        drop.HotkeyId = id;
                        _vm.DiscordDrops.Add(drop);
                    }
                }
            }

            splash.DisplayTask(LoadingTask.LaunchingSelfBot);
            _discordWrapper        = new DiscordWrapper(_settings.TargetChannelId);
            _dropLimiter.FireDrop += (_, drop) => _discordWrapper.FireDrop(drop);
            if (!await _discordWrapper.LoginAsync(_settings, splash))
            {
                return(false);
            }

            splash.DisplayTask(LoadingTask.LoadingTaskbarIcon);
            _taskBarIcon = new TaskbarIcon(ShowHotkeyWindow);
            _taskBarIcon.Show();

            splash.Close();
            return(true);
        }
    public async Task LeaveAudio(IGuild guild)
    {
        try
        {
            IAudioClient client;
            if (ConnectedChannels.TryRemove(guild.Id, out client))
            {
                await CancelFFmpeg();

                await client.StopAsync();

                DiscordWrapper.Log($"[info][{LogSeverity.Info}] Disconnected from the voice on {guild.Name}.");
            }
        }
        catch (Exception ex)
        {
            DiscordWrapper.Log($"[log] {ex}");
        }
    }
    public async Task SendAudioAsync(IGuild guild, string path)
    {
        try
        {
            IAudioClient client;
            if (ConnectedChannels.TryGetValue(guild.Id, out client))
            {
                var OutFormat = new WaveFormat(48000, 16, 2);

                var reader = new Mp3FileReader(path);
                var naudio = WaveFormatConversionStream.CreatePcmStream(reader);

                byte[] buffer = new byte[naudio.Length];

                int rest = (int)(naudio.Length - naudio.Position);
                await naudio.ReadAsync(buffer, 0, rest);

                using (var dstream = client.CreatePCMStream(AudioApplication.Music))
                {
                    try
                    {
                        Global.cts       = new CancellationTokenSource();
                        Global.streaming = true;
                        await dstream.WriteAsync(buffer, 0, rest, Global.cts.Token);
                    }
                    finally
                    {
                        await dstream.FlushAsync();

                        Global.streaming = false;
                    }
                }
            }
            else
            {
                DiscordWrapper.Log("[log] Voice channel is not added.");
            }
        }
        catch (Exception ex)
        {
            DiscordWrapper.Log($"[log] {ex}");
        }
    }