geekbot/Geekbot.net/Modules/UserInfo.cs

99 lines
3.7 KiB
C#
Raw Normal View History

2017-04-12 21:49:04 +02:00
using System;
2017-07-30 23:35:28 +02:00
using System.Collections.Generic;
using System.Text;
2017-04-12 21:49:04 +02:00
using System.Threading.Tasks;
2017-07-30 23:35:28 +02:00
using System.Linq;
2017-04-12 21:49:04 +02:00
using Discord;
using Discord.Commands;
2017-04-14 21:36:01 +02:00
using Geekbot.net.Lib;
using StackExchange.Redis;
2017-04-12 21:49:04 +02:00
namespace Geekbot.net.Modules
{
public class UserInfo : ModuleBase
{
private readonly IDatabase redis;
public UserInfo(IDatabase redis)
{
this.redis = redis;
}
2017-04-17 16:58:48 +02:00
[Alias("stats")]
2017-04-25 20:59:38 +02:00
[Command("user", RunMode = RunMode.Async), Summary("Get information about this user")]
2017-04-12 21:49:04 +02:00
public async Task User([Summary("The (optional) user to get info for")] IUser user = null)
{
var userInfo = user ?? Context.Message.Author;
var age = Math.Floor((DateTime.Now - userInfo.CreatedAt).TotalDays);
2017-04-17 16:58:48 +02:00
var key = Context.Guild.Id + "-" + userInfo.Id;
var messages = (int)redis.StringGet(key + "-messages");
2017-04-21 22:51:30 +02:00
var level = LevelCalc.GetLevelAtExperience(messages);
2017-04-14 21:36:01 +02:00
var guildKey = Context.Guild.Id.ToString();
var guildMessages = (int)redis.StringGet(guildKey + "-messages");
var percent = Math.Round((double)(100 * messages) / guildMessages, 2);
var eb = new EmbedBuilder();
eb.WithAuthor(new EmbedAuthorBuilder()
.WithIconUrl(userInfo.GetAvatarUrl())
.WithName(userInfo.Username));
2017-04-25 20:59:38 +02:00
2017-04-19 19:54:29 +02:00
eb.WithColor(new Color(221, 255, 119));
eb.AddField("Discordian Since", $"{userInfo.CreatedAt.Day}/{userInfo.CreatedAt.Month}/{userInfo.CreatedAt.Year} ({age} days)");
2017-04-19 19:23:22 +02:00
eb.AddInlineField("Level", level)
.AddInlineField("Messages Sent", messages)
.AddInlineField("Server Total", $"{percent}%");
var karma = redis.StringGet(key + "-karma");
if (!karma.IsNullOrEmpty)
2017-04-17 16:58:48 +02:00
{
eb.AddInlineField("Karma", karma);
2017-04-17 16:58:48 +02:00
}
var correctRolls = redis.StringGet($"{Context.Guild.Id}-{userInfo.Id}-correctRolls");
if (!correctRolls.IsNullOrEmpty)
{
eb.AddInlineField("Guessed Rolls", correctRolls);
}
await ReplyAsync("", false, eb.Build());
2017-04-12 21:49:04 +02:00
}
2017-04-13 00:03:03 +02:00
2017-07-30 23:35:28 +02:00
[Alias("highscore")]
[Command("rank", RunMode = RunMode.Async), Summary("get user top 10")]
public async Task Rank()
{
await ReplyAsync("this will take a moment...");
2017-07-31 00:20:37 +02:00
var guildKey = Context.Guild.Id.ToString();
var guildMessages = (int)redis.StringGet(guildKey + "-messages");
2017-07-30 23:35:28 +02:00
var allGuildUsers = await Context.Guild.GetUsersAsync();
var unsortedDict = new Dictionary<string, int>();
foreach(var user in allGuildUsers)
{
var key = Context.Guild.Id + "-" + user.Id;
var messages = (int)redis.StringGet(key + "-messages");
2017-07-30 23:35:28 +02:00
if(messages > 0) {
2017-07-31 00:20:37 +02:00
unsortedDict.Add($"{user.Username}#{user.Discriminator}", messages);
2017-07-30 23:35:28 +02:00
}
}
var sortedDict = unsortedDict.OrderByDescending(x => x.Value);
var reply = new StringBuilder();
2017-07-31 00:20:37 +02:00
reply.AppendLine($"Total Messages on {Context.Guild.Name}: {guildMessages}");
2017-07-30 23:35:28 +02:00
var count = 1;
foreach(KeyValuePair<string, int> entry in sortedDict)
{
if(count < 11){
2017-07-31 00:20:37 +02:00
var percent = Math.Round((double)(100 * entry.Value) / guildMessages, 2);
reply.AppendLine($"#{count} - **{entry.Key}** - {percent}% of total - {entry.Value} messages");
2017-07-30 23:35:28 +02:00
count++;
} else {
break;
}
}
await ReplyAsync(reply.ToString());
}
2017-04-12 21:49:04 +02:00
}
}