commit
b6c9786aea
@ -42,7 +42,7 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
var members = role.Members().Where(u => u.Status != UserStatus.Offline && u.Status != UserStatus.Unknown);
|
var members = role.Members().Where(u => u.Status != UserStatus.Offline && u.Status != UserStatus.Unknown);
|
||||||
var membersArray = members as IUser[] ?? members.ToArray();
|
var membersArray = members as IUser[] ?? members.ToArray();
|
||||||
var usr = membersArray[new NadekoRandom().Next(0, membersArray.Length)];
|
var usr = membersArray[new NadekoRandom().Next(0, membersArray.Length)];
|
||||||
await Context.Channel.SendConfirmAsync("🎟 Raffled user", $"**{usr.Username}#{usr.Discriminator}** ID: `{usr.Id}`").ConfigureAwait(false);
|
await Context.Channel.SendConfirmAsync("🎟 Raffled user", $"**{usr.Username}#{usr.Discriminator}**", footer: $"ID: {usr.Id}").ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
|
@ -69,6 +69,7 @@ namespace NadekoBot.Modules.Games
|
|||||||
private readonly ConcurrentDictionary<string, IGuildUser> submissions = new ConcurrentDictionary<string, IGuildUser>();
|
private readonly ConcurrentDictionary<string, IGuildUser> submissions = new ConcurrentDictionary<string, IGuildUser>();
|
||||||
public IReadOnlyDictionary<string, IGuildUser> Submissions => submissions;
|
public IReadOnlyDictionary<string, IGuildUser> Submissions => submissions;
|
||||||
|
|
||||||
|
private readonly ConcurrentHashSet<ulong> usersWhoSubmitted = new ConcurrentHashSet<ulong>();
|
||||||
private readonly ConcurrentHashSet<ulong> usersWhoVoted = new ConcurrentHashSet<ulong>();
|
private readonly ConcurrentHashSet<ulong> usersWhoVoted = new ConcurrentHashSet<ulong>();
|
||||||
|
|
||||||
private int spamCount = 0;
|
private int spamCount = 0;
|
||||||
@ -191,8 +192,7 @@ namespace NadekoBot.Modules.Games
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
//user didn't input something already
|
//user didn't input something already
|
||||||
IGuildUser throwaway;
|
if (!usersWhoSubmitted.Add(guildUser.Id))
|
||||||
if (submissions.TryGetValue(input, out throwaway))
|
|
||||||
return;
|
return;
|
||||||
var inputWords = input.Split(' '); //get all words
|
var inputWords = input.Split(' '); //get all words
|
||||||
|
|
||||||
|
@ -189,13 +189,13 @@ namespace NadekoBot.Modules.Games.Commands.Hangman
|
|||||||
catch (Exception ex) { _log.Warn(ex); }
|
catch (Exception ex) { _log.Warn(ex); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetHangman() => $@"\_\_\_\_\_\_\_\_\_
|
public string GetHangman() => $@". ┌─────┐
|
||||||
| |
|
.┃...............┋
|
||||||
| |
|
.┃...............┋
|
||||||
{(Errors > 0 ? "😲" : " ")} |
|
.┃{(Errors > 0 ? ".............😲" : "")}
|
||||||
{(Errors > 1 ? "/" : " ")} {(Errors > 2 ? "|" : " ")} {(Errors > 3 ? "\\" : " ")} |
|
.┃{(Errors > 1 ? "............./" : "")} {(Errors > 2 ? "|" : "")} {(Errors > 3 ? "\\" : "")}
|
||||||
{(Errors > 4 ? "/" : " ")} {(Errors > 5 ? "\\" : " ")} |
|
.┃{(Errors > 4 ? "............../" : "")} {(Errors > 5 ? "\\" : "")}
|
||||||
/-\";
|
/-\";
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
@ -61,7 +61,7 @@ namespace NadekoBot.Modules.Games
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await Context.Channel.SendConfirmAsync("Hangman game started", hm.ScrambledWord + "\n" + hm.GetHangman() + "\n" + hm.ScrambledWord);
|
await Context.Channel.SendConfirmAsync("Hangman game started", hm.ScrambledWord + "\n" + hm.GetHangman());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
using Discord;
|
using AngleSharp;
|
||||||
|
using AngleSharp.Dom.Html;
|
||||||
|
using AngleSharp.Extensions;
|
||||||
|
using Discord;
|
||||||
using Discord.Commands;
|
using Discord.Commands;
|
||||||
using NadekoBot.Attributes;
|
using NadekoBot.Attributes;
|
||||||
using NadekoBot.Extensions;
|
using NadekoBot.Extensions;
|
||||||
@ -8,6 +11,7 @@ using Newtonsoft.Json.Linq;
|
|||||||
using NLog;
|
using NLog;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@ -52,6 +56,116 @@ namespace NadekoBot.Modules.Searches
|
|||||||
}, null, TimeSpan.FromSeconds(0), TimeSpan.FromMinutes(29));
|
}, null, TimeSpan.FromSeconds(0), TimeSpan.FromMinutes(29));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
|
[Priority(1)]
|
||||||
|
public async Task Mal([Remainder] string name)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(name))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var fullQueryLink = "https://myanimelist.net/profile/" + name;
|
||||||
|
|
||||||
|
var config = Configuration.Default.WithDefaultLoader();
|
||||||
|
var document = await BrowsingContext.New(config).OpenAsync(fullQueryLink);
|
||||||
|
|
||||||
|
var imageElem = document.QuerySelector("body > div#myanimelist > div.wrapper > div#contentWrapper > div#content > div.content-container > div.container-left > div.user-profile > div.user-image > img");
|
||||||
|
var imageUrl = ((IHtmlImageElement)imageElem)?.Source ?? "http://icecream.me/uploads/870b03f36b59cc16ebfe314ef2dde781.png";
|
||||||
|
|
||||||
|
var stats = document.QuerySelectorAll("body > div#myanimelist > div.wrapper > div#contentWrapper > div#content > div.content-container > div.container-right > div#statistics > div.user-statistics-stats > div.stats > div.clearfix > ul.stats-status > li > span").Select(x => x.InnerHtml).ToList();
|
||||||
|
|
||||||
|
var favorites = document.QuerySelectorAll("div.user-favorites > div.di-tc");
|
||||||
|
|
||||||
|
var favAnime = "No favorite anime yet";
|
||||||
|
if (favorites[0].QuerySelector("p") == null)
|
||||||
|
favAnime = string.Join("\n", favorites[0].QuerySelectorAll("ul > li > div.di-tc.va-t > a")
|
||||||
|
.Shuffle()
|
||||||
|
.Take(3)
|
||||||
|
.Select(x =>
|
||||||
|
{
|
||||||
|
var elem = (IHtmlAnchorElement)x;
|
||||||
|
return $"[{elem.InnerHtml}]({elem.Href})";
|
||||||
|
}));
|
||||||
|
|
||||||
|
//var favManga = "No favorite manga yet.";
|
||||||
|
//if (favorites[1].QuerySelector("p") == null)
|
||||||
|
// favManga = string.Join("\n", favorites[1].QuerySelectorAll("ul > li > div.di-tc.va-t > a")
|
||||||
|
// .Take(3)
|
||||||
|
// .Select(x =>
|
||||||
|
// {
|
||||||
|
// var elem = (IHtmlAnchorElement)x;
|
||||||
|
// return $"[{elem.InnerHtml}]({elem.Href})";
|
||||||
|
// }));
|
||||||
|
|
||||||
|
var info = document.QuerySelectorAll("ul.user-status:nth-child(3) > li")
|
||||||
|
.Select(x => Tuple.Create(x.Children[0].InnerHtml, x.Children[1].InnerHtml))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var daysAndMean = document.QuerySelectorAll("div.anime:nth-child(1) > div:nth-child(2) > div")
|
||||||
|
.Select(x => x.TextContent.Split(':').Select(y => y.Trim()).ToArray())
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
var embed = new EmbedBuilder()
|
||||||
|
.WithOkColor()
|
||||||
|
.WithTitle($"{name}'s MAL profile")
|
||||||
|
.AddField(efb => efb.WithName("💚 Watching").WithValue(stats[0]).WithIsInline(true))
|
||||||
|
.AddField(efb => efb.WithName("💙 Completed").WithValue(stats[1]).WithIsInline(true));
|
||||||
|
if (info.Count < 3)
|
||||||
|
embed.AddField(efb => efb.WithName("💛 On-Hold").WithValue(stats[2]).WithIsInline(true));
|
||||||
|
embed
|
||||||
|
.AddField(efb => efb.WithName("💔 Dropped").WithValue(stats[3]).WithIsInline(true))
|
||||||
|
.AddField(efb => efb.WithName("⚪ Plan to watch").WithValue(stats[4]).WithIsInline(true))
|
||||||
|
.AddField(efb => efb.WithName("🕐 " + daysAndMean[0][0]).WithValue(daysAndMean[0][1]).WithIsInline(true))
|
||||||
|
.AddField(efb => efb.WithName("📊 " + daysAndMean[1][0]).WithValue(daysAndMean[1][1]).WithIsInline(true))
|
||||||
|
.AddField(efb => efb.WithName(MalInfoToEmoji(info[0].Item1) + " " + info[0].Item1).WithValue(info[0].Item2.TrimTo(20)).WithIsInline(true))
|
||||||
|
.AddField(efb => efb.WithName(MalInfoToEmoji(info[1].Item1) + " " + info[1].Item1).WithValue(info[1].Item2.TrimTo(20)).WithIsInline(true));
|
||||||
|
if (info.Count > 2)
|
||||||
|
embed.AddField(efb => efb.WithName(MalInfoToEmoji(info[2].Item1) + " " + info[2].Item1).WithValue(info[2].Item2.TrimTo(20)).WithIsInline(true));
|
||||||
|
//if(info.Count > 3)
|
||||||
|
// embed.AddField(efb => efb.WithName(MalInfoToEmoji(info[3].Item1) + " " + info[3].Item1).WithValue(info[3].Item2).WithIsInline(true))
|
||||||
|
embed
|
||||||
|
.WithDescription($@"
|
||||||
|
** https://myanimelist.net/animelist/{ name } **
|
||||||
|
|
||||||
|
**Top 3 Favorite Anime:**
|
||||||
|
{favAnime}"
|
||||||
|
|
||||||
|
//**[Manga List](https://myanimelist.net/mangalist/{name})**
|
||||||
|
//💚`Reading:` {stats[5]}
|
||||||
|
//💙`Completed:` {stats[6]}
|
||||||
|
//💔`Dropped:` {stats[8]}
|
||||||
|
//⚪`Plan to read:` {stats[9]}
|
||||||
|
|
||||||
|
//**Top 3 Favorite Manga:**
|
||||||
|
//{favManga}"
|
||||||
|
|
||||||
|
)
|
||||||
|
.WithUrl(fullQueryLink)
|
||||||
|
.WithImageUrl(imageUrl);
|
||||||
|
|
||||||
|
await Context.Channel.EmbedAsync(embed).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string MalInfoToEmoji(string info) {
|
||||||
|
info = info.Trim().ToLowerInvariant();
|
||||||
|
switch (info)
|
||||||
|
{
|
||||||
|
case "gender":
|
||||||
|
return "🚁";
|
||||||
|
case "location":
|
||||||
|
return "🗺";
|
||||||
|
case "last online":
|
||||||
|
return "👥";
|
||||||
|
case "birthday":
|
||||||
|
return "📆";
|
||||||
|
default:
|
||||||
|
return "❔";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
|
[Priority(0)]
|
||||||
|
public Task Mal(IUser usr) => Mal(usr.Username);
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
public async Task Anime([Remainder] string query)
|
public async Task Anime([Remainder] string query)
|
||||||
{
|
{
|
||||||
|
@ -45,7 +45,7 @@ namespace NadekoBot.Modules.Searches
|
|||||||
MemoryStream ms = new MemoryStream();
|
MemoryStream ms = new MemoryStream();
|
||||||
res.CopyTo(ms);
|
res.CopyTo(ms);
|
||||||
ms.Position = 0;
|
ms.Position = 0;
|
||||||
await Context.Channel.SendFileAsync(ms, $"{usr}.png", $"🎧 **Profile Link: **https://osu.ppy.sh/u/{Uri.EscapeDataString(usr)}\n`Image provided by https://lemmmy.pw/osusig`").ConfigureAwait(false);
|
await Context.Channel.SendFileAsync(ms, $"{usr}.png", $"🎧 **Profile Link:** <https://new.ppy.sh/u/{Uri.EscapeDataString(usr)}>\n`Image provided by https://lemmmy.pw/osusig`").ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -115,6 +115,8 @@ namespace NadekoBot.Modules.Searches
|
|||||||
if (string.IsNullOrWhiteSpace(terms))
|
if (string.IsNullOrWhiteSpace(terms))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
terms = WebUtility.UrlEncode(terms).Replace(' ', '+');
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var res = await NadekoBot.Google.GetImageAsync(terms).ConfigureAwait(false);
|
var res = await NadekoBot.Google.GetImageAsync(terms).ConfigureAwait(false);
|
||||||
@ -131,7 +133,6 @@ namespace NadekoBot.Modules.Searches
|
|||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
_log.Warn("Falling back to Imgur search.");
|
_log.Warn("Falling back to Imgur search.");
|
||||||
terms = WebUtility.UrlEncode(terms).Replace(' ', '+');
|
|
||||||
|
|
||||||
var fullQueryLink = $"http://imgur.com/search?q={ terms }";
|
var fullQueryLink = $"http://imgur.com/search?q={ terms }";
|
||||||
var config = Configuration.Default.WithDefaultLoader();
|
var config = Configuration.Default.WithDefaultLoader();
|
||||||
@ -167,6 +168,7 @@ namespace NadekoBot.Modules.Searches
|
|||||||
terms = terms?.Trim();
|
terms = terms?.Trim();
|
||||||
if (string.IsNullOrWhiteSpace(terms))
|
if (string.IsNullOrWhiteSpace(terms))
|
||||||
return;
|
return;
|
||||||
|
terms = WebUtility.UrlEncode(terms).Replace(' ', '+');
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var res = await NadekoBot.Google.GetImageAsync(terms, new NadekoRandom().Next(0, 50)).ConfigureAwait(false);
|
var res = await NadekoBot.Google.GetImageAsync(terms, new NadekoRandom().Next(0, 50)).ConfigureAwait(false);
|
||||||
|
@ -116,16 +116,19 @@ namespace NadekoBot.Modules.Utility
|
|||||||
var arr = (await (Context.Channel as IGuildChannel).Guild.GetUsersAsync())
|
var arr = (await (Context.Channel as IGuildChannel).Guild.GetUsersAsync())
|
||||||
.Where(u => u.Game?.Name?.ToUpperInvariant() == game)
|
.Where(u => u.Game?.Name?.ToUpperInvariant() == game)
|
||||||
.Select(u => u.Username)
|
.Select(u => u.Username)
|
||||||
|
.Shuffle()
|
||||||
|
.Take(60)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
if (!arr.Any())
|
if (!arr.Any())
|
||||||
await Context.Channel.SendErrorAsync("Nobody is playing that game.").ConfigureAwait(false);
|
await Context.Channel.SendErrorAsync("Nobody is playing that game.").ConfigureAwait(false);
|
||||||
else
|
else {
|
||||||
await Context.Channel.SendConfirmAsync("```css\n" + string.Join("\n", arr.GroupBy(item => (i++) / 2)
|
await Context.Channel.SendConfirmAsync("```css\n" + string.Join("\n", arr.GroupBy(item => (i++) / 2)
|
||||||
.Select(ig => string.Concat(ig.Select(el => $"• {el,-27}")))) + "\n```")
|
.Select(ig => string.Concat(ig.Select(el => $"• {el,-27}")))) + "\n```")
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
[RequireContext(ContextType.Guild)]
|
[RequireContext(ContextType.Guild)]
|
||||||
|
27
src/NadekoBot/Resources/CommandStrings.Designer.cs
generated
27
src/NadekoBot/Resources/CommandStrings.Designer.cs
generated
@ -4406,6 +4406,33 @@ namespace NadekoBot.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to mal.
|
||||||
|
/// </summary>
|
||||||
|
public static string mal_cmd {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("mal_cmd", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Shows basic info from myanimelist profile..
|
||||||
|
/// </summary>
|
||||||
|
public static string mal_desc {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("mal_desc", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to `{0}mal straysocks`.
|
||||||
|
/// </summary>
|
||||||
|
public static string mal_usage {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("mal_usage", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to manga mang mq.
|
/// Looks up a localized string similar to manga mang mq.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -3024,4 +3024,13 @@
|
|||||||
<data name="waifuinfo_usage" xml:space="preserve">
|
<data name="waifuinfo_usage" xml:space="preserve">
|
||||||
<value>`{0}waifuinfo @MyCrush` or `{0}waifuinfo`</value>
|
<value>`{0}waifuinfo @MyCrush` or `{0}waifuinfo`</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="mal_cmd" xml:space="preserve">
|
||||||
|
<value>mal</value>
|
||||||
|
</data>
|
||||||
|
<data name="mal_desc" xml:space="preserve">
|
||||||
|
<value>Shows basic info from myanimelist profile.</value>
|
||||||
|
</data>
|
||||||
|
<data name="mal_usage" xml:space="preserve">
|
||||||
|
<value>`{0}mal straysocks`</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
@ -199,7 +199,7 @@ namespace NadekoBot.Services.Impl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ImageResult> GetImageAsync(string query, int start = 0)
|
public async Task<ImageResult> GetImageAsync(string query, int start = 1)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(query))
|
if (string.IsNullOrWhiteSpace(query))
|
||||||
throw new ArgumentNullException(nameof(query));
|
throw new ArgumentNullException(nameof(query));
|
||||||
|
@ -237,7 +237,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Title":"Careers in Psychology: Opportunities in a Changing World",
|
"Title":"Careers in Psychology: Opportunities in a Changing World",
|
||||||
"Text":"This text addresses the growing need among students and faculty for information about the careers available in psychology at the bachelorâs and graduate level."
|
"Text":"This text addresses the growing need among students and faculty for information about the careers available in psychology at the bacheloras and graduate level."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Title":"Philosophy of Psychology",
|
"Title":"Philosophy of Psychology",
|
||||||
|
Loading…
Reference in New Issue
Block a user