Merge pull request #8 from pizzaandcoffee/checkem

!Checkem, !Help and Code Opimizations
This commit is contained in:
Daan Boerlage 2017-09-15 23:00:01 +02:00 committed by GitHub
commit 61542c5a3e
25 changed files with 440 additions and 193 deletions

View file

@ -0,0 +1,40 @@
using System;
using System.IO;
namespace Geekbot.net.Lib
{
public class CheckEmImageProvider : ICheckEmImageProvider
{
private readonly string[] checkEmImageArray;
private readonly Random rnd;
private readonly int totalCheckEmImages;
public CheckEmImageProvider()
{
var path = Path.GetFullPath("./Storage/checkEmPics");
if (File.Exists(path))
{
var rawCheckEmPics = File.ReadAllText(path);
checkEmImageArray = rawCheckEmPics.Split("\n");
totalCheckEmImages = checkEmImageArray.Length;
rnd = new Random();
Console.WriteLine($"- Loaded {totalCheckEmImages} CheckEm Images");
}
else
{
Console.WriteLine("checkEmPics File not found");
Console.WriteLine($"Path should be {path}");
}
}
public string GetRandomCheckEmPic()
{
return checkEmImageArray[rnd.Next(0, totalCheckEmImages)];
}
}
public interface ICheckEmImageProvider
{
string GetRandomCheckEmPic();
}
}

View file

@ -1,26 +1,24 @@
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace Geekbot.net.Lib namespace Geekbot.net.Lib
{ {
class Fortunes : IFortunes internal class FortunesProvider : IFortunesProvider
{ {
private string[] fortuneArray; private readonly string[] fortuneArray;
private int totalFortunes; private readonly Random rnd;
private Random rnd; private readonly int totalFortunes;
public Fortunes() public FortunesProvider()
{ {
var path = Path.GetFullPath("./fortunes"); var path = Path.GetFullPath("./Storage/fortunes");
if (File.Exists(path)) if (File.Exists(path))
{ {
var rawFortunes= File.ReadAllText(path); var rawFortunes = File.ReadAllText(path);
fortuneArray = rawFortunes.Split("%"); fortuneArray = rawFortunes.Split("%");
totalFortunes = fortuneArray.Length; totalFortunes = fortuneArray.Length;
rnd = new Random(); rnd = new Random();
Console.WriteLine($"- Loaded {totalFortunes} Fortunes");
} }
else else
{ {
@ -40,7 +38,7 @@ namespace Geekbot.net.Lib
} }
} }
public interface IFortunes public interface IFortunesProvider
{ {
string GetRandomFortune(); string GetRandomFortune();
string GetFortune(int id); string GetFortune(int id);

View file

@ -1,20 +1,16 @@
using System; using System;
using System.Collections.Generic;
using System.Text;
namespace Geekbot.net.Lib namespace Geekbot.net.Lib
{ {
class LevelCalc internal class LevelCalc
{ {
private static int GetExperienceAtLevel(int level) private static int GetExperienceAtLevel(int level)
{ {
double total = 0; double total = 0;
for (int i = 1; i < level; i++) for (var i = 1; i < level; i++)
{
total += Math.Floor(i + 300 * Math.Pow(2, i / 7.0)); total += Math.Floor(i + 300 * Math.Pow(2, i / 7.0));
}
return (int)Math.Floor(total / 16); return (int) Math.Floor(total / 16);
} }
public static int GetLevelAtExperience(int experience) public static int GetLevelAtExperience(int experience)
@ -22,10 +18,8 @@ namespace Geekbot.net.Lib
int index; int index;
for (index = 0; index < 120; index++) for (index = 0; index < 120; index++)
{
if (GetExperienceAtLevel(index + 1) > experience) if (GetExperienceAtLevel(index + 1) > experience)
break; break;
}
return index; return index;
} }

View file

@ -1,5 +1,4 @@
using System; using System.Threading.Tasks;
using System.Threading.Tasks;
using Discord.WebSocket; using Discord.WebSocket;
using StackExchange.Redis; using StackExchange.Redis;
@ -7,7 +6,6 @@ namespace Geekbot.net.Lib
{ {
public class StatsRecorder public class StatsRecorder
{ {
private readonly SocketMessage message; private readonly SocketMessage message;
private readonly IDatabase redis; private readonly IDatabase redis;

View file

@ -1,4 +1,5 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Discord;
using Discord.Commands; using Discord.Commands;
using StackExchange.Redis; using StackExchange.Redis;
@ -8,14 +9,16 @@ namespace Geekbot.net.Modules
public class AdminCmd : ModuleBase public class AdminCmd : ModuleBase
{ {
private readonly IDatabase redis; private readonly IDatabase redis;
public AdminCmd(IDatabase redis) public AdminCmd(IDatabase redis)
{ {
this.redis = redis; this.redis = redis;
} }
[RequireUserPermission(Discord.GuildPermission.Administrator)] [RequireUserPermission(GuildPermission.Administrator)]
[Command("welcome", RunMode = RunMode.Async), Summary("Set a Welcome Message (use '$user' to mention the new joined user).")] [Command("welcome", RunMode = RunMode.Async)]
public async Task SetWelcomeMessage([Remainder, Summary("The message")] string welcomeMessage) [Summary("Set a Welcome Message (use '$user' to mention the new joined user).")]
public async Task SetWelcomeMessage([Remainder] [Summary("message")] string welcomeMessage)
{ {
var key = Context.Guild.Id + "-welcomeMsg"; var key = Context.Guild.Id + "-welcomeMsg";
redis.StringSet(key, welcomeMessage); redis.StringSet(key, welcomeMessage);
@ -24,7 +27,8 @@ namespace Geekbot.net.Modules
formatedMessage); formatedMessage);
} }
[Command("youtubekey", RunMode = RunMode.Async), Summary("Set the youtube api key")] [Command("youtubekey", RunMode = RunMode.Async)]
[Summary("Set the youtube api key")]
public async Task SetYoutubeKey([Summary("API Key")] string key) public async Task SetYoutubeKey([Summary("API Key")] string key)
{ {
var botOwner = redis.StringGet("botOwner"); var botOwner = redis.StringGet("botOwner");

View file

@ -1,5 +1,4 @@
using System; using System.Threading.Tasks;
using System.Threading.Tasks;
using Discord.Commands; using Discord.Commands;
using RestSharp; using RestSharp;
@ -7,17 +6,15 @@ namespace Geekbot.net.Modules
{ {
public class Cat : ModuleBase public class Cat : ModuleBase
{ {
[Command("cat", RunMode = RunMode.Async), Summary("Return a random image of a cat.")] [Command("cat", RunMode = RunMode.Async)]
[Summary("Return a random image of a cat.")]
public async Task Say() public async Task Say()
{ {
var catClient = new RestClient("http://random.cat"); var catClient = new RestClient("http://random.cat");
var request = new RestRequest("meow.php", Method.GET); var request = new RestRequest("meow.php", Method.GET);
catClient.ExecuteAsync<CatResponse>(request, async response => { catClient.ExecuteAsync<CatResponse>(request, async response => { await ReplyAsync(response.Data.file); });
await ReplyAsync(response.Data.file);
});
} }
} }
public class CatResponse public class CatResponse

View file

@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Discord.Commands;
using Geekbot.net.Lib;
namespace Geekbot.net.Modules
{
public class CheckEm : ModuleBase
{
private readonly ICheckEmImageProvider checkEmImages;
private readonly Random rnd;
public CheckEm(Random RandomClient, ICheckEmImageProvider checkEmImages)
{
rnd = RandomClient;
this.checkEmImages = checkEmImages;
}
[Command("checkem", RunMode = RunMode.Async)]
[Summary("Check for dubs")]
public async Task MuhDubs()
{
try
{
var number = rnd.Next(10000000, 99999999);
var dubtriqua = "";
var ns = GetIntArray(number);
Console.WriteLine(ns.Length);
if (ns[7] == ns[6])
{
dubtriqua = "DUBS";
if (ns[6] == ns[5])
{
dubtriqua = "TRIPS";
if (ns[5] == ns[4])
dubtriqua = "QUADS";
}
}
var sb = new StringBuilder();
sb.AppendLine($"Check em {Context.User.Mention}");
sb.AppendLine($"**{number}**");
if (!string.IsNullOrEmpty(dubtriqua))
sb.AppendLine($":tada: {dubtriqua} :tada:");
sb.AppendLine(checkEmImages.GetRandomCheckEmPic());
await ReplyAsync(sb.ToString());
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
private int[] GetIntArray(int num)
{
var listOfInts = new List<int>();
while (num > 0)
{
listOfInts.Add(num % 10);
num = num / 10;
}
listOfInts.Reverse();
return listOfInts.ToArray();
}
}
}

View file

@ -7,13 +7,15 @@ namespace Geekbot.net.Modules
public class Choose : ModuleBase public class Choose : ModuleBase
{ {
private readonly Random rnd; private readonly Random rnd;
public Choose(Random RandomClient) public Choose(Random RandomClient)
{ {
rnd = RandomClient; rnd = RandomClient;
} }
[Command("choose", RunMode = RunMode.Async), Summary("Let the bot make a choice for you.")] [Command("choose", RunMode = RunMode.Async)]
public async Task Command([Remainder, Summary("The choices, sepperated by a ;")] string choices) [Summary("Seperate options with a semicolon.")]
public async Task Command([Remainder] [Summary("option1;option2")] string choices)
{ {
var choicesArray = choices.Split(';'); var choicesArray = choices.Split(';');
var choice = rnd.Next(choicesArray.Length); var choice = rnd.Next(choicesArray.Length);

View file

@ -9,13 +9,15 @@ namespace Geekbot.net.Modules
public class Counters : ModuleBase public class Counters : ModuleBase
{ {
private readonly IDatabase redis; private readonly IDatabase redis;
public Counters(IDatabase redis) public Counters(IDatabase redis)
{ {
this.redis = redis; this.redis = redis;
} }
[Command("good", RunMode = RunMode.Async), Summary("Increase Someones Karma")] [Command("good", RunMode = RunMode.Async)]
public async Task Good([Summary("The someone")] IUser user) [Summary("Increase Someones Karma")]
public async Task Good([Summary("@someone")] IUser user)
{ {
var lastKarma = GetLastKarma(); var lastKarma = GetLastKarma();
if (user.Id == Context.User.Id) if (user.Id == Context.User.Id)
@ -24,12 +26,13 @@ namespace Geekbot.net.Modules
} }
else if (lastKarma > GetUnixTimestamp()) else if (lastKarma > GetUnixTimestamp())
{ {
await ReplyAsync($"Sorry {Context.User.Username}, but you have to wait {GetTimeLeft(lastKarma)} before you can give karma again..."); await ReplyAsync(
$"Sorry {Context.User.Username}, but you have to wait {GetTimeLeft(lastKarma)} before you can give karma again...");
} }
else else
{ {
var key = Context.Guild.Id + "-" + user.Id + "-karma"; var key = Context.Guild.Id + "-" + user.Id + "-karma";
var badJokes = (int)redis.StringGet(key); var badJokes = (int) redis.StringGet(key);
var newBadJokes = badJokes + 1; var newBadJokes = badJokes + 1;
redis.StringSet(key, newBadJokes.ToString()); redis.StringSet(key, newBadJokes.ToString());
var lastKey = Context.Guild.Id + "-" + Context.User.Id + "-karma-timeout"; var lastKey = Context.Guild.Id + "-" + Context.User.Id + "-karma-timeout";
@ -44,13 +47,14 @@ namespace Geekbot.net.Modules
eb.Title = "Karma Increased"; eb.Title = "Karma Increased";
eb.AddInlineField("By", Context.User.Username); eb.AddInlineField("By", Context.User.Username);
eb.AddInlineField("amount", "+1"); eb.AddInlineField("amount", "+1");
eb.AddInlineField("Current Karma",newBadJokes); eb.AddInlineField("Current Karma", newBadJokes);
await ReplyAsync("", false, eb.Build()); await ReplyAsync("", false, eb.Build());
} }
} }
[Command("bad", RunMode = RunMode.Async), Summary("Decrease Someones Karma")] [Command("bad", RunMode = RunMode.Async)]
public async Task Bad([Summary("The someone")] IUser user) [Summary("Decrease Someones Karma")]
public async Task Bad([Summary("@someone")] IUser user)
{ {
var lastKarma = GetLastKarma(); var lastKarma = GetLastKarma();
if (user.Id == Context.User.Id) if (user.Id == Context.User.Id)
@ -59,12 +63,13 @@ namespace Geekbot.net.Modules
} }
else if (lastKarma > GetUnixTimestamp()) else if (lastKarma > GetUnixTimestamp())
{ {
await ReplyAsync($"Sorry {Context.User.Username}, but you have to wait {GetTimeLeft(lastKarma)} before you can take karma again..."); await ReplyAsync(
$"Sorry {Context.User.Username}, but you have to wait {GetTimeLeft(lastKarma)} before you can take karma again...");
} }
else else
{ {
var key = Context.Guild.Id + "-" + user.Id + "-karma"; var key = Context.Guild.Id + "-" + user.Id + "-karma";
var badJokes = (int)redis.StringGet(key); var badJokes = (int) redis.StringGet(key);
var newBadJokes = badJokes - 1; var newBadJokes = badJokes - 1;
redis.StringSet(key, newBadJokes.ToString()); redis.StringSet(key, newBadJokes.ToString());
var lastKey = Context.Guild.Id + "-" + Context.User.Id + "-karma-timeout"; var lastKey = Context.Guild.Id + "-" + Context.User.Id + "-karma-timeout";
@ -79,7 +84,7 @@ namespace Geekbot.net.Modules
eb.Title = "Karma Decreased"; eb.Title = "Karma Decreased";
eb.AddInlineField("By", Context.User.Username); eb.AddInlineField("By", Context.User.Username);
eb.AddInlineField("amount", "-1"); eb.AddInlineField("amount", "-1");
eb.AddInlineField("Current Karma",newBadJokes); eb.AddInlineField("Current Karma", newBadJokes);
await ReplyAsync("", false, eb.Build()); await ReplyAsync("", false, eb.Build());
} }
} }
@ -89,27 +94,25 @@ namespace Geekbot.net.Modules
var lastKey = Context.Guild.Id + "-" + Context.User.Id + "-karma-timeout"; var lastKey = Context.Guild.Id + "-" + Context.User.Id + "-karma-timeout";
var redisReturn = redis.StringGet(lastKey); var redisReturn = redis.StringGet(lastKey);
if (!int.TryParse(redisReturn.ToString(), out var i)) if (!int.TryParse(redisReturn.ToString(), out var i))
{
i = GetUnixTimestamp(); i = GetUnixTimestamp();
}
return i; return i;
} }
private int GetNewLastKarma() private int GetNewLastKarma()
{ {
var timeout = TimeSpan.FromMinutes(3); var timeout = TimeSpan.FromMinutes(3);
return (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).Add(timeout)).TotalSeconds; return (int) DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).Add(timeout).TotalSeconds;
} }
private int GetUnixTimestamp() private int GetUnixTimestamp()
{ {
return (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; return (int) DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
} }
private string GetTimeLeft(int time) private string GetTimeLeft(int time)
{ {
DateTime dtDateTime = new DateTime(1970,1,1,0,0,0,0,DateTimeKind.Utc); var dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
dtDateTime = dtDateTime.AddSeconds( time ).ToLocalTime(); dtDateTime = dtDateTime.AddSeconds(time).ToLocalTime();
var dt = dtDateTime.Subtract(DateTime.Now); var dt = dtDateTime.Subtract(DateTime.Now);
return $"{dt.Minutes} Minutes and {dt.Seconds} Seconds"; return $"{dt.Minutes} Minutes and {dt.Seconds} Seconds";
} }

View file

@ -1,22 +1,22 @@
using System; using System;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Discord; using Discord;
using Discord.Commands; using Discord.Commands;
using StackExchange.Redis;
namespace Geekbot.net.Modules namespace Geekbot.net.Modules
{ {
public class Dice : ModuleBase public class Dice : ModuleBase
{ {
private readonly Random rnd; private readonly Random rnd;
public Dice(Random RandomClient) public Dice(Random RandomClient)
{ {
rnd = RandomClient; rnd = RandomClient;
} }
[Command("dice", RunMode = RunMode.Async), Summary("Roll a dice.")] [Command("dice", RunMode = RunMode.Async)]
public async Task RollCommand([Remainder, Summary("1d20, 1d6, 2d3, etc...")] string diceType = "1d6") [Summary("Roll a dice.")]
public async Task RollCommand([Remainder] [Summary("diceType")] string diceType = "1d6")
{ {
var dice = diceType.Split("d"); var dice = diceType.Split("d");
@ -45,9 +45,7 @@ namespace Geekbot.net.Modules
eb.WithColor(new Color(133, 189, 219)); eb.WithColor(new Color(133, 189, 219));
eb.Title = $":game_die: Dice Roll - Type {diceType} :game_die:"; eb.Title = $":game_die: Dice Roll - Type {diceType} :game_die:";
for (var i = 0; i < times; i++) for (var i = 0; i < times; i++)
{ eb.AddInlineField($"Dice {i + 1}", rnd.Next(1, max));
eb.AddInlineField($"Dice {i+1}", rnd.Next(1, max));
}
await ReplyAsync("", false, eb.Build()); await ReplyAsync("", false, eb.Build());
} }
} }

View file

@ -7,16 +7,15 @@ namespace Geekbot.net.Modules
{ {
public class Dog : ModuleBase public class Dog : ModuleBase
{ {
[Command("dog", RunMode = RunMode.Async), Summary("Return a random image of a dog.")] [Command("dog", RunMode = RunMode.Async)]
[Summary("Return a random image of a dog.")]
public async Task Say() public async Task Say()
{ {
var dogClient = new RestClient("http://random.dog"); var dogClient = new RestClient("http://random.dog");
var request = new RestRequest("woof.json", Method.GET); var request = new RestRequest("woof.json", Method.GET);
Console.WriteLine(dogClient.BaseUrl); Console.WriteLine(dogClient.BaseUrl);
dogClient.ExecuteAsync<DogResponse>(request, async response => { dogClient.ExecuteAsync<DogResponse>(request, async response => { await ReplyAsync(response.Data.url); });
await ReplyAsync(response.Data.url);
});
} }
} }

View file

@ -8,14 +8,18 @@ namespace Geekbot.net.Modules
public class EightBall : ModuleBase public class EightBall : ModuleBase
{ {
private readonly Random rnd; private readonly Random rnd;
public EightBall(Random RandomClient) public EightBall(Random RandomClient)
{ {
rnd = RandomClient; rnd = RandomClient;
} }
[Command("8ball", RunMode = RunMode.Async), Summary("Ask 8Ball a Question.")]
public async Task Ball([Remainder, Summary("The Question")] string echo) [Command("8ball", RunMode = RunMode.Async)]
[Summary("Ask 8Ball a Question.")]
public async Task Ball([Remainder] [Summary("Question")] string echo)
{
var replies = new List<string>
{ {
var replies = new List<string> {
"It is certain", "It is certain",
"It is decidedly so", "It is decidedly so",
"Without a doubt", "Without a doubt",
@ -35,7 +39,8 @@ namespace Geekbot.net.Modules
"My reply is no", "My reply is no",
"My sources say no", "My sources say no",
"Outlook not so good", "Outlook not so good",
"Very doubtful"}; "Very doubtful"
};
var answer = rnd.Next(replies.Count); var answer = rnd.Next(replies.Count);
await ReplyAsync(replies[answer]); await ReplyAsync(replies[answer]);

View file

@ -1,5 +1,4 @@
using System; using System.Threading.Tasks;
using System.Threading.Tasks;
using Discord.Commands; using Discord.Commands;
using Geekbot.net.Lib; using Geekbot.net.Lib;
@ -7,13 +6,15 @@ namespace Geekbot.net.Modules
{ {
public class Fortune : ModuleBase public class Fortune : ModuleBase
{ {
private readonly IFortunes fortunes; private readonly IFortunesProvider fortunes;
public Fortune(IFortunes fortunes)
public Fortune(IFortunesProvider fortunes)
{ {
this.fortunes = fortunes; this.fortunes = fortunes;
} }
[Command("fortune", RunMode = RunMode.Async), Summary("Get a random fortune")] [Command("fortune", RunMode = RunMode.Async)]
[Summary("Get a random fortune")]
public async Task GetAFortune() public async Task GetAFortune()
{ {
await ReplyAsync(fortunes.GetRandomFortune()); await ReplyAsync(fortunes.GetRandomFortune());

View file

@ -1,9 +1,9 @@
using System; using System;
using System.Threading.Tasks;
using Discord.Commands;
using Discord;
using Geekbot.net.Lib;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Discord;
using Discord.Commands;
using Geekbot.net.Lib;
using StackExchange.Redis; using StackExchange.Redis;
namespace Geekbot.net.Modules namespace Geekbot.net.Modules
@ -11,12 +11,14 @@ namespace Geekbot.net.Modules
public class GuildInfo : ModuleBase public class GuildInfo : ModuleBase
{ {
private readonly IDatabase redis; private readonly IDatabase redis;
public GuildInfo(IDatabase redis) public GuildInfo(IDatabase redis)
{ {
this.redis = redis; this.redis = redis;
} }
[Command("serverstats", RunMode = RunMode.Async), Summary("Show some info about the bot.")] [Command("serverstats", RunMode = RunMode.Async)]
[Summary("Show some info about the bot.")]
public async Task getInfo() public async Task getInfo()
{ {
var eb = new EmbedBuilder(); var eb = new EmbedBuilder();
@ -29,7 +31,7 @@ namespace Geekbot.net.Modules
var age = Math.Floor((DateTime.Now - created).TotalDays); var age = Math.Floor((DateTime.Now - created).TotalDays);
var messages = redis.StringGet($"{Context.Guild.Id}-messages"); var messages = redis.StringGet($"{Context.Guild.Id}-messages");
var level = LevelCalc.GetLevelAtExperience((int)messages); var level = LevelCalc.GetLevelAtExperience((int) messages);
eb.AddField("Server Age", $"{created.Day}/{created.Month}/{created.Year} ({age} days)"); eb.AddField("Server Age", $"{created.Day}/{created.Month}/{created.Year} ({age} days)");
eb.AddInlineField("Level", level) eb.AddInlineField("Level", level)
@ -40,7 +42,7 @@ namespace Geekbot.net.Modules
public static string FirstCharToUpper(string input) public static string FirstCharToUpper(string input)
{ {
if (String.IsNullOrEmpty(input)) if (string.IsNullOrEmpty(input))
throw new ArgumentException("ARGH!"); throw new ArgumentException("ARGH!");
return input.First().ToString().ToUpper() + input.Substring(1); return input.First().ToString().ToUpper() + input.Substring(1);
} }

View file

@ -1,27 +1,48 @@
using System.Threading.Tasks; using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Discord.Commands; using Discord.Commands;
using System.Reflection;
namespace Geekbot.net.Modules namespace Geekbot.net.Modules
{ {
public class Help : ModuleBase public class Help : ModuleBase
{ {
[Command("help", RunMode = RunMode.Async), Summary("List all Commands")] private readonly CommandService commands;
public Help(CommandService commands)
{
this.commands = commands;
}
[Command("help", RunMode = RunMode.Async)]
[Summary("List all Commands")]
public async Task GetHelp() public async Task GetHelp()
{ {
var commands = new CommandService(); var sb = new StringBuilder();
await commands.AddModulesAsync(Assembly.GetEntryAssembly()); sb.AppendLine("```");
var cmdList = commands.Commands; sb.AppendLine("**Geekbot Command list**");
var reply = "**Geekbot Command list**\r\n"; sb.AppendLine("");
foreach (var cmd in cmdList) sb.AppendLine(tp("Name", 15) + tp("Parameters", 19) + "Description");
foreach (var cmd in commands.Commands)
{ {
var param = string.Join(", !",cmd.Aliases); var param = string.Join(", !", cmd.Aliases);
if (!param.Contains("admin")) if (!param.Contains("admin"))
if (cmd.Parameters.Any())
sb.AppendLine(tp(param, 15) +
tp(string.Join(",", cmd.Parameters.Select(e => e.Summary)), 19) +
cmd.Summary);
else
sb.AppendLine(tp(param, 34) + cmd.Summary);
}
sb.AppendLine("```");
var dm = await Context.User.GetOrCreateDMChannelAsync();
await dm.SendMessageAsync(sb.ToString());
}
// Table Padding, short function name because of many usages
private string tp(string text, int shouldHave)
{ {
reply = reply + $"**{cmd.Name}** (!{param}) - {cmd.Summary}\r\n"; return text.PadRight(shouldHave);
}
}
await ReplyAsync(reply);
} }
} }
} }

View file

@ -8,12 +8,14 @@ namespace Geekbot.net.Modules
public class Info : ModuleBase public class Info : ModuleBase
{ {
private readonly IDatabase redis; private readonly IDatabase redis;
public Info(IDatabase redis) public Info(IDatabase redis)
{ {
this.redis = redis; this.redis = redis;
} }
[Command("info", RunMode = RunMode.Async), Summary("Get Information about the bot")] [Command("info", RunMode = RunMode.Async)]
[Summary("Get Information about the bot")]
public async Task BotInfo() public async Task BotInfo()
{ {
var eb = new EmbedBuilder(); var eb = new EmbedBuilder();

View file

@ -1,12 +1,12 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Discord;
using Discord.Commands; using Discord.Commands;
namespace Geekbot.net.Modules namespace Geekbot.net.Modules
{ {
public class Ping : ModuleBase public class Ping : ModuleBase
{ {
[Command("👀", RunMode = RunMode.Async), Summary("Look at the bot.")] [Command("👀", RunMode = RunMode.Async)]
[Summary("Look at the bot.")]
public async Task Eyes() public async Task Eyes()
{ {
await ReplyAsync("S... Stop looking at me... baka!"); await ReplyAsync("S... Stop looking at me... baka!");

View file

@ -9,14 +9,16 @@ namespace Geekbot.net.Modules
{ {
private readonly IDatabase redis; private readonly IDatabase redis;
private readonly Random rnd; private readonly Random rnd;
public Roll(IDatabase redis, Random RandomClient) public Roll(IDatabase redis, Random RandomClient)
{ {
this.redis = redis; this.redis = redis;
this.rnd = RandomClient; rnd = RandomClient;
} }
[Command("roll", RunMode = RunMode.Async), Summary("Roll a number between 1 and 100.")] [Command("roll", RunMode = RunMode.Async)]
public async Task RollCommand([Remainder, Summary("stuff...")] string stuff = "nothing") [Summary("Roll a number between 1 and 100.")]
public async Task RollCommand([Remainder] [Summary("stuff...")] string stuff = "nothing")
{ {
var number = rnd.Next(1, 100); var number = rnd.Next(1, 100);
var guess = 1000; var guess = 1000;
@ -28,7 +30,7 @@ namespace Geekbot.net.Modules
{ {
await ReplyAsync($"Congratulations {Context.User.Username}, your guess was correct!"); await ReplyAsync($"Congratulations {Context.User.Username}, your guess was correct!");
var key = $"{Context.Guild.Id}-{Context.User.Id}-correctRolls"; var key = $"{Context.Guild.Id}-{Context.User.Id}-correctRolls";
var messages = (int)redis.StringGet(key); var messages = (int) redis.StringGet(key);
redis.StringSet(key, (messages + 1).ToString()); redis.StringSet(key, (messages + 1).ToString());
} }
} }

View file

@ -1,13 +1,15 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Discord;
using Discord.Commands; using Discord.Commands;
namespace Geekbot.net.Modules namespace Geekbot.net.Modules
{ {
public class Say : ModuleBase public class Say : ModuleBase
{ {
[RequireUserPermission(Discord.GuildPermission.Administrator)] [RequireUserPermission(GuildPermission.Administrator)]
[Command("say", RunMode = RunMode.Async), Summary("Say Something.")] [Command("say", RunMode = RunMode.Async)]
public async Task Echo([Remainder, Summary("What?")] string echo) [Summary("Say Something.")]
public async Task Echo([Remainder] [Summary("What?")] string echo)
{ {
await Context.Message.DeleteAsync(); await Context.Message.DeleteAsync();
await ReplyAsync(echo); await ReplyAsync(echo);

View file

@ -8,28 +8,25 @@ namespace Geekbot.net.Modules
{ {
public class Ship : ModuleBase public class Ship : ModuleBase
{ {
private readonly IDatabase redis; private readonly IDatabase redis;
private readonly Random rnd; private readonly Random rnd;
public Ship(IDatabase redis, Random RandomClient) public Ship(IDatabase redis, Random RandomClient)
{ {
this.redis = redis; this.redis = redis;
this.rnd = RandomClient; rnd = RandomClient;
} }
[Command("Ship", RunMode = RunMode.Async), Summary("Ask the Shipping meter")] [Command("Ship", RunMode = RunMode.Async)]
public async Task Command([Summary("User 1")] IUser user1, [Summary("User 2")] IUser user2) [Summary("Ask the Shipping meter")]
public async Task Command([Summary("@User1")] IUser user1, [Summary("@User2")] IUser user2)
{ {
// Create a String // Create a String
var dbstring = ""; var dbstring = "";
if (user1.Id > user2.Id) if (user1.Id > user2.Id)
{
dbstring = $"{user1.Id}-{user2.Id}"; dbstring = $"{user1.Id}-{user2.Id}";
}
else else
{
dbstring = $"{user2.Id}-{user1.Id}"; dbstring = $"{user2.Id}-{user1.Id}";
}
dbstring = $"{Context.Guild.Id}-{dbstring}"; dbstring = $"{Context.Guild.Id}-{dbstring}";
Console.WriteLine(dbstring); Console.WriteLine(dbstring);
@ -54,21 +51,15 @@ namespace Geekbot.net.Modules
private string DeterminateSuccess(int rate) private string DeterminateSuccess(int rate)
{ {
if (rate < 20) if (rate < 20)
{
return "Not gonna happen"; return "Not gonna happen";
} if (rate >= 20 && rate < 40) if (rate >= 20 && rate < 40)
{
return "Not such a good idea"; return "Not such a good idea";
} if (rate >= 40 && rate < 60) if (rate >= 40 && rate < 60)
{
return "There might be a chance"; return "There might be a chance";
} if (rate >= 60 && rate < 80) if (rate >= 60 && rate < 80)
{
return "Almost a match, but could work"; return "Almost a match, but could work";
} if (rate >= 80) if (rate >= 80)
{
return "It's a match"; return "It's a match";
}
return "a"; return "a";
} }
@ -77,20 +68,17 @@ namespace Geekbot.net.Modules
var amount = Math.Floor(decimal.Floor(rate / 10)); var amount = Math.Floor(decimal.Floor(rate / 10));
Console.WriteLine(amount); Console.WriteLine(amount);
var blocks = ""; var blocks = "";
for(int i = 1; i <= 10; i++) for (var i = 1; i <= 10; i++)
{ if (i <= amount)
if(i <= amount)
{ {
blocks = blocks + ":white_medium_small_square:"; blocks = blocks + ":white_medium_small_square:";
if(i == amount) if (i == amount)
{
blocks = blocks + $" {rate}% "; blocks = blocks + $" {rate}% ";
} }
} else else
{ {
blocks = blocks + ":black_medium_small_square:"; blocks = blocks + ":black_medium_small_square:";
} }
}
return blocks; return blocks;
} }
} }

View file

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

View file

@ -10,13 +10,15 @@ namespace Geekbot.net.Modules
public class Youtube : ModuleBase public class Youtube : ModuleBase
{ {
private readonly IDatabase redis; private readonly IDatabase redis;
public Youtube(IDatabase redis) public Youtube(IDatabase redis)
{ {
this.redis = redis; this.redis = redis;
} }
[Command("yt", RunMode = RunMode.Async), Summary("Search for something on youtube.")] [Command("yt", RunMode = RunMode.Async)]
public async Task Yt([Remainder, Summary("A Song Title")] string searchQuery) [Summary("Search for something on youtube.")]
public async Task Yt([Remainder] [Summary("Title")] string searchQuery)
{ {
var key = redis.StringGet("youtubeKey"); var key = redis.StringGet("youtubeKey");
if (key.IsNullOrEmpty) if (key.IsNullOrEmpty)
@ -27,10 +29,10 @@ namespace Geekbot.net.Modules
try try
{ {
var youtubeService = new YouTubeService(new BaseClientService.Initializer() var youtubeService = new YouTubeService(new BaseClientService.Initializer
{ {
ApiKey = key.ToString(), ApiKey = key.ToString(),
ApplicationName = this.GetType().ToString() ApplicationName = GetType().ToString()
}); });
var searchListRequest = youtubeService.Search.List("snippet"); var searchListRequest = youtubeService.Search.List("snippet");
@ -49,7 +51,8 @@ namespace Geekbot.net.Modules
await ReplyAsync("Something went wrong... informing my senpai..."); await ReplyAsync("Something went wrong... informing my senpai...");
var botOwner = Context.Guild.GetUserAsync(ulong.Parse(redis.StringGet("botOwner"))).Result; var botOwner = Context.Guild.GetUserAsync(ulong.Parse(redis.StringGet("botOwner"))).Result;
var dm = await botOwner.GetOrCreateDMChannelAsync(); var dm = await botOwner.GetOrCreateDMChannelAsync();
await dm.SendMessageAsync($"Something went wrong while getting a video from youtube:\r\n```\r\n{e.Message}\r\n```"); await dm.SendMessageAsync(
$"Something went wrong while getting a video from youtube:\r\n```\r\n{e.Message}\r\n```");
} }
} }
} }

View file

@ -1,30 +1,25 @@
using System; using System;
using System.Reflection; using System.Reflection;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Discord; using Discord;
using Discord.Commands; using Discord.Commands;
using Discord.WebSocket; using Discord.WebSocket;
using Geekbot.net.Lib; using Geekbot.net.Lib;
using Geekbot.net.Modules; using Microsoft.Extensions.DependencyInjection;
using RestSharp;
using StackExchange.Redis; using StackExchange.Redis;
namespace Geekbot.net namespace Geekbot.net
{ {
class Program internal class Program
{ {
private CommandService commands;
private DiscordSocketClient client; private DiscordSocketClient client;
private CommandService commands;
private IDatabase redis; private IDatabase redis;
private RedisValue token;
private IServiceCollection services; private IServiceCollection services;
private IServiceProvider servicesProvider; private IServiceProvider servicesProvider;
private RedisValue token;
private static void Main(string[] args) private static void Main()
{ {
Console.WriteLine(@" ____ _____ _____ _ ______ ___ _____"); Console.WriteLine(@" ____ _____ _____ _ ______ ___ _____");
Console.WriteLine(@" / ___| ____| ____| |/ / __ ) / _ \\_ _|"); Console.WriteLine(@" / ___| ____| ____| |/ / __ ) / _ \\_ _|");
@ -68,11 +63,13 @@ namespace Geekbot.net
} }
services = new ServiceCollection(); services = new ServiceCollection();
var fortunes = new Fortunes(); var fortunes = new FortunesProvider();
var checkEmImages = new CheckEmImageProvider();
var RandomClient = new Random(); var RandomClient = new Random();
services.AddSingleton<IFortunes>(fortunes);
services.AddSingleton(RandomClient);
services.AddSingleton(redis); services.AddSingleton(redis);
services.AddSingleton(RandomClient);
services.AddSingleton<IFortunesProvider>(fortunes);
services.AddSingleton<ICheckEmImageProvider>(checkEmImages);
Console.WriteLine("* Connecting to Discord"); Console.WriteLine("* Connecting to Discord");
@ -99,6 +96,7 @@ namespace Geekbot.net
client.MessageReceived += HandleMessageReceived; client.MessageReceived += HandleMessageReceived;
client.UserJoined += HandleUserJoined; client.UserJoined += HandleUserJoined;
await commands.AddModulesAsync(Assembly.GetEntryAssembly()); await commands.AddModulesAsync(Assembly.GetEntryAssembly());
services.AddSingleton(commands);
servicesProvider = services.BuildServiceProvider(); servicesProvider = services.BuildServiceProvider();
Console.WriteLine("* Done and ready for use\n"); Console.WriteLine("* Done and ready for use\n");
@ -114,9 +112,7 @@ namespace Geekbot.net
public async Task<bool> isConnected() public async Task<bool> isConnected()
{ {
while (!client.ConnectionState.Equals(ConnectionState.Connected)) while (!client.ConnectionState.Equals(ConnectionState.Connected))
{
await Task.Delay(25); await Task.Delay(25);
}
return true; return true;
} }
@ -125,7 +121,7 @@ namespace Geekbot.net
var message = messageParam as SocketUserMessage; var message = messageParam as SocketUserMessage;
if (message == null) return; if (message == null) return;
if (message.Author.IsBot) return; if (message.Author.IsBot) return;
int argPos = 0; var argPos = 0;
var lowCaseMsg = message.ToString().ToLower(); var lowCaseMsg = message.ToString().ToLower();
if (lowCaseMsg.StartsWith("ping")) if (lowCaseMsg.StartsWith("ping"))
{ {
@ -137,7 +133,8 @@ namespace Geekbot.net
await message.Channel.SendMessageAsync("hui!!!"); await message.Channel.SendMessageAsync("hui!!!");
return; return;
} }
if (!(message.HasCharPrefix('!', ref argPos) || message.HasMentionPrefix(client.CurrentUser, ref argPos))) return; if (!(message.HasCharPrefix('!', ref argPos) ||
message.HasMentionPrefix(client.CurrentUser, ref argPos))) return;
var context = new CommandContext(client, message); var context = new CommandContext(client, message);
Task.Run(async () => await commands.ExecuteAsync(context, argPos, servicesProvider)); Task.Run(async () => await commands.ExecuteAsync(context, argPos, servicesProvider));
} }
@ -147,13 +144,14 @@ namespace Geekbot.net
var message = messsageParam; var message = messsageParam;
if (message == null) return; if (message == null) return;
var channel = (SocketGuildChannel)message.Channel;
Console.WriteLine(channel.Guild.Name + " - " + message.Channel + " - " + message.Author.Username + " - " + message.Content);
var statsRecorder = new StatsRecorder(message, redis); var statsRecorder = new StatsRecorder(message, redis);
Task.Run(async () => await statsRecorder.UpdateUserRecordAsync()); Task.Run(async () => await statsRecorder.UpdateUserRecordAsync());
Task.Run(async () => await statsRecorder.UpdateGuildRecordAsync()); Task.Run(async () => await statsRecorder.UpdateGuildRecordAsync());
if (message.Author.Id == client.CurrentUser.Id) return;
var channel = (SocketGuildChannel) message.Channel;
Console.WriteLine(channel.Guild.Name + " - " + message.Channel + " - " + message.Author.Username + " - " +
message.Content);
} }
public async Task HandleUserJoined(SocketGuildUser user) public async Task HandleUserJoined(SocketGuildUser user)

View file

@ -0,0 +1,122 @@
http://s19.postimg.org/pcq2kwzoj/4cb.png
http://s19.postimg.org/cvetk0f4z/5_Dim_Dy6p.jpg
http://s19.postimg.org/5hzfl1v37/1310151998600.jpg
http://s19.postimg.org/53y3lgazn/1324181141954.jpg
http://s19.postimg.org/724rjg3hf/1392512742365.png
http://s19.postimg.org/3rgejkdk3/1393501296733.png
http://s19.postimg.org/a6ffg8k9v/1401667341503.jpg
http://s19.postimg.org/qiph5yylf/1419231572452.jpg
http://s19.postimg.org/fqwi4m8ir/1427600681401.png
http://s19.postimg.org/4c00zzw6b/1447813628974.png
http://s19.postimg.org/uuio8puw3/b5_3q_ycaaavxtf.jpg
http://s19.postimg.org/bghu913fn/check_em_by_boyboy99100_d57xp3y.png
http://s19.postimg.org/s1pgooujn/l_Hkppjs.jpg
http://s19.postimg.org/m08itft0j/checkem.jpg
https://old.postimg.org/image/6vx33rb1b/
https://old.postimg.org/image/wxiaz1mov/
https://old.postimg.org/image/azqfizx27/
https://old.postimg.org/image/6iy2kbiu7/
https://old.postimg.org/image/k8slt45y7/
https://old.postimg.org/image/t7ruxmplr/
https://old.postimg.org/image/ssbzqvean/
https://old.postimg.org/image/kbchfy9lr/
https://old.postimg.org/image/dl0lk9btr/
https://old.postimg.org/image/e5k80oufz/
https://old.postimg.org/image/er005baqn/
https://old.postimg.org/image/bfk2uzcin/
https://old.postimg.org/image/556fp0jkv/
https://old.postimg.org/image/i0efbryu7/
https://old.postimg.org/image/943n7u87z/
https://old.postimg.org/image/xn5op5cm7/
https://old.postimg.org/image/3l5p4d0kf/
https://old.postimg.org/image/5boq5ui3j/
https://old.postimg.org/image/ru082bqcf/
https://old.postimg.org/image/ytea1oqan/
https://old.postimg.org/image/vu7dekgtb/
https://old.postimg.org/image/hl7qwi2an/
https://old.postimg.org/image/5aescfg9r/
https://old.postimg.org/image/9gzmrrfvj/
https://old.postimg.org/image/50bv6tr1b/
https://old.postimg.org/image/afkl7silb/
https://old.postimg.org/image/nrdsgzllr/
https://old.postimg.org/image/s32e5zsin/
https://old.postimg.org/image/5sej60v8f/
https://old.postimg.org/image/lgfqctau7/
https://old.postimg.org/image/tn7q4e0wv/
https://old.postimg.org/image/8612arz1b/
https://old.postimg.org/image/w5tf52mn3/
https://old.postimg.org/image/zdxwi48wv/
https://old.postimg.org/image/lphwghd0f/
https://old.postimg.org/image/uzu0k0nq7/
https://old.postimg.org/image/3vqzsxjbz/
https://old.postimg.org/image/5d7uqqyov/
https://old.postimg.org/image/dntnyku8v/
https://old.postimg.org/image/dsxf891jz/
https://old.postimg.org/image/3nyrioizj/
https://old.postimg.org/image/6zx2bzaqn/
https://old.postimg.org/image/wu6v1raqn/
https://old.postimg.org/image/hb9f4n2fz/
https://old.postimg.org/image/p7yhqm3a7/
https://old.postimg.org/image/oelvxzx9b/
https://old.postimg.org/image/vcq03xvdr/
https://old.postimg.org/image/b08t1yqlb/
https://old.postimg.org/image/6yrpwayan/
https://old.postimg.org/image/btleukwm7/
https://old.postimg.org/image/62ztuldzz/
https://old.postimg.org/image/w3iq9pxr3/
https://old.postimg.org/image/byp6493xb/
https://old.postimg.org/image/xp2lf9xcv/
https://old.postimg.org/image/j9p9u49pb/
https://old.postimg.org/image/hvxmytafz/
https://old.postimg.org/image/5eqzbnfa7/
https://old.postimg.org/image/do2uq290f/
https://old.postimg.org/image/54o261q1r/
https://old.postimg.org/image/94qm4jr4v/
https://old.postimg.org/image/lee88y0pr/
https://old.postimg.org/image/bncb58cv3/
https://old.postimg.org/image/5246j7me7/
https://old.postimg.org/image/4uby8ym1r/
https://old.postimg.org/image/qn996tj4v/
https://old.postimg.org/image/c1dn4twyn/
https://old.postimg.org/image/6rd9ra23j/
https://lehcark14.files.wordpress.com/2008/08/botan16.jpg
http://i.imgur.com/p9vALew.jpg
http://i.imgur.com/4a9l2Rm.png
http://i.imgur.com/RNtixMQ.jpg
https://pbs.twimg.com/media/Cro9aIGUEAAkXCP.jpg
http://s16.postimg.org/empvloimd/Check_em_Guts.png
https://s18.postimg.io/qgbhe7u09/1424491645996.gif
http://s19.postimg.org/hhemlt7xf/3eb.jpg
http://s19.postimg.org/cwsg6vo83/8aa.png
http://s19.postimg.org/rh9j1pj6r/28mohl4.png
http://s19.postimg.org/zba4n3qzn/86d.jpg
http://s19.postimg.org/cb3hart5v/2016_09_16_08_58_45.png
http://s19.postimg.org/m9ofx92lf/bb1.jpg
http://s19.postimg.org/maydqo4f7/e8b.jpg
http://s19.postimg.org/yqzoy5n4z/fbe.png
http://s19.postimg.org/xd822unvn/giphy.gif
http://s19.postimg.org/c4udlf9er/l_TU3eup.jpg
https://66.media.tumblr.com/cc893a0ee40d73d083da3df4bdaf45cc/tumblr_mx8psiFduG1t1g1k8o1_500.gif
http://i.imgur.com/swbXHSy.gif
http://img1.reactor.cc/pics/post/full/Anime-Touhou-Project-Yakumo-Yukari-%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F-1303807.jpeg
http://i.imgur.com/ftGLHE0.png
http://i.imgur.com/JELDhKQ.png
http://imgur.com/yBJound
http://i.imgur.com/f7gAVPJ.png
http://i.imgur.com/HxWyo2Z.jpg
http://i.imgur.com/8Eb9CxQ.png
http://i.imgur.com/kOECcjz.png
http://i.imgur.com/MJLu7oJ.jpg
http://i.imgur.com/itG3rPM.jpg
http://i.imgur.com/G83Go9t.jpg
http://i.imgur.com/jI2dBnU.jpg
http://i.imgur.com/FtALzg0.jpg
http://i.imgur.com/GwZpJEv.gif
http://i.imgur.com/TYGRD3B.gif
http://i.imgur.com/P6TxLS3.png
http://i.imgur.com/phTVTdn.jpg
http://i.imgur.com/thhR6UE.jpg
http://i.imgur.com/KbROufx.jpg
http://i.imgur.com/sQqWbcm.jpg
http://i.imgur.com/YYpis53.png
http://i.imgur.com/kwaRd54.gif