Skip to content

Instantly share code, notes, and snippets.

@HurricanKai
Created December 3, 2017 17:40
Show Gist options
  • Save HurricanKai/db8743dc5d8c1e975736d07ef6f6bd1e to your computer and use it in GitHub Desktop.
Save HurricanKai/db8743dc5d8c1e975736d07ef6f6bd1e to your computer and use it in GitHub Desktop.
ForSharing
using BaseBot.JSON;
using DSharpPlus;
using DSharpPlus.CommandsNext;
using DSharpPlus.CommandsNext.Attributes;
using DSharpPlus.Entities;
using DSharpPlus.Interactivity;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BaseBot.Commands
{
//TODO: Full Rewrite of Poll System
[Group("Avatar"), Aliases("avatar", "a")]
public class PlayerManager
{
public static TimeSpan pollTime = TimeSpan.FromSeconds(1);
public static List<Poll> polls = new List<Poll>();
public static Dictionary<DiscordUser, DiscordEmoji> avatars = new Dictionary<DiscordUser, DiscordEmoji>();
[Command("set"), RequireRolesAttribute(RoleCheckMode.All, "Game Master")]
public async Task SetAvatar(CommandContext ctx, DiscordUser user, DiscordEmoji emoji)
{
if (avatars.ContainsKey(user))
{
avatars.Remove(user);
}
avatars.Add(user, emoji);
await ctx.RespondAsync($"{user.Mention} is {emoji.GetDiscordName()} now");
}
[Command("listp"), Aliases("ListP", "ListParticipants", "emojilist"), RequireRolesAttribute(RoleCheckMode.All, "Game Master")]
public async Task ListParticipant(CommandContext ctx)
{
string s = "";
string n = System.Environment.NewLine;
foreach (var v in avatars)
{
if (s.Count() > 19000)
{
s = "";
await ctx.Channel.SendMessageAsync(s);
}
s += $"{v.Value.GetDiscordName()} - {v.Key.Mention}{n}";
}
await ctx.Channel.SendMessageAsync(s);
}
[Command("votepoll"), Aliases("Votepoll"), RequireRolesAttribute(RoleCheckMode.All, "Game Master")]
public async Task VotePoll(CommandContext ctx)
{
string s = "";
string n = System.Environment.NewLine;
List<DiscordEmoji> sendEmojis = new List<DiscordEmoji>();
List<DiscordMessage> msgs = new List<DiscordMessage>();
foreach (var v in avatars)
{
if (s.Count() > 19000 || sendEmojis.Count == 20)
{
s = "";
var msg = await ctx.Channel.SendMessageAsync(s);
foreach (var v2 in sendEmojis)
await msg.CreateReactionAsync(v2);
msgs.Add(msg);
sendEmojis.Clear();
}
sendEmojis.Add(v.Value);
s += $"{v.Value.GetDiscordName()} - {v.Key.Mention}{n}";
}
var msg2 = await ctx.Channel.SendMessageAsync(s);
foreach (var v2 in sendEmojis)
await msg2.CreateReactionAsync(v2);
msgs.Add(msg2);
var p = new Poll() { channelid = (ulong)ctx.Channel.Id, Creation = DateTime.UtcNow.ToString(), Ids = new List<Id>() };
foreach (var v in msgs)
p.Ids.Add(new Id() { PurpleId = (ulong)v.Id });
polls.Add(p);
}
public const string File = "./Avatars.json";
public const string File2 = "./Polls.json";
[Command("Save"), RequireRolesAttribute(RoleCheckMode.All, "Game Master")]
public async Task Save(CommandContext ctx)
{
await ctx.RespondAsync("Saving...");
SaveS();
await ctx.RespondAsync("Saved.");
}
public static void SaveS()
{
string file = Path.GetFullPath(File);
var m = new AvatarManagerJSON();
m.Avatars = new List<Avatar>();
foreach (var v in avatars)
m.Avatars.Add(new Avatar() { Id = (long)v.Key.Id, PurpleAvatar = v.Value.GetDiscordName() });
var p = new PollJSON()
{
Polls = polls
};
System.IO.File.WriteAllText(Path.GetFullPath(File2), p.ToJson());
System.IO.File.WriteAllText(file, m.ToJson());
}
[Command("Load"), RequireRolesAttribute(RoleCheckMode.All, "Game Master")]
public async Task Load(CommandContext ctx)
{
await ctx.RespondAsync("Loading...");
await LoadS(ctx);
await ctx.RespondAsync("Loaded.");
}
[Command("CheckPolls"), Aliases("cp"), RequireRolesAttribute(RoleCheckMode.All, "Game Master")]
public async Task CheckPollsCMD(CommandContext ctx)
{
await CheckPolls(ctx);
}
public static async Task CheckPolls(CommandContext ctx)
{
foreach (var v in polls)
{
//TODO: Only Registered Avatars can vote.
if (DateTime.Parse(v.Creation) - DateTime.UtcNow <= pollTime)
{
Dictionary<DiscordUser, int> votes = new Dictionary<DiscordUser, int>();
Dictionary<DiscordUser, List<DiscordUser>> voters = new Dictionary<DiscordUser, List<DiscordUser>>();
var channel = ctx.Guild.GetChannel((ulong)v.channelid);
//Get Resulsts, and Post in First Message.
foreach (var v2 in v.Ids)
{
var message = await channel.GetMessageAsync((ulong)v2.PurpleId);
foreach (var v3 in avatars)
{
var reactors = await message.GetReactionsAsync(v3.Value);
if (votes.TryGetValue(v3.Key, out int Value))
{
votes.Remove(v3.Key);
votes.Add(v3.Key, Value + reactors.Count);
}
else
votes.Add(v3.Key, reactors.Count);
if (voters.TryGetValue(v3.Key, out List<DiscordUser> value))
{
voters.Remove(v3.Key);
value.AddRange(reactors);
voters.Add(v3.Key, value);
}
else
voters.Add(v3.Key, reactors.ToList());
}
}
string n = Environment.NewLine;
string s = "Votes: {n}";
foreach (var user in avatars)
{
if (voters.TryGetValue(user.Key, out List<DiscordUser> vots))
{
s += $"{user.Key.Mention}({user.Value.GetDiscordName()}) - {vots.Count}:{n}";
foreach (var v4 in vots)
s += $" - {v4.Mention}{n}";
}
if (s.Count() > 19000)
{
await ctx.RespondAsync(s);
s = "";
}
}
await ctx.RespondAsync(s);
}
}
}
public static async Task LoadS(CommandContext ctx)
{
string file = Path.GetFullPath(File);
var m = AvatarManagerJSON.FromJson(System.IO.File.ReadAllText(file));
avatars = new Dictionary<DiscordUser, DiscordEmoji>();
foreach (var v in m.Avatars)
{
var member = await ctx.Guild.GetMemberAsync((ulong)v.Id);
avatars.Add(member, DiscordEmoji.FromName(ctx.Client, v.PurpleAvatar));
}
file = Path.GetFullPath(File2);
var p = PollJSON.FromJson(System.IO.File.ReadAllText(file));
polls = p.Polls;
}
public static DiscordUser GetUser(string emoji)
{
foreach (var v in avatars)
{
if (v.Value.GetDiscordName() == emoji)
{
return v.Key;
}
}
return null;
}
public static DiscordEmoji GetAvatar(DiscordUser user)
{
if (avatars.TryGetValue(user, out DiscordEmoji value))
{
return value;
}
return null;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment