Пример #1
0
        public async Task <IActionResult> Index([FromQuery] string key)
        {
            var item = ChannelboardWeb.GetItem(key);

            if (item == null)
            {
                return(View(new ChannelboardViewModel(ChannelboardErrors.InvalidKey)));
            }

            var guild = Client.GetGuild(item.GuildID);

            if (guild == null)
            {
                return(View(new ChannelboardViewModel(ChannelboardErrors.InvalidGuild)));
            }

            var user = await guild.GetUserFromGuildAsync(item.UserID);

            if (user == null)
            {
                return(View(new ChannelboardViewModel(ChannelboardErrors.UserAtGuildNotFound)));
            }

            var data = await ChannelStats.GetChannelboardDataAsync(guild, user);

            return(View(new ChannelboardViewModel(guild, user, data)));
        }
Пример #2
0
        public IActionResult GetChannelboardData(string token)
        {
            if (string.IsNullOrEmpty(token))
            {
                return(BadRequest(new { Error = "Missing token", Code = ChannelboardErrors.MissingWebToken }));
            }

            if (!ChannelStats.ExistsWebToken(token))
            {
                return(BadRequest(new { Error = "Invalid token", Code = ChannelboardErrors.InvalidWebToken }));
            }

            var channelboardData = ChannelStats.GetChannelboardData(token, DiscordClient, out ChannelboardWebToken webToken);
            var guild            = DiscordClient.Guilds.First();
            var guildUser        = guild.GetUser(webToken.UserID);

            var data = new Channelboard()
            {
                Items = channelboardData,
                Guild = GuildInfo.Create(guild),
                User  = GuildUser.Create(guildUser)
            };

            return(Ok(data));
        }
Пример #3
0
 public MessageDeletedHandler(DiscordSocketClient client, ChannelStats channelStats, Logger logger, CalledEventStats calledEventStats)
 {
     Client           = client;
     Statistics       = channelStats;
     Logger           = logger;
     CalledEventStats = calledEventStats;
 }
Пример #4
0
 public LeaderboardController(ChannelStats stats, DiscordSocketClient client, ChannelboardWeb channelboardWeb,
                              UnverifyLogger unverifyLogger)
 {
     ChannelStats    = stats;
     Client          = client;
     ChannelboardWeb = channelboardWeb;
     UnverifyLogger  = unverifyLogger;
 }
Пример #5
0
 public BotStatusService(ChannelStats channelStats, IHostingEnvironment hostingEnvironment, Logger.Logger logger,
                         IOptions <Configuration> config, Statistics.Statistics statistics)
 {
     Statistics         = statistics;
     HostingEnvironment = hostingEnvironment;
     Logger             = logger;
     Config             = config.Value;
     ChannelStats       = channelStats;
 }
Пример #6
0
 public MessageReceivedHandler(DiscordSocketClient client, CommandService commands, IOptions <Configuration> config, IServiceProvider services,
                               ChannelStats channelStats, AutoReplyService autoReply, EmoteChain emoteChain, CalledEventStats calledEventStats, Statistics statistics,
                               EmoteStats emoteStats)
 {
     Client           = client;
     Commands         = commands;
     Services         = services;
     ChannelStats     = channelStats;
     AutoReply        = autoReply;
     EmoteChain       = emoteChain;
     CalledEventStats = calledEventStats;
     Statistics       = statistics;
     EmoteStats       = emoteStats;
     Config           = config.Value;
 }
Пример #7
0
        public SimpleBotStatus GetSimpleStatus()
        {
            var process = Process.GetCurrentProcess();

            return(new SimpleBotStatus()
            {
                RamUsage = FormatHelper.FormatAsSize(process.WorkingSet64),
                ActiveWebTokensCount = ChannelStats.GetActiveWebTokensCount(),
                InstanceType = GetInstanceType(),
                StartTime = process.StartTime,
                ThreadStatus = GetThreadStatus(process),
                AvgReactTime = Statistics.GetAvgReactTime(),
                ActiveCpuTime = process.TotalProcessorTime
            });
        }
Пример #8
0
 public WrappedCallInvoker(ChannelStats channelStats, CallInvoker callInvoker)
 {
     _channelStats    = channelStats;
     _baseCallInvoker = callInvoker;
 }
Пример #9
0
        private async void run_Click(object sender, RoutedEventArgs e)
        {
            StatsConfig conf = DataContext as StatsConfig;

            guildName.Text           = conf.Guild.Name;
            preRunContent.Visibility = Visibility.Collapsed;
            runContent.Visibility    = Visibility.Visible;
            GuildStats stats = new GuildStats(conf.Guild);

            StringBuilder strBuilder = new StringBuilder();

            if (selectAllChannels.IsChecked != false)
            {
                foreach (var channel in selectedChannels.SelectedItems.Cast <DiscordChannel>())
                {
                    strBuilder.Append($"&channel_id={channel.Id}");
                }
            }

            string append = strBuilder.ToString();

            string initialResult = await _httpClient.GetStringAsync($"https://discordapp.com/api/v7/guilds/{conf.Guild.Id}/messages/search?include_nsfw=true" + append);

            stats.TotalMessages = GetCount(initialResult);

            if (conf.UserMentionCounts == true || conf.UserMessageCounts == true)
            {
                await SetStatus("Retrieving members... (This may take a while)");

                var members = (await conf.Guild.GetAllMembersAsync()).OrderBy(m => m.Username).ToList();

                if (selectAllRoles.IsChecked != true)
                {
                    members.RemoveAll(m => !m.Roles.Any(r => selectedRoles.SelectedItems.Contains(r)));
                }

                var users = members.Cast <DiscordUser>().ToList();

                if (conf.IncludeBannedUsers == true)
                {
                    await SetStatus("Retrieving bans... (This may take a while)");

                    var bans = await conf.Guild.GetBansAsync();

                    users.AddRange(bans.Select(b => b.User));
                }

                Stopwatch watch    = new Stopwatch();
                TimeSpan  timeSpan = default;

                watch.Start();
                for (int i = 0; i < users.Count; i++)
                {
                    var m = users.ElementAt(i);
                    await SetStatus($"Searching for @{m.Username}#{m.Discriminator}", $"{i + 1}/{users.Count} - {timeSpan:mm\\:ss} remaining", i, users.Count);

                    var mstats = new MemberStats(m, stats.TotalMessages);

                    if (conf.UserMessageCounts == true)
                    {
                        try
                        {
                            string sentResult = await _httpClient.GetStringAsync($"https://discordapp.com/api/v7/guilds/{conf.Guild.Id}/messages/search?author_id={m.Id}&include_nsfw=true" + append);

                            mstats.SentMessages         = GetCount(sentResult);
                            stats.MessagesAccountedFor += mstats.SentMessages;

                            var array = JObject.Parse(sentResult)["messages"].FirstOrDefault();

                            if (array != null)
                            {
                                var message = array.ElementAtOrDefault(1) ?? array.ElementAtOrDefault(0);
                                if (message != null)
                                {
                                    mstats.LastMessage = message["timestamp"].ToObject <DateTimeOffset>().ToUniversalTime();
                                }
                            }

                            if (conf.BanMeDaddy != false)
                            {
                                await Task.Delay(100);
                            }
                        }
                        catch (Exception ex)
                        {
                            HandleError(ex);
                            continue;
                        }
                    }

                    if (conf.UserMentionCounts == true)
                    {
                        try
                        {
                            string sentResult = await _httpClient.GetStringAsync($"https://discordapp.com/api/v7/guilds/{conf.Guild.Id}/messages/search?mentions={m.Id}&include_nsfw=true" + append);

                            mstats.Mentions = GetCount(sentResult);

                            if (conf.BanMeDaddy != false)
                            {
                                await Task.Delay(100);
                            }
                        }
                        catch (Exception ex)
                        {
                            HandleError(ex);
                            continue;
                        }
                    }

                    timeSpan = TimeSpan.FromTicks((watch.Elapsed.Ticks / (i + 1)) * (users.Count - i));
                    stats.MemberStats.Add(mstats);
                }
            }

            if (conf.ChannelMessageCounts == true)
            {
                DiscordMember currentMember = conf.Guild.CurrentMember;
                configureGrid.Visibility = Visibility.Visible;
                var channels = conf.Guild.Channels
                               .Where(c => c.PermissionsFor(currentMember).HasFlag(Permissions.AccessChannels))
                               .Where(c => c.Type == ChannelType.Text)
                               .OrderBy(c => c.Position).ToList();

                for (int i = 0; i < channels.Count; i++)
                {
                    DiscordChannel c = channels.ElementAt(i);
                    await SetStatus($"Getting message count for #{c.Name}", $"{i + 1}/{channels.Count}", i, channels.Count);

                    ChannelStats channelStat = new ChannelStats(c);

                    string result = await _httpClient.GetStringAsync($"https://discordapp.com/api/v7/guilds/{conf.Guild.Id}/messages/search?channel_id={c.Id}&include_nsfw=true");

                    channelStat.Messages = GetCount(result);
                    stats.ChannelStats.Add(channelStat);

                    if (conf.BanMeDaddy != false)
                    {
                        await Task.Delay(100);
                    }
                }
            }

            await Dispatcher.InvokeAsync(() =>
            {
                runContent.Visibility     = Visibility.Collapsed;
                resultsContent.Visibility = Visibility.Visible;
                resultsContent.Navigate(new ResultsPage(stats));
            });
        }
Пример #10
0
 public ChannelboardModule(ChannelStats channelStats, ChannelboardWeb channelboardWeb)
 {
     Stats           = channelStats;
     ChannelboardWeb = channelboardWeb;
 }
Пример #11
0
        private async Task OnMessageReceivedAsync(SocketMessage message)
        {
            CalledEventStats.Increment("MessageReceived");

            var messageStopwatch = new Stopwatch();

            messageStopwatch.Start();

            try
            {
                if (!TryParseMessage(message, out SocketUserMessage userMessage))
                {
                    return;
                }

                var commandStopwatch = new Stopwatch();
                var context          = new SocketCommandContext(Client, userMessage);

                if (message.Channel is IPrivateChannel && !Config.IsUserBotAdmin(userMessage.Author.Id))
                {
                    return;
                }

                int argPos = 0;
                if (userMessage.HasStringPrefix(Config.CommandPrefix, ref argPos) || userMessage.HasMentionPrefix(Client.CurrentUser, ref argPos))
                {
                    await LogCommandAsync(userMessage, context, argPos).ConfigureAwait(false);

                    commandStopwatch.Start();
                    var result = await Commands.ExecuteAsync(context, userMessage.Content.Substring(argPos), Services).ConfigureAwait(false);

                    commandStopwatch.Stop();

                    if (!result.IsSuccess && result.Error != null)
                    {
                        switch (result.Error.Value)
                        {
                        case CommandError.UnknownCommand: return;

                        case CommandError.UnmetPrecondition:
                        case CommandError.ParseFailed:
                            await context.Channel.SendMessageAsync(result.ErrorReason.PreventMassTags()).ConfigureAwait(false);

                            break;

                        case CommandError.BadArgCount:
                            await SendCommandHelp(context, argPos).ConfigureAwait(false);

                            break;

                        default:
                            throw new BotException(result);
                        }
                    }

                    var command = message.Content.Split(' ')[0];
                    Statistics.LogCall(command, commandStopwatch.ElapsedMilliseconds);
                    await EmoteChain.CleanupAsync(context.Channel, true).ConfigureAwait(false);
                }
                else
                {
                    await ChannelStats.IncrementCounterAsync(userMessage.Channel).ConfigureAwait(false);

                    await AutoReply.TryReplyAsync(userMessage).ConfigureAwait(false);

                    await EmoteChain.ProcessChainAsync(context).ConfigureAwait(false);

                    await EmoteStats.AnylyzeMessageAndIncrementValuesAsync(context).ConfigureAwait(false);
                }
            }
            finally
            {
                messageStopwatch.Stop();
                Statistics.ComputeAvgReact(messageStopwatch.ElapsedMilliseconds);
            }
        }
Пример #12
0
 public ChannelboardController(ChannelStats stats, DiscordSocketClient client, ChannelboardWeb channelboardWeb)
 {
     ChannelStats    = stats;
     Client          = client;
     ChannelboardWeb = channelboardWeb;
 }
Пример #13
0
 public ChannelboardController(ChannelStats channelStats, DiscordSocketClient discordClient)
 {
     ChannelStats  = channelStats;
     DiscordClient = discordClient;
 }
Пример #14
0
        public static void ToExcel(GuildStats stats)
        {
            using (CommonSaveFileDialog dialog = new CommonSaveFileDialog())
            {
                dialog.Filters.Add(new CommonFileDialogFilter("Excel file", ".xlsx"));
                if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
                {
                    Ookii.Dialogs.Wpf.TaskDialog progressDialog = new Ookii.Dialogs.Wpf.TaskDialog
                    {
                        Content = $"Exporting to \"{Path.GetFileName(dialog.FileName)}.xlsx\"",
                        AllowDialogCancellation = false,
                        WindowTitle             = "Exporting to Excel"
                    };

                    progressDialog.Buttons.Add(new Ookii.Dialogs.Wpf.TaskDialogButton(Ookii.Dialogs.Wpf.ButtonType.Cancel));
                    progressDialog.ProgressBarState   = Ookii.Dialogs.Wpf.ProgressBarState.Normal;
                    progressDialog.ProgressBarStyle   = Ookii.Dialogs.Wpf.ProgressBarStyle.MarqueeProgressBar;
                    progressDialog.ProgressBarMaximum = stats.MemberStats.Count() + stats.ChannelStats.Count();

                    new Thread(() =>
                    {
                        try
                        {
                            Application app       = new Application();
                            Workbook workbook     = app.Workbooks.Add();
                            Worksheet memberSheet = workbook.Sheets.Add();

                            try
                            {
                                App.Current.Dispatcher.Invoke(() => progressDialog.ProgressBarStyle = Ookii.Dialogs.Wpf.ProgressBarStyle.ProgressBar);

                                memberSheet.Name = "Members";

                                memberSheet.Cells[1, 1] = "Id";
                                memberSheet.Cells[1, 2] = "Username";
                                memberSheet.Cells[1, 3] = "Sent Messages";
                                memberSheet.Cells[1, 4] = "Mentions";
                                memberSheet.Cells[1, 5] = "Avg Messages / Day";
                                memberSheet.Cells[1, 6] = "Last Message";

                                for (int i = 0; i < stats.MemberStats.Count(); i++)
                                {
                                    MemberStats stat            = stats.MemberStats.ElementAt(i);
                                    memberSheet.Cells[i + 2, 1] = stat.Id.ToString();
                                    memberSheet.Cells[i + 2, 2] = stat.Username.Trim('=');

                                    memberSheet.Cells[i + 2, 3] = stat.SentMessages;
                                    memberSheet.Cells[i + 2, 4] = stat.Mentions;
                                    memberSheet.Cells[i + 2, 5] = stat.AvgMessagesPerDay;
                                    memberSheet.Cells[i + 2, 6] = stat.LastMessage.ToString();

                                    if ((i % 3) == 0)
                                    {
                                        App.Current.Dispatcher.Invoke(() => { try { progressDialog.ProgressBarValue = (progressDialog.ProgressBarValue + 3); } catch { } });
                                    }
                                }

                                Worksheet channelsSheet = workbook.Sheets.Add();
                                channelsSheet.Name      = "Channels";



                                channelsSheet.Cells[1, 1] = "Id";
                                channelsSheet.Cells[1, 2] = "Name";
                                channelsSheet.Cells[1, 3] = "Message Count";
                                channelsSheet.Cells[1, 4] = "Avg Messages / Day";

                                for (int i = 0; i < stats.ChannelStats.Count(); i++)
                                {
                                    ChannelStats stat             = stats.ChannelStats.ElementAt(i);
                                    channelsSheet.Cells[i + 2, 1] = stat.Id.ToString();
                                    channelsSheet.Cells[i + 2, 2] = stat.Name.Trim('=');

                                    channelsSheet.Cells[i + 2, 3] = stat.Messages;
                                    channelsSheet.Cells[i + 2, 4] = stat.AvgMessagesPerDay;

                                    App.Current.Dispatcher.Invoke(() => { try { progressDialog.ProgressBarValue = (progressDialog.ProgressBarValue + 1); } catch { } });
                                }
                            }
                            finally
                            {
                                workbook.SaveAs(dialog.FileName);
                                workbook.Close();
                                app.Quit();

                                App.Current.Dispatcher.Invoke(() => progressDialog.Dispose());
                            }
                        }
                        catch (Exception ex)
                        {
                            MainWindow.ShowTaskDialog($"Something went wrong exporting to Excel and an {ex.GetType().Name} occured.", Ookii.Dialogs.Wpf.TaskDialogIcon.Error);
                            App.Current.Dispatcher.Invoke(() => progressDialog.Dispose());
                        }
                    }).Start();

                    progressDialog.Show();
                }
            }
        }
Пример #15
0
 public ChannelboardModule(ChannelStats channelStats)
 {
     Stats = channelStats;
 }