commit
f70a60d0c8
@ -1 +1 @@
|
|||||||
Subproject commit b9f767337d2b7c07ed76eb83c3bc5030109d5238
|
Subproject commit f27cce0854abc42b92d29f9040625238a8991999
|
@ -28,15 +28,21 @@ If you entered your Droplets IP address correctly, it should show **login as:**
|
|||||||
|
|
||||||
![img1](https://cdn.discordapp.com/attachments/251504306010849280/251504416019054592/git.gif)
|
![img1](https://cdn.discordapp.com/attachments/251504306010849280/251504416019054592/git.gif)
|
||||||
|
|
||||||
|
Ubuntu:
|
||||||
|
|
||||||
`sudo apt-get install git -y`
|
`sudo apt-get install git -y`
|
||||||
|
|
||||||
|
CentOS:
|
||||||
|
|
||||||
|
`yum -y install git`
|
||||||
|
|
||||||
**NOTE:** If the command is not being initiated, hit **Enter**
|
**NOTE:** If the command is not being initiated, hit **Enter**
|
||||||
|
|
||||||
####Installing .NET Core SDK
|
####Installing .NET Core SDK
|
||||||
|
|
||||||
![img2](https://cdn.discordapp.com/attachments/251504306010849280/251504746987388938/dotnet.gif)
|
![img2](https://cdn.discordapp.com/attachments/251504306010849280/251504746987388938/dotnet.gif)
|
||||||
|
|
||||||
Go to [this link](https://www.microsoft.com/net/core#ubuntu) provided by microsoft for instructions on how to get the most up to date version of the dotnet core sdk!
|
Go to [this link](https://www.microsoft.com/net/core#ubuntu) (for Ubuntu) or to [this link](https://www.microsoft.com/net/core#linuxcentos) (for CentOS) provided by microsoft for instructions on how to get the most up to date version of the dotnet core sdk!
|
||||||
Make sure that you're on the correct page for your distribution of linux as the guides are different for the various distributions
|
Make sure that you're on the correct page for your distribution of linux as the guides are different for the various distributions
|
||||||
|
|
||||||
We'll go over the steps here for Ubuntu 16.04 anyway (these will **only** work on Ubuntu 16.04), accurate as of 25/11/2016
|
We'll go over the steps here for Ubuntu 16.04 anyway (these will **only** work on Ubuntu 16.04), accurate as of 25/11/2016
|
||||||
@ -53,14 +59,29 @@ sudo apt-get update && sudo apt-get install dotnet-dev-1.0.0-preview2.1-003177 -
|
|||||||
|
|
||||||
![img3](https://cdn.discordapp.com/attachments/251504306010849280/251505294654308353/libopus.gif)
|
![img3](https://cdn.discordapp.com/attachments/251504306010849280/251505294654308353/libopus.gif)
|
||||||
|
|
||||||
|
Ubuntu:
|
||||||
|
|
||||||
`sudo apt-get install libopus0 opus-tools libopus-dev libsodium-dev -y`
|
`sudo apt-get install libopus0 opus-tools libopus-dev libsodium-dev -y`
|
||||||
|
|
||||||
|
CentOS:
|
||||||
|
|
||||||
|
`yum -y install opus opus-devel`
|
||||||
|
|
||||||
####Installing FFMPEG
|
####Installing FFMPEG
|
||||||
|
|
||||||
![img4](https://cdn.discordapp.com/attachments/251504306010849280/251505443111829505/ffmpeg.gif)
|
![img4](https://cdn.discordapp.com/attachments/251504306010849280/251505443111829505/ffmpeg.gif)
|
||||||
|
|
||||||
|
Ubuntu:
|
||||||
|
|
||||||
`apt-get install ffmpeg -y`
|
`apt-get install ffmpeg -y`
|
||||||
|
|
||||||
|
Centos:
|
||||||
|
|
||||||
|
```
|
||||||
|
yum -y install http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm epel-release
|
||||||
|
yum -y install ffmpeg
|
||||||
|
```
|
||||||
|
|
||||||
**NOTE:** If you are running **UBUNTU 14.04**, you must run these first:
|
**NOTE:** If you are running **UBUNTU 14.04**, you must run these first:
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -84,8 +105,14 @@ sudo apt-get update && sudo apt-get install ffmpeg -y
|
|||||||
|
|
||||||
![img5](https://cdn.discordapp.com/attachments/251504306010849280/251505519758409728/tmux.gif)
|
![img5](https://cdn.discordapp.com/attachments/251504306010849280/251505519758409728/tmux.gif)
|
||||||
|
|
||||||
|
Ubuntu:
|
||||||
|
|
||||||
`sudo apt-get install tmux -y`
|
`sudo apt-get install tmux -y`
|
||||||
|
|
||||||
|
Centos:
|
||||||
|
|
||||||
|
`yum -y install tmux`
|
||||||
|
|
||||||
####Getting NadekoBot
|
####Getting NadekoBot
|
||||||
|
|
||||||
Use the following command to get and run `linuxAIO.sh`:
|
Use the following command to get and run `linuxAIO.sh`:
|
||||||
|
@ -12,37 +12,37 @@ namespace NadekoBot.Migrations
|
|||||||
name: "BetflipMultiplier",
|
name: "BetflipMultiplier",
|
||||||
table: "BotConfig",
|
table: "BotConfig",
|
||||||
nullable: false,
|
nullable: false,
|
||||||
defaultValue: 0f);
|
defaultValue: 1.8f);
|
||||||
|
|
||||||
migrationBuilder.AddColumn<float>(
|
migrationBuilder.AddColumn<float>(
|
||||||
name: "Betroll100Multiplier",
|
name: "Betroll100Multiplier",
|
||||||
table: "BotConfig",
|
table: "BotConfig",
|
||||||
nullable: false,
|
nullable: false,
|
||||||
defaultValue: 0f);
|
defaultValue: 10f);
|
||||||
|
|
||||||
migrationBuilder.AddColumn<float>(
|
migrationBuilder.AddColumn<float>(
|
||||||
name: "Betroll67Multiplier",
|
name: "Betroll67Multiplier",
|
||||||
table: "BotConfig",
|
table: "BotConfig",
|
||||||
nullable: false,
|
nullable: false,
|
||||||
defaultValue: 0f);
|
defaultValue: 2f);
|
||||||
|
|
||||||
migrationBuilder.AddColumn<float>(
|
migrationBuilder.AddColumn<float>(
|
||||||
name: "Betroll91Multiplier",
|
name: "Betroll91Multiplier",
|
||||||
table: "BotConfig",
|
table: "BotConfig",
|
||||||
nullable: false,
|
nullable: false,
|
||||||
defaultValue: 0f);
|
defaultValue: 3f);
|
||||||
|
|
||||||
migrationBuilder.AddColumn<int>(
|
migrationBuilder.AddColumn<int>(
|
||||||
name: "CurrencyDropAmount",
|
name: "CurrencyDropAmount",
|
||||||
table: "BotConfig",
|
table: "BotConfig",
|
||||||
nullable: false,
|
nullable: false,
|
||||||
defaultValue: 0);
|
defaultValue: 1);
|
||||||
|
|
||||||
migrationBuilder.AddColumn<int>(
|
migrationBuilder.AddColumn<int>(
|
||||||
name: "MinimumBetAmount",
|
name: "MinimumBetAmount",
|
||||||
table: "BotConfig",
|
table: "BotConfig",
|
||||||
nullable: false,
|
nullable: false,
|
||||||
defaultValue: 0);
|
defaultValue: 3);
|
||||||
|
|
||||||
migrationBuilder.AddColumn<int>(
|
migrationBuilder.AddColumn<int>(
|
||||||
name: "TriviaCurrencyReward",
|
name: "TriviaCurrencyReward",
|
||||||
|
@ -4,8 +4,6 @@ using Microsoft.EntityFrameworkCore.Infrastructure;
|
|||||||
using Microsoft.EntityFrameworkCore.Metadata;
|
using Microsoft.EntityFrameworkCore.Metadata;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
using NadekoBot.Services.Database;
|
using NadekoBot.Services.Database;
|
||||||
using NadekoBot.Services.Database.Models;
|
|
||||||
using NadekoBot.Modules.Music.Classes;
|
|
||||||
|
|
||||||
namespace NadekoBot.Migrations
|
namespace NadekoBot.Migrations
|
||||||
{
|
{
|
||||||
|
@ -25,7 +25,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
{
|
{
|
||||||
private const string clockEmojiUrl = "https://cdn.discordapp.com/attachments/155726317222887425/258309524966866945/clock.png";
|
private const string clockEmojiUrl = "https://cdn.discordapp.com/attachments/155726317222887425/258309524966866945/clock.png";
|
||||||
|
|
||||||
private static ShardedDiscordClient _client { get; }
|
private static DiscordShardedClient _client { get; }
|
||||||
private static Logger _log { get; }
|
private static Logger _log { get; }
|
||||||
|
|
||||||
private static string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】";
|
private static string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】";
|
||||||
@ -81,7 +81,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
_client.UserPresenceUpdated += _client_UserPresenceUpdated;
|
_client.UserPresenceUpdated += _client_UserPresenceUpdated;
|
||||||
_client.UserVoiceStateUpdated += _client_UserVoiceStateUpdated;
|
_client.UserVoiceStateUpdated += _client_UserVoiceStateUpdated;
|
||||||
_client.UserVoiceStateUpdated += _client_UserVoiceStateUpdated_TTS;
|
_client.UserVoiceStateUpdated += _client_UserVoiceStateUpdated_TTS;
|
||||||
_client.GuildUserUpdated += _client_GuildUserUpdated;
|
_client.GuildMemberUpdated += _client_GuildUserUpdated;
|
||||||
#if !GLOBAL_NADEKO
|
#if !GLOBAL_NADEKO
|
||||||
_client.UserUpdated += _client_UserUpdated;
|
_client.UserUpdated += _client_UserUpdated;
|
||||||
#endif
|
#endif
|
||||||
@ -94,7 +94,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
MuteCommands.UserUnmuted += MuteCommands_UserUnmuted;
|
MuteCommands.UserUnmuted += MuteCommands_UserUnmuted;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_UserUpdated(SocketUser before, SocketUser uAfter)
|
private static async Task _client_UserUpdated(SocketUser before, SocketUser uAfter)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -162,7 +162,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
{ }
|
{ }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_UserVoiceStateUpdated_TTS(SocketUser iusr, SocketVoiceState before, SocketVoiceState after)
|
private static async Task _client_UserVoiceStateUpdated_TTS(SocketUser iusr, SocketVoiceState before, SocketVoiceState after)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -317,7 +317,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_GuildUserUpdated(SocketGuildUser before, SocketGuildUser after)
|
private static async Task _client_GuildUserUpdated(SocketGuildUser before, SocketGuildUser after)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -360,7 +360,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_ChannelUpdated(IChannel cbefore, IChannel cafter)
|
private static async Task _client_ChannelUpdated(IChannel cbefore, IChannel cafter)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -403,7 +403,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_ChannelDestroyed(IChannel ich)
|
private static async Task _client_ChannelDestroyed(IChannel ich)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -430,7 +430,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_ChannelCreated(IChannel ich)
|
private static async Task _client_ChannelCreated(IChannel ich)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -456,7 +456,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
catch (Exception ex) { _log.Warn(ex); }
|
catch (Exception ex) { _log.Warn(ex); }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_UserVoiceStateUpdated(SocketUser iusr, SocketVoiceState before, SocketVoiceState after)
|
private static async Task _client_UserVoiceStateUpdated(SocketUser iusr, SocketVoiceState before, SocketVoiceState after)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -498,7 +498,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_UserPresenceUpdated(Optional<SocketGuild> optGuild, SocketUser usr, SocketPresence before, SocketPresence after)
|
private static async Task _client_UserPresenceUpdated(Optional<SocketGuild> optGuild, SocketUser usr, SocketPresence before, SocketPresence after)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -532,7 +532,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_UserLeft(IGuildUser usr)
|
private static async Task _client_UserLeft(IGuildUser usr)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -556,7 +556,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_UserJoined(IGuildUser usr)
|
private static async Task _client_UserJoined(IGuildUser usr)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -580,7 +580,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
catch (Exception ex) { _log.Warn(ex); }
|
catch (Exception ex) { _log.Warn(ex); }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_UserUnbanned(IUser usr, IGuild guild)
|
private static async Task _client_UserUnbanned(IUser usr, IGuild guild)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -604,7 +604,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
catch (Exception ex) { _log.Warn(ex); }
|
catch (Exception ex) { _log.Warn(ex); }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_UserBanned(IUser usr, IGuild guild)
|
private static async Task _client_UserBanned(IUser usr, IGuild guild)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -627,7 +627,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
catch (Exception ex) { _log.Warn(ex); }
|
catch (Exception ex) { _log.Warn(ex); }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_MessageDeleted(ulong arg1, Optional<SocketMessage> imsg)
|
private static async Task _client_MessageDeleted(ulong arg1, Optional<SocketMessage> imsg)
|
||||||
{
|
{
|
||||||
|
|
||||||
try
|
try
|
||||||
@ -664,7 +664,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void _client_MessageUpdated(Optional<SocketMessage> optmsg, SocketMessage imsg2)
|
private static async Task _client_MessageUpdated(Optional<SocketMessage> optmsg, SocketMessage imsg2)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -89,10 +89,12 @@ namespace NadekoBot.Modules.Administration
|
|||||||
db.Open();
|
db.Open();
|
||||||
|
|
||||||
var com = db.CreateCommand();
|
var com = db.CreateCommand();
|
||||||
|
var i = 0;
|
||||||
|
try
|
||||||
|
{
|
||||||
com.CommandText = "SELECT * FROM Announcement";
|
com.CommandText = "SELECT * FROM Announcement";
|
||||||
|
|
||||||
var reader = com.ExecuteReader();
|
var reader = com.ExecuteReader();
|
||||||
var i = 0;
|
|
||||||
while (reader.Read())
|
while (reader.Read())
|
||||||
{
|
{
|
||||||
var gid = (ulong)(long)reader["ServerId"];
|
var gid = (ulong)(long)reader["ServerId"];
|
||||||
@ -122,11 +124,16 @@ namespace NadekoBot.Modules.Administration
|
|||||||
gc.AutoDeleteGreetMessagesTimer = gc.AutoDeleteByeMessagesTimer = grdel ? 30 : 0;
|
gc.AutoDeleteGreetMessagesTimer = gc.AutoDeleteByeMessagesTimer = grdel ? 30 : 0;
|
||||||
_log.Info(++i);
|
_log.Info(++i);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
_log.Warn("Greet/bye messages won't be migrated");
|
||||||
|
}
|
||||||
var com2 = db.CreateCommand();
|
var com2 = db.CreateCommand();
|
||||||
com.CommandText = "SELECT * FROM CurrencyState GROUP BY UserId";
|
com.CommandText = "SELECT * FROM CurrencyState GROUP BY UserId";
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
try
|
||||||
|
{
|
||||||
var reader2 = com.ExecuteReader();
|
var reader2 = com.ExecuteReader();
|
||||||
while (reader2.Read())
|
while (reader2.Read())
|
||||||
{
|
{
|
||||||
@ -138,6 +145,11 @@ namespace NadekoBot.Modules.Administration
|
|||||||
};
|
};
|
||||||
uow.Currency.Add(curr);
|
uow.Currency.Add(curr);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
_log.Warn("Currency won't be migrated");
|
||||||
|
}
|
||||||
db.Close();
|
db.Close();
|
||||||
try { File.Move("data/nadekobot.sqlite", "data/DELETE_ME_nadekobot.sqlite"); } catch { }
|
try { File.Move("data/nadekobot.sqlite", "data/DELETE_ME_nadekobot.sqlite"); } catch { }
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,6 @@ namespace NadekoBot.Modules.Administration
|
|||||||
static MuteCommands()
|
static MuteCommands()
|
||||||
{
|
{
|
||||||
var _log = LogManager.GetCurrentClassLogger();
|
var _log = LogManager.GetCurrentClassLogger();
|
||||||
var sw = Stopwatch.StartNew();
|
|
||||||
|
|
||||||
var configs = NadekoBot.AllGuildConfigs;
|
var configs = NadekoBot.AllGuildConfigs;
|
||||||
GuildMuteRoles = new ConcurrentDictionary<ulong, string>(configs
|
GuildMuteRoles = new ConcurrentDictionary<ulong, string>(configs
|
||||||
@ -50,12 +49,9 @@ namespace NadekoBot.Modules.Administration
|
|||||||
));
|
));
|
||||||
|
|
||||||
NadekoBot.Client.UserJoined += Client_UserJoined;
|
NadekoBot.Client.UserJoined += Client_UserJoined;
|
||||||
|
|
||||||
sw.Stop();
|
|
||||||
_log.Debug($"Loaded in {sw.Elapsed.TotalSeconds:F2}s");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void Client_UserJoined(IGuildUser usr)
|
private static async Task Client_UserJoined(IGuildUser usr)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -50,7 +50,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
if (string.IsNullOrWhiteSpace(status))
|
if (string.IsNullOrWhiteSpace(status))
|
||||||
continue;
|
continue;
|
||||||
PlayingPlaceholders.ForEach(e => status = status.Replace(e.Key, e.Value()));
|
PlayingPlaceholders.ForEach(e => status = status.Replace(e.Key, e.Value()));
|
||||||
await NadekoBot.Client.SetGame(status);
|
await NadekoBot.Client.SetGameAsync(status).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -67,7 +67,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
|
|
||||||
public static Dictionary<string, Func<string>> PlayingPlaceholders { get; } =
|
public static Dictionary<string, Func<string>> PlayingPlaceholders { get; } =
|
||||||
new Dictionary<string, Func<string>> {
|
new Dictionary<string, Func<string>> {
|
||||||
{"%servers%", () => NadekoBot.Client.GetGuildsCount().ToString()},
|
{"%servers%", () => NadekoBot.Client.GetGuildCount().ToString()},
|
||||||
{"%users%", () => NadekoBot.Client.GetGuilds().Sum(s => s.Users.Count).ToString()},
|
{"%users%", () => NadekoBot.Client.GetGuilds().Sum(s => s.Users.Count).ToString()},
|
||||||
{"%playing%", () => {
|
{"%playing%", () => {
|
||||||
var cnt = Music.Music.MusicPlayers.Count(kvp => kvp.Value.CurrentSong != null);
|
var cnt = Music.Music.MusicPlayers.Count(kvp => kvp.Value.CurrentSong != null);
|
||||||
|
@ -28,7 +28,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
await Context.Channel.SendErrorAsync("⚠️ Cannot find that server").ConfigureAwait(false);
|
await Context.Channel.SendErrorAsync("⚠️ Cannot find that server").ConfigureAwait(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (server.OwnerId != NadekoBot.Client.CurrentUser().Id)
|
if (server.OwnerId != NadekoBot.Client.CurrentUser.Id)
|
||||||
{
|
{
|
||||||
await server.LeaveAsync().ConfigureAwait(false);
|
await server.LeaveAsync().ConfigureAwait(false);
|
||||||
await Context.Channel.SendConfirmAsync("✅ Left server " + server.Name).ConfigureAwait(false);
|
await Context.Channel.SendConfirmAsync("✅ Left server " + server.Name).ConfigureAwait(false);
|
||||||
@ -57,7 +57,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
if (string.IsNullOrWhiteSpace(newName))
|
if (string.IsNullOrWhiteSpace(newName))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
await NadekoBot.Client.CurrentUser().ModifyAsync(u => u.Username = newName).ConfigureAwait(false);
|
await NadekoBot.Client.CurrentUser.ModifyAsync(u => u.Username = newName).ConfigureAwait(false);
|
||||||
|
|
||||||
await Context.Channel.SendConfirmAsync($"Bot name changed to **{newName}**").ConfigureAwait(false);
|
await Context.Channel.SendConfirmAsync($"Bot name changed to **{newName}**").ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
@ -66,7 +66,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
[OwnerOnly]
|
[OwnerOnly]
|
||||||
public async Task SetStatus([Remainder] SettableUserStatus status)
|
public async Task SetStatus([Remainder] SettableUserStatus status)
|
||||||
{
|
{
|
||||||
await NadekoBot.Client.SetStatus(status);
|
await NadekoBot.Client.SetStatusAsync(SettableUserStatusToUserStatus(status)).ConfigureAwait(false);
|
||||||
|
|
||||||
await Context.Channel.SendConfirmAsync($"Bot status changed to **{status}**").ConfigureAwait(false);
|
await Context.Channel.SendConfirmAsync($"Bot status changed to **{status}**").ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
@ -86,7 +86,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
await sr.CopyToAsync(imgStream);
|
await sr.CopyToAsync(imgStream);
|
||||||
imgStream.Position = 0;
|
imgStream.Position = 0;
|
||||||
|
|
||||||
await NadekoBot.Client.CurrentUser().ModifyAsync(u => u.Avatar = new Image(imgStream)).ConfigureAwait(false);
|
await NadekoBot.Client.CurrentUser.ModifyAsync(u => u.Avatar = new Image(imgStream)).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,7 +97,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
[OwnerOnly]
|
[OwnerOnly]
|
||||||
public async Task SetGame([Remainder] string game = null)
|
public async Task SetGame([Remainder] string game = null)
|
||||||
{
|
{
|
||||||
await NadekoBot.Client.SetGame(game).ConfigureAwait(false);
|
await NadekoBot.Client.SetGameAsync(game).ConfigureAwait(false);
|
||||||
|
|
||||||
await Context.Channel.SendConfirmAsync("👾 **New game set.**").ConfigureAwait(false);
|
await Context.Channel.SendConfirmAsync("👾 **New game set.**").ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
@ -108,7 +108,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
{
|
{
|
||||||
name = name ?? "";
|
name = name ?? "";
|
||||||
|
|
||||||
await NadekoBot.Client.SetStream(name, url).ConfigureAwait(false);
|
await NadekoBot.Client.SetGameAsync(name, url, StreamType.Twitch).ConfigureAwait(false);
|
||||||
|
|
||||||
await Context.Channel.SendConfirmAsync("ℹ️ **New stream set.**").ConfigureAwait(false);
|
await Context.Channel.SendConfirmAsync("ℹ️ **New stream set.**").ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
@ -169,6 +169,23 @@ namespace NadekoBot.Modules.Administration
|
|||||||
|
|
||||||
await Context.Channel.SendConfirmAsync("🆗").ConfigureAwait(false);
|
await Context.Channel.SendConfirmAsync("🆗").ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static UserStatus SettableUserStatusToUserStatus(SettableUserStatus sus)
|
||||||
|
{
|
||||||
|
switch (sus)
|
||||||
|
{
|
||||||
|
case SettableUserStatus.Online:
|
||||||
|
return UserStatus.Online;
|
||||||
|
case SettableUserStatus.Invisible:
|
||||||
|
return UserStatus.Invisible;
|
||||||
|
case SettableUserStatus.Idle:
|
||||||
|
return UserStatus.AFK;
|
||||||
|
case SettableUserStatus.Dnd:
|
||||||
|
return UserStatus.DoNotDisturb;
|
||||||
|
}
|
||||||
|
|
||||||
|
return UserStatus.Online;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
_log = LogManager.GetCurrentClassLogger();
|
_log = LogManager.GetCurrentClassLogger();
|
||||||
}
|
}
|
||||||
//todo optimize ASAP
|
//todo optimize ASAP
|
||||||
private static async void UserLeft(IGuildUser user)
|
private static async Task UserLeft(IGuildUser user)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -58,7 +58,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void UserJoined(IGuildUser user)
|
private static async Task UserJoined(IGuildUser user)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -36,7 +36,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
_log.Debug($"Loaded in {sw.Elapsed.TotalSeconds:F2}s");
|
_log.Debug($"Loaded in {sw.Elapsed.TotalSeconds:F2}s");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void UserUpdatedEventHandler(SocketUser iuser, SocketVoiceState before, SocketVoiceState after)
|
private static async Task UserUpdatedEventHandler(SocketUser iuser, SocketVoiceState before, SocketVoiceState after)
|
||||||
{
|
{
|
||||||
var user = (iuser as SocketGuildUser);
|
var user = (iuser as SocketGuildUser);
|
||||||
var guild = user?.Guild;
|
var guild = user?.Guild;
|
||||||
|
@ -18,7 +18,7 @@ namespace NadekoBot.Modules.CustomReactions
|
|||||||
|
|
||||||
public static Dictionary<string, Func<IUserMessage, string>> placeholders = new Dictionary<string, Func<IUserMessage, string>>()
|
public static Dictionary<string, Func<IUserMessage, string>> placeholders = new Dictionary<string, Func<IUserMessage, string>>()
|
||||||
{
|
{
|
||||||
{"%mention%", (ctx) => { return $"<@{NadekoBot.Client.CurrentUser().Id}>"; } },
|
{"%mention%", (ctx) => { return $"<@{NadekoBot.Client.CurrentUser.Id}>"; } },
|
||||||
{"%user%", (ctx) => { return ctx.Author.Mention; } },
|
{"%user%", (ctx) => { return ctx.Author.Mention; } },
|
||||||
{"%rnduser%", (ctx) => {
|
{"%rnduser%", (ctx) => {
|
||||||
var ch = ctx.Channel as ITextChannel;
|
var ch = ctx.Channel as ITextChannel;
|
||||||
|
@ -207,15 +207,15 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Client_MessageReceived(SocketMessage imsg)
|
private Task Client_MessageReceived(SocketMessage imsg)
|
||||||
{
|
{
|
||||||
var msg = imsg as SocketUserMessage;
|
var msg = imsg as SocketUserMessage;
|
||||||
if (msg == null)
|
if (msg == null)
|
||||||
return;
|
return Task.CompletedTask;
|
||||||
if (msg.IsAuthor() || !(imsg.Channel is ITextChannel) || imsg.Channel != raceChannel)
|
if (msg.IsAuthor() || !(imsg.Channel is ITextChannel) || imsg.Channel != raceChannel)
|
||||||
return;
|
return Task.CompletedTask;
|
||||||
messagesSinceGameStarted++;
|
messagesSinceGameStarted++;
|
||||||
return;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task CheckForFullGameAsync(CancellationToken cancelToken)
|
private async Task CheckForFullGameAsync(CancellationToken cancelToken)
|
||||||
|
84
src/NadekoBot/Modules/Gambling/Commands/CurrencyEvents.cs
Normal file
84
src/NadekoBot/Modules/Gambling/Commands/CurrencyEvents.cs
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
using Discord;
|
||||||
|
using Discord.Commands;
|
||||||
|
using NadekoBot.Attributes;
|
||||||
|
using NadekoBot.Extensions;
|
||||||
|
using NadekoBot.Services;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NadekoBot.Modules.Gambling
|
||||||
|
{
|
||||||
|
public partial class Gambling
|
||||||
|
{
|
||||||
|
[Group]
|
||||||
|
public class CurrencyEvents : ModuleBase
|
||||||
|
{
|
||||||
|
public enum CurrencyEvent
|
||||||
|
{
|
||||||
|
FlowerReaction
|
||||||
|
}
|
||||||
|
//flower reaction event
|
||||||
|
public static readonly ConcurrentHashSet<ulong> _flowerReactionAwardedUsers = new ConcurrentHashSet<ulong>();
|
||||||
|
|
||||||
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
|
[RequireContext(ContextType.Guild)]
|
||||||
|
[OwnerOnly]
|
||||||
|
public async Task StartEvent(CurrencyEvent e)
|
||||||
|
{
|
||||||
|
var channel = (ITextChannel)Context.Channel;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (e)
|
||||||
|
{
|
||||||
|
case CurrencyEvent.FlowerReaction:
|
||||||
|
await FlowerReactionEvent(Context).ConfigureAwait(false);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static async Task FlowerReactionEvent(CommandContext Context)
|
||||||
|
{
|
||||||
|
var msg = await Context.Channel.SendConfirmAsync("Flower reaction event started!",
|
||||||
|
"Add 🌸 reaction to this message to get 100" + NadekoBot.BotConfig.CurrencySign,
|
||||||
|
footer: "This event is active for 24 hours.")
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
try { await msg.AddReactionAsync("🌸").ConfigureAwait(false); }
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
try { await msg.AddReactionAsync("🌸").ConfigureAwait(false); }
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
try { await msg.DeleteAsync().ConfigureAwait(false); }
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
using (msg.OnReaction(async (r) =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (r.Emoji.Name == "🌸" && r.User.IsSpecified && _flowerReactionAwardedUsers.Add(r.User.Value.Id))
|
||||||
|
{
|
||||||
|
try { await CurrencyHandler.AddCurrencyAsync(r.User.Value, "Flower Reaction Event", 100, false).ConfigureAwait(false); } catch { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}))
|
||||||
|
{
|
||||||
|
await Task.Delay(TimeSpan.FromHours(24)).ConfigureAwait(false);
|
||||||
|
try { await msg.DeleteAsync().ConfigureAwait(false); } catch { }
|
||||||
|
_flowerReactionAwardedUsers.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -168,7 +168,7 @@ namespace NadekoBot.Modules.Games
|
|||||||
await End().ConfigureAwait(false);
|
await End().ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void PotentialAcro(SocketMessage arg)
|
private async Task PotentialAcro(SocketMessage arg)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -58,7 +58,7 @@ namespace NadekoBot.Modules.Games
|
|||||||
if (!CleverbotGuilds.TryGetValue(channel.Guild.Id, out cleverbot))
|
if (!CleverbotGuilds.TryGetValue(channel.Guild.Id, out cleverbot))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
var nadekoId = NadekoBot.Client.CurrentUser().Id;
|
var nadekoId = NadekoBot.Client.CurrentUser.Id;
|
||||||
var normalMention = $"<@{nadekoId}> ";
|
var normalMention = $"<@{nadekoId}> ";
|
||||||
var nickMention = $"<@!{nadekoId}> ";
|
var nickMention = $"<@!{nadekoId}> ";
|
||||||
string message;
|
string message;
|
||||||
|
@ -114,7 +114,7 @@ namespace NadekoBot.Modules.Games.Commands.Hangman
|
|||||||
await GameChannel.EmbedAsync(embed.WithOkColor()).ConfigureAwait(false);
|
await GameChannel.EmbedAsync(embed.WithOkColor()).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void PotentialGuess(SocketMessage msg)
|
private async Task PotentialGuess(SocketMessage msg)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -51,7 +51,7 @@ namespace NadekoBot.Modules.Games
|
|||||||
.SelectMany(c => c.GenerateCurrencyChannelIds.Select(obj => obj.ChannelId)));
|
.SelectMany(c => c.GenerateCurrencyChannelIds.Select(obj => obj.ChannelId)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void PotentialFlowerGeneration(SocketMessage imsg)
|
private static async Task PotentialFlowerGeneration(SocketMessage imsg)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -153,7 +153,7 @@ namespace NadekoBot.Modules.Games
|
|||||||
await originalMessage.Channel.EmbedAsync(GetStats("POLL CLOSED")).ConfigureAwait(false);
|
await originalMessage.Channel.EmbedAsync(GetStats("POLL CLOSED")).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void Vote(SocketMessage imsg)
|
private async Task Vote(SocketMessage imsg)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -106,7 +106,7 @@ namespace NadekoBot.Modules.Games
|
|||||||
NadekoBot.Client.MessageReceived += AnswerReceived;
|
NadekoBot.Client.MessageReceived += AnswerReceived;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void AnswerReceived(SocketMessage imsg)
|
private async Task AnswerReceived(SocketMessage imsg)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -56,7 +56,9 @@ namespace NadekoBot.Modules.Games.Trivia
|
|||||||
|
|
||||||
// load question
|
// load question
|
||||||
CurrentQuestion = TriviaQuestionPool.Instance.GetRandomQuestion(oldQuestions);
|
CurrentQuestion = TriviaQuestionPool.Instance.GetRandomQuestion(oldQuestions);
|
||||||
if (CurrentQuestion == null)
|
if (CurrentQuestion == null ||
|
||||||
|
string.IsNullOrWhiteSpace(CurrentQuestion.Answer) ||
|
||||||
|
string.IsNullOrWhiteSpace(CurrentQuestion.Question))
|
||||||
{
|
{
|
||||||
await channel.SendErrorAsync("Trivia Game", "Failed loading a question.").ConfigureAwait(false);
|
await channel.SendErrorAsync("Trivia Game", "Failed loading a question.").ConfigureAwait(false);
|
||||||
return;
|
return;
|
||||||
@ -74,7 +76,9 @@ namespace NadekoBot.Modules.Games.Trivia
|
|||||||
|
|
||||||
questionMessage = await channel.EmbedAsync(questionEmbed).ConfigureAwait(false);
|
questionMessage = await channel.EmbedAsync(questionEmbed).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch (HttpException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound || ex.StatusCode == System.Net.HttpStatusCode.Forbidden)
|
catch (HttpException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound ||
|
||||||
|
ex.StatusCode == System.Net.HttpStatusCode.Forbidden ||
|
||||||
|
ex.StatusCode == System.Net.HttpStatusCode.BadRequest)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -143,7 +147,7 @@ namespace NadekoBot.Modules.Games.Trivia
|
|||||||
try { await channel.SendConfirmAsync("Trivia Game", "Stopping after this question.").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); }
|
try { await channel.SendConfirmAsync("Trivia Game", "Stopping after this question.").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); }
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void PotentialGuess(SocketMessage imsg)
|
private async Task PotentialGuess(SocketMessage imsg)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -80,7 +80,7 @@ namespace NadekoBot.Modules.Games
|
|||||||
else if ((pick == 0 && nadekoPick == 1) ||
|
else if ((pick == 0 && nadekoPick == 1) ||
|
||||||
(pick == 1 && nadekoPick == 2) ||
|
(pick == 1 && nadekoPick == 2) ||
|
||||||
(pick == 2 && nadekoPick == 0))
|
(pick == 2 && nadekoPick == 0))
|
||||||
msg = $"{NadekoBot.Client.CurrentUser().Mention} won! {GetRPSPick(nadekoPick)} beats {GetRPSPick(pick)}";
|
msg = $"{NadekoBot.Client.CurrentUser.Mention} won! {GetRPSPick(nadekoPick)} beats {GetRPSPick(pick)}";
|
||||||
else
|
else
|
||||||
msg = $"{Context.User.Mention} won! {GetRPSPick(pick)} beats {GetRPSPick(nadekoPick)}";
|
msg = $"{Context.User.Mention} won! {GetRPSPick(pick)} beats {GetRPSPick(nadekoPick)}";
|
||||||
|
|
||||||
|
@ -137,7 +137,7 @@ namespace NadekoBot.Modules.Help
|
|||||||
}
|
}
|
||||||
helpstr.AppendLine($"{string.Join(" ", com.Aliases.Select(a => "`" + a + "`"))} | {string.Format(com.Summary, com.Module.GetPrefix())} {GetCommandRequirements(com)} | {string.Format(com.Remarks, com.Module.GetPrefix())}");
|
helpstr.AppendLine($"{string.Join(" ", com.Aliases.Select(a => "`" + a + "`"))} | {string.Format(com.Summary, com.Module.GetPrefix())} {GetCommandRequirements(com)} | {string.Format(com.Remarks, com.Module.GetPrefix())}");
|
||||||
}
|
}
|
||||||
helpstr = helpstr.Replace(NadekoBot.Client.CurrentUser().Username , "@BotName");
|
helpstr = helpstr.Replace(NadekoBot.Client.CurrentUser.Username , "@BotName");
|
||||||
File.WriteAllText("../../docs/Commands List.md", helpstr.ToString());
|
File.WriteAllText("../../docs/Commands List.md", helpstr.ToString());
|
||||||
await Context.Channel.SendConfirmAsync("Commandlist Regenerated").ConfigureAwait(false);
|
await Context.Channel.SendConfirmAsync("Commandlist Regenerated").ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
@ -140,9 +140,15 @@ namespace NadekoBot.Modules.Music.Classes
|
|||||||
RemoveSongAt(index, true);
|
RemoveSongAt(index, true);
|
||||||
|
|
||||||
OnStarted(this, CurrentSong);
|
OnStarted(this, CurrentSong);
|
||||||
|
try
|
||||||
|
{
|
||||||
await CurrentSong.Play(audioClient, cancelToken);
|
await CurrentSong.Play(audioClient, cancelToken);
|
||||||
|
}
|
||||||
|
catch(OperationCanceledException)
|
||||||
|
{
|
||||||
OnCompleted(this, CurrentSong);
|
OnCompleted(this, CurrentSong);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (RepeatPlaylist)
|
if (RepeatPlaylist)
|
||||||
AddSong(CurrentSong, CurrentSong.QueuerName);
|
AddSong(CurrentSong, CurrentSong.QueuerName);
|
||||||
@ -151,7 +157,6 @@ namespace NadekoBot.Modules.Music.Classes
|
|||||||
AddSong(CurrentSong, 0);
|
AddSong(CurrentSong, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (OperationCanceledException) { }
|
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Music thread almost crashed.");
|
Console.WriteLine("Music thread almost crashed.");
|
||||||
@ -337,13 +342,13 @@ namespace NadekoBot.Modules.Music.Classes
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task MoveToVoiceChannel(IVoiceChannel voiceChannel)
|
//public async Task MoveToVoiceChannel(IVoiceChannel voiceChannel)
|
||||||
{
|
//{
|
||||||
if (audioClient?.ConnectionState != ConnectionState.Connected)
|
// if (audioClient?.ConnectionState != ConnectionState.Connected)
|
||||||
throw new InvalidOperationException("Can't move while bot is not connected to voice channel.");
|
// throw new InvalidOperationException("Can't move while bot is not connected to voice channel.");
|
||||||
PlaybackVoiceChannel = voiceChannel;
|
// PlaybackVoiceChannel = voiceChannel;
|
||||||
return PlaybackVoiceChannel.ConnectAsync();
|
// audioClient = await voiceChannel.ConnectAsync().ConfigureAwait(false);
|
||||||
}
|
//}
|
||||||
|
|
||||||
public bool ToggleRepeatSong() => this.RepeatSong = !this.RepeatSong;
|
public bool ToggleRepeatSong() => this.RepeatSong = !this.RepeatSong;
|
||||||
|
|
||||||
|
@ -37,30 +37,49 @@ namespace NadekoBot.Modules.Music
|
|||||||
Directory.CreateDirectory(MusicDataPath);
|
Directory.CreateDirectory(MusicDataPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async void Client_UserVoiceStateUpdated(SocketUser iusr, SocketVoiceState oldState, SocketVoiceState newState)
|
private static Task Client_UserVoiceStateUpdated(SocketUser iusr, SocketVoiceState oldState, SocketVoiceState newState)
|
||||||
{
|
{
|
||||||
var usr = iusr as SocketGuildUser;
|
var usr = iusr as SocketGuildUser;
|
||||||
if (usr == null ||
|
if (usr == null ||
|
||||||
oldState.VoiceChannel == newState.VoiceChannel)
|
oldState.VoiceChannel == newState.VoiceChannel)
|
||||||
return;
|
return Task.CompletedTask;
|
||||||
|
|
||||||
MusicPlayer player;
|
MusicPlayer player;
|
||||||
if (!MusicPlayers.TryGetValue(usr.Guild.Id, out player))
|
if (!MusicPlayers.TryGetValue(usr.Guild.Id, out player))
|
||||||
return;
|
return Task.CompletedTask;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var users = await player.PlaybackVoiceChannel.GetUsersAsync().Flatten().ConfigureAwait(false);
|
|
||||||
|
|
||||||
|
//if bot moved
|
||||||
|
if ((player.PlaybackVoiceChannel == oldState.VoiceChannel) &&
|
||||||
|
usr.Id == NadekoBot.Client.CurrentUser.Id)
|
||||||
|
{
|
||||||
|
if (player.Paused && newState.VoiceChannel.Users.Count > 1) //unpause if there are people in the new channel
|
||||||
|
player.TogglePause();
|
||||||
|
else if (!player.Paused && newState.VoiceChannel.Users.Count <= 1) // pause if there are no users in the new channel
|
||||||
|
player.TogglePause();
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//if some other user moved
|
||||||
if ((player.PlaybackVoiceChannel == newState.VoiceChannel && //if joined first, and player paused, unpause
|
if ((player.PlaybackVoiceChannel == newState.VoiceChannel && //if joined first, and player paused, unpause
|
||||||
player.Paused &&
|
player.Paused &&
|
||||||
users.Count() == 2) || // keep in mind bot is in the channel (+1)
|
newState.VoiceChannel.Users.Count == 2) || // keep in mind bot is in the channel (+1)
|
||||||
(player.PlaybackVoiceChannel == oldState.VoiceChannel && // if left last, and player unpaused, pause
|
(player.PlaybackVoiceChannel == oldState.VoiceChannel && // if left last, and player unpaused, pause
|
||||||
!player.Paused &&
|
!player.Paused &&
|
||||||
users.Count() == 1))
|
oldState.VoiceChannel.Users.Count == 1))
|
||||||
{
|
{
|
||||||
player.TogglePause();
|
player.TogglePause();
|
||||||
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
@ -192,7 +211,7 @@ namespace NadekoBot.Modules.Music
|
|||||||
int startAt = itemsPerPage * (curPage - 1);
|
int startAt = itemsPerPage * (curPage - 1);
|
||||||
var number = 0 + startAt;
|
var number = 0 + startAt;
|
||||||
var embed = new EmbedBuilder()
|
var embed = new EmbedBuilder()
|
||||||
.WithAuthor(eab => eab.WithName($"Player Queue")
|
.WithAuthor(eab => eab.WithName($"Player Queue - Page {curPage}/{lastPage + 1}")
|
||||||
.WithMusicIcon())
|
.WithMusicIcon())
|
||||||
.WithDescription(string.Join("\n", musicPlayer.Playlist
|
.WithDescription(string.Join("\n", musicPlayer.Playlist
|
||||||
.Skip(startAt)
|
.Skip(startAt)
|
||||||
@ -217,7 +236,7 @@ namespace NadekoBot.Modules.Music
|
|||||||
}
|
}
|
||||||
return embed;
|
return embed;
|
||||||
};
|
};
|
||||||
await Context.Channel.SendPaginatedConfirmAsync(page, printAction, lastPage).ConfigureAwait(false);
|
await Context.Channel.SendPaginatedConfirmAsync(page, printAction, lastPage, false).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
@ -448,17 +467,17 @@ namespace NadekoBot.Modules.Music
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
//[NadekoCommand, Usage, Description, Aliases]
|
||||||
[RequireContext(ContextType.Guild)]
|
//[RequireContext(ContextType.Guild)]
|
||||||
public async Task Move()
|
//public async Task Move()
|
||||||
{
|
//{
|
||||||
|
|
||||||
MusicPlayer musicPlayer;
|
// MusicPlayer musicPlayer;
|
||||||
var voiceChannel = ((IGuildUser)Context.User).VoiceChannel;
|
// var voiceChannel = ((IGuildUser)Context.User).VoiceChannel;
|
||||||
if (voiceChannel == null || voiceChannel.Guild != Context.Guild || !MusicPlayers.TryGetValue(Context.Guild.Id, out musicPlayer))
|
// if (voiceChannel == null || voiceChannel.Guild != Context.Guild || !MusicPlayers.TryGetValue(Context.Guild.Id, out musicPlayer))
|
||||||
return;
|
// return;
|
||||||
await musicPlayer.MoveToVoiceChannel(voiceChannel);
|
// await musicPlayer.MoveToVoiceChannel(voiceChannel);
|
||||||
}
|
//}
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
[RequireContext(ContextType.Guild)]
|
[RequireContext(ContextType.Guild)]
|
||||||
@ -814,7 +833,7 @@ namespace NadekoBot.Modules.Music
|
|||||||
.WithFooter(ef => ef.WithText(song.PrettyInfo)))
|
.WithFooter(ef => ef.WithText(song.PrettyInfo)))
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
if (mp.Autoplay && mp.Playlist.Count == 0 && song.SongInfo.Provider == "YouTube")
|
if (mp.Autoplay && mp.Playlist.Count == 0 && song.SongInfo.ProviderType == MusicType.Normal)
|
||||||
{
|
{
|
||||||
await QueueSong(await queuer.Guild.GetCurrentUserAsync(), textCh, voiceCh, (await NadekoBot.Google.GetRelatedVideosAsync(song.SongInfo.Query, 4)).ToList().Shuffle().FirstOrDefault(), silent, musicType).ConfigureAwait(false);
|
await QueueSong(await queuer.Guild.GetCurrentUserAsync(), textCh, voiceCh, (await NadekoBot.Google.GetRelatedVideosAsync(song.SongInfo.Query, 4)).ToList().Shuffle().FirstOrDefault(), silent, musicType).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ namespace NadekoBot.Modules.NSFW
|
|||||||
public class NSFW : DiscordModule
|
public class NSFW : DiscordModule
|
||||||
{
|
{
|
||||||
private static ConcurrentDictionary<ulong, Timer> AutoHentaiTimers { get; } = new ConcurrentDictionary<ulong, Timer>();
|
private static ConcurrentDictionary<ulong, Timer> AutoHentaiTimers { get; } = new ConcurrentDictionary<ulong, Timer>();
|
||||||
|
private static ConcurrentHashSet<ulong> _hentaiBombBlacklist { get; } = new ConcurrentHashSet<ulong>();
|
||||||
|
|
||||||
private async Task InternalHentai(IMessageChannel channel, string tag, bool noError)
|
private async Task InternalHentai(IMessageChannel channel, string tag, bool noError)
|
||||||
{
|
{
|
||||||
@ -56,7 +57,8 @@ namespace NadekoBot.Modules.NSFW
|
|||||||
|
|
||||||
await channel.EmbedAsync(new EmbedBuilder().WithOkColor()
|
await channel.EmbedAsync(new EmbedBuilder().WithOkColor()
|
||||||
.WithImageUrl(link)
|
.WithImageUrl(link)
|
||||||
.WithDescription("Tag: " + tag)).ConfigureAwait(false);
|
.WithDescription("Tag: " + tag))
|
||||||
|
.ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
@ -90,7 +92,7 @@ namespace NadekoBot.Modules.NSFW
|
|||||||
if (tagsArr == null || tagsArr.Length == 0)
|
if (tagsArr == null || tagsArr.Length == 0)
|
||||||
await InternalHentai(Context.Channel, null, true).ConfigureAwait(false);
|
await InternalHentai(Context.Channel, null, true).ConfigureAwait(false);
|
||||||
else
|
else
|
||||||
await InternalHentai(Context.Channel, tagsArr[new NadekoRandom().Next(0, tagsArr.Length)], true);
|
await InternalHentai(Context.Channel, tagsArr[new NadekoRandom().Next(0, tagsArr.Length)], true).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
}, null, interval * 1000, interval * 1000);
|
}, null, interval * 1000, interval * 1000);
|
||||||
@ -101,12 +103,17 @@ namespace NadekoBot.Modules.NSFW
|
|||||||
return t;
|
return t;
|
||||||
});
|
});
|
||||||
|
|
||||||
await Context.Channel.SendConfirmAsync($"Autohentai started. Reposting every {interval}s with one of the following tags:\n{string.Join(", ", tagsArr)}").ConfigureAwait(false);
|
await Context.Channel.SendConfirmAsync($"Autohentai started. Reposting every {interval}s with one of the following tags:\n{string.Join(", ", tagsArr)}")
|
||||||
|
.ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
public async Task HentaiBomb([Remainder] string tag = null)
|
public async Task HentaiBomb([Remainder] string tag = null)
|
||||||
|
{
|
||||||
|
if (!_hentaiBombBlacklist.Add(Context.User.Id))
|
||||||
|
return;
|
||||||
|
try
|
||||||
{
|
{
|
||||||
tag = tag?.Trim() ?? "";
|
tag = tag?.Trim() ?? "";
|
||||||
tag = "rating%3Aexplicit+" + tag;
|
tag = "rating%3Aexplicit+" + tag;
|
||||||
@ -125,6 +132,11 @@ namespace NadekoBot.Modules.NSFW
|
|||||||
|
|
||||||
await Context.Channel.SendMessageAsync(String.Join("\n\n", linksEnum)).ConfigureAwait(false);
|
await Context.Channel.SendMessageAsync(String.Join("\n\n", linksEnum)).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
finally {
|
||||||
|
await Task.Delay(5000).ConfigureAwait(false);
|
||||||
|
_hentaiBombBlacklist.TryRemove(Context.User.Id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
@ -135,12 +147,13 @@ namespace NadekoBot.Modules.NSFW
|
|||||||
var url = await GetDanbooruImageLink(tag).ConfigureAwait(false);
|
var url = await GetDanbooruImageLink(tag).ConfigureAwait(false);
|
||||||
|
|
||||||
if (url == null)
|
if (url == null)
|
||||||
await Context.Channel.SendErrorAsync(Context.User.Mention + " No results.");
|
await Context.Channel.SendErrorAsync(Context.User.Mention + " No results.").ConfigureAwait(false);
|
||||||
else
|
else
|
||||||
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
|
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
|
||||||
.WithDescription(Context.User.Mention + " " + tag)
|
.WithDescription(Context.User.Mention + " " + tag)
|
||||||
.WithImageUrl(url)
|
.WithImageUrl(url)
|
||||||
.WithFooter(efb => efb.WithText("Danbooru"))).ConfigureAwait(false);
|
.WithFooter(efb => efb.WithText("Danbooru")))
|
||||||
|
.ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
@ -172,7 +185,8 @@ namespace NadekoBot.Modules.NSFW
|
|||||||
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
|
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
|
||||||
.WithDescription(Context.User.Mention + " " + tag)
|
.WithDescription(Context.User.Mention + " " + tag)
|
||||||
.WithImageUrl(url)
|
.WithImageUrl(url)
|
||||||
.WithFooter(efb => efb.WithText("e621"))).ConfigureAwait(false);
|
.WithFooter(efb => efb.WithText("e621")))
|
||||||
|
.ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
@ -217,14 +231,14 @@ namespace NadekoBot.Modules.NSFW
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<string> GetDanbooruImageLink(string tag)
|
public static Task<string> GetDanbooruImageLink(string tag) => Task.Run(async () =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var http = new HttpClient())
|
using (var http = new HttpClient())
|
||||||
{
|
{
|
||||||
http.AddFakeHeaders();
|
http.AddFakeHeaders();
|
||||||
var data = await http.GetStreamAsync("https://danbooru.donmai.us/posts.xml?limit=100&tags=" + tag);
|
var data = await http.GetStreamAsync("https://danbooru.donmai.us/posts.xml?limit=100&tags=" + tag).ConfigureAwait(false);
|
||||||
var doc = new XmlDocument();
|
var doc = new XmlDocument();
|
||||||
doc.Load(data);
|
doc.Load(data);
|
||||||
var nodes = doc.GetElementsByTagName("file-url");
|
var nodes = doc.GetElementsByTagName("file-url");
|
||||||
@ -237,17 +251,17 @@ namespace NadekoBot.Modules.NSFW
|
|||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
|
|
||||||
public static async Task<string> GetE621ImageLink(string tag)
|
public static Task<string> GetE621ImageLink(string tag) => Task.Run(async () =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var http = new HttpClient())
|
using (var http = new HttpClient())
|
||||||
{
|
{
|
||||||
http.AddFakeHeaders();
|
http.AddFakeHeaders();
|
||||||
var data = await http.GetStreamAsync("http://e621.net/post/index.xml?tags=" + tag);
|
var data = await http.GetStreamAsync("http://e621.net/post/index.xml?tags=" + tag).ConfigureAwait(false);
|
||||||
var doc = new XmlDocument();
|
var doc = new XmlDocument();
|
||||||
doc.Load(data);
|
doc.Load(data);
|
||||||
var nodes = doc.GetElementsByTagName("file_url");
|
var nodes = doc.GetElementsByTagName("file_url");
|
||||||
@ -260,7 +274,7 @@ namespace NadekoBot.Modules.NSFW
|
|||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
public static Task<string> GetYandereImageLink(string tag) =>
|
public static Task<string> GetYandereImageLink(string tag) =>
|
||||||
Searches.Searches.InternalDapiSearch(tag, Searches.Searches.DapiSearchType.Yandere);
|
Searches.Searches.InternalDapiSearch(tag, Searches.Searches.DapiSearchType.Yandere);
|
||||||
|
@ -0,0 +1,101 @@
|
|||||||
|
using Discord;
|
||||||
|
using Discord.Commands;
|
||||||
|
using NadekoBot.Attributes;
|
||||||
|
using NadekoBot.Extensions;
|
||||||
|
using NadekoBot.Services;
|
||||||
|
using NadekoBot.Services.Database;
|
||||||
|
using NadekoBot.Services.Database.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NadekoBot.Modules.Permissions
|
||||||
|
{
|
||||||
|
public partial class Permissions
|
||||||
|
{
|
||||||
|
[Group]
|
||||||
|
public class CommandCostCommands : ModuleBase
|
||||||
|
{
|
||||||
|
private static readonly ConcurrentDictionary<string, int> _commandCosts = new ConcurrentDictionary<string, int>();
|
||||||
|
public static IReadOnlyDictionary<string, int> CommandCosts => _commandCosts;
|
||||||
|
|
||||||
|
static CommandCostCommands()
|
||||||
|
{
|
||||||
|
//_commandCosts = new ConcurrentDictionary<string, int>(NadekoBot.BotConfig.CommandCosts.ToDictionary(
|
||||||
|
// x => x.CommandName.Trim().ToUpperInvariant(),
|
||||||
|
// x => x.Cost));
|
||||||
|
}
|
||||||
|
|
||||||
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
|
public async Task CmdCosts(int page = 1)
|
||||||
|
{
|
||||||
|
var prices = _commandCosts.ToList();
|
||||||
|
|
||||||
|
if (!prices.Any())
|
||||||
|
{
|
||||||
|
await Context.Channel.SendConfirmAsync("No costs set.").ConfigureAwait(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await Context.Channel.SendPaginatedConfirmAsync(page, (curPage) => {
|
||||||
|
var embed = new EmbedBuilder().WithOkColor()
|
||||||
|
.WithTitle("Command Costs");
|
||||||
|
var current = prices.Skip((curPage - 1) * 9)
|
||||||
|
.Take(9);
|
||||||
|
foreach (var price in current)
|
||||||
|
{
|
||||||
|
embed.AddField(efb => efb.WithName(price.Key).WithValue(price.Value.ToString()).WithIsInline(true));
|
||||||
|
}
|
||||||
|
return embed;
|
||||||
|
}, prices.Count / 9).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
//[NadekoCommand, Usage, Description, Aliases]
|
||||||
|
//public async Task CommandCost(int cost, CommandInfo cmd)
|
||||||
|
//{
|
||||||
|
// if (cost < 0)
|
||||||
|
// return;
|
||||||
|
|
||||||
|
// var cmdName = cmd.Aliases.First().ToLowerInvariant();
|
||||||
|
|
||||||
|
// var cmdPrice = new CommandCost()
|
||||||
|
// {
|
||||||
|
// CommandName = cmdName,
|
||||||
|
// Cost = cost
|
||||||
|
// };
|
||||||
|
|
||||||
|
// using (var uow = DbHandler.UnitOfWork())
|
||||||
|
// {
|
||||||
|
// var bc = uow.BotConfig.GetOrCreate();
|
||||||
|
|
||||||
|
// if (cost != 0)
|
||||||
|
// {
|
||||||
|
// var elem = bc.CommandCosts.Where(cc => cc.CommandName == cmdPrice.CommandName).FirstOrDefault();
|
||||||
|
// if (elem == null)
|
||||||
|
// bc.CommandCosts.Add(cmdPrice);
|
||||||
|
// else
|
||||||
|
// elem.Cost = cost;
|
||||||
|
|
||||||
|
// _commandCosts.AddOrUpdate(cmdName, cost, (key, old) => cost);
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// bc.CommandCosts.RemoveAt(bc.CommandCosts.IndexOf(cmdPrice));
|
||||||
|
// int throwaway;
|
||||||
|
// _commandCosts.TryRemove(cmdName, out throwaway);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// await uow.CompleteAsync().ConfigureAwait(false);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (cost == 0)
|
||||||
|
// await Context.Channel.SendConfirmAsync($"Removed the cost from the {Format.Bold(cmd.Name)} command.").ConfigureAwait(false);
|
||||||
|
// else
|
||||||
|
// await Context.Channel.SendConfirmAsync($"{Format.Bold(cmd.Name)} now costs {cost}{NadekoBot.BotConfig.CurrencySign} to run.").ConfigureAwait(false);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -517,7 +517,8 @@ namespace NadekoBot.Modules.Searches
|
|||||||
.WithAuthor(eab => eab.WithUrl(link)
|
.WithAuthor(eab => eab.WithUrl(link)
|
||||||
.WithIconUrl("http://res.cloudinary.com/urbandictionary/image/upload/a_exif,c_fit,h_200,w_200/v1394975045/b8oszuu3tbq7ebyo7vo1.jpg")
|
.WithIconUrl("http://res.cloudinary.com/urbandictionary/image/upload/a_exif,c_fit,h_200,w_200/v1394975045/b8oszuu3tbq7ebyo7vo1.jpg")
|
||||||
.WithName(query))
|
.WithName(query))
|
||||||
.WithDescription(desc));
|
.WithDescription(desc))
|
||||||
|
.ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
@ -572,9 +573,9 @@ namespace NadekoBot.Modules.Searches
|
|||||||
var result = await http.GetStringAsync("https://en.wikipedia.org//w/api.php?action=query&format=json&prop=info&redirects=1&formatversion=2&inprop=url&titles=" + Uri.EscapeDataString(query));
|
var result = await http.GetStringAsync("https://en.wikipedia.org//w/api.php?action=query&format=json&prop=info&redirects=1&formatversion=2&inprop=url&titles=" + Uri.EscapeDataString(query));
|
||||||
var data = JsonConvert.DeserializeObject<WikipediaApiModel>(result);
|
var data = JsonConvert.DeserializeObject<WikipediaApiModel>(result);
|
||||||
if (data.Query.Pages[0].Missing)
|
if (data.Query.Pages[0].Missing)
|
||||||
await Context.Channel.SendErrorAsync("That page could not be found.");
|
await Context.Channel.SendErrorAsync("That page could not be found.").ConfigureAwait(false);
|
||||||
else
|
else
|
||||||
await Context.Channel.SendMessageAsync(data.Query.Pages[0].FullUrl);
|
await Context.Channel.SendMessageAsync(data.Query.Pages[0].FullUrl).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -588,7 +589,7 @@ namespace NadekoBot.Modules.Searches
|
|||||||
|
|
||||||
img.BackgroundColor(new ImageSharp.Color(color));
|
img.BackgroundColor(new ImageSharp.Color(color));
|
||||||
|
|
||||||
await Context.Channel.SendFileAsync(img.ToStream(), $"{color}.png");
|
await Context.Channel.SendFileAsync(img.ToStream(), $"{color}.png").ConfigureAwait(false); ;
|
||||||
}
|
}
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
@ -642,7 +643,7 @@ namespace NadekoBot.Modules.Searches
|
|||||||
var response = $@"`Title:` {found["title"].ToString()}
|
var response = $@"`Title:` {found["title"].ToString()}
|
||||||
`Quality:` {found["quality"]}
|
`Quality:` {found["quality"]}
|
||||||
`URL:` {await NadekoBot.Google.ShortenUrl(found["url"].ToString()).ConfigureAwait(false)}";
|
`URL:` {await NadekoBot.Google.ShortenUrl(found["url"].ToString()).ConfigureAwait(false)}";
|
||||||
await Context.Channel.SendMessageAsync(response);
|
await Context.Channel.SendMessageAsync(response).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
@ -773,11 +774,13 @@ namespace NadekoBot.Modules.Searches
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
try
|
try
|
||||||
|
{
|
||||||
|
var toReturn = await Task.Run(async () =>
|
||||||
{
|
{
|
||||||
using (var http = new HttpClient())
|
using (var http = new HttpClient())
|
||||||
{
|
{
|
||||||
http.AddFakeHeaders();
|
http.AddFakeHeaders();
|
||||||
var data = await http.GetStreamAsync(website);
|
var data = await http.GetStreamAsync(website).ConfigureAwait(false);
|
||||||
var doc = new XmlDocument();
|
var doc = new XmlDocument();
|
||||||
doc.Load(data);
|
doc.Load(data);
|
||||||
|
|
||||||
@ -788,6 +791,8 @@ namespace NadekoBot.Modules.Searches
|
|||||||
url = "https:" + url;
|
url = "https:" + url;
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
}).ConfigureAwait(false);
|
||||||
|
return toReturn;
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
@ -31,7 +31,7 @@ namespace NadekoBot.Modules.Utility
|
|||||||
var channel = imsg.Channel as ITextChannel;
|
var channel = imsg.Channel as ITextChannel;
|
||||||
if (channel == null)
|
if (channel == null)
|
||||||
return;
|
return;
|
||||||
if (msg.Author.Id == NadekoBot.Client.CurrentUser().Id) return;
|
if (msg.Author.Id == NadekoBot.Client.CurrentUser.Id) return;
|
||||||
foreach (var subscriber in Subscribers)
|
foreach (var subscriber in Subscribers)
|
||||||
{
|
{
|
||||||
var set = subscriber.Value;
|
var set = subscriber.Value;
|
||||||
|
@ -277,27 +277,25 @@ namespace NadekoBot.Modules.Utility
|
|||||||
.WithIconUrl("https://cdn.discordapp.com/avatars/116275390695079945/b21045e778ef21c96d175400e779f0fb.jpg"))
|
.WithIconUrl("https://cdn.discordapp.com/avatars/116275390695079945/b21045e778ef21c96d175400e779f0fb.jpg"))
|
||||||
.AddField(efb => efb.WithName(Format.Bold("Author")).WithValue(stats.Author).WithIsInline(true))
|
.AddField(efb => efb.WithName(Format.Bold("Author")).WithValue(stats.Author).WithIsInline(true))
|
||||||
.AddField(efb => efb.WithName(Format.Bold("Library")).WithValue(stats.Library).WithIsInline(true))
|
.AddField(efb => efb.WithName(Format.Bold("Library")).WithValue(stats.Library).WithIsInline(true))
|
||||||
.AddField(efb => efb.WithName(Format.Bold("Bot ID")).WithValue(NadekoBot.Client.CurrentUser().Id.ToString()).WithIsInline(true))
|
.AddField(efb => efb.WithName(Format.Bold("Bot ID")).WithValue(NadekoBot.Client.CurrentUser.Id.ToString()).WithIsInline(true))
|
||||||
.AddField(efb => efb.WithName(Format.Bold("Commands Ran")).WithValue(stats.CommandsRan.ToString()).WithIsInline(true))
|
.AddField(efb => efb.WithName(Format.Bold("Commands Ran")).WithValue(stats.CommandsRan.ToString()).WithIsInline(true))
|
||||||
.AddField(efb => efb.WithName(Format.Bold("Messages")).WithValue($"{stats.MessageCounter} ({stats.MessagesPerSecond:F2}/sec)").WithIsInline(true))
|
.AddField(efb => efb.WithName(Format.Bold("Messages")).WithValue($"{stats.MessageCounter} ({stats.MessagesPerSecond:F2}/sec)").WithIsInline(true))
|
||||||
.AddField(efb => efb.WithName(Format.Bold("Memory")).WithValue($"{stats.Heap} MB").WithIsInline(true))
|
.AddField(efb => efb.WithName(Format.Bold("Memory")).WithValue($"{stats.Heap} MB").WithIsInline(true))
|
||||||
.AddField(efb => efb.WithName(Format.Bold("Owner ID(s)")).WithValue(string.Join("\n", NadekoBot.Credentials.OwnerIds)).WithIsInline(true))
|
.AddField(efb => efb.WithName(Format.Bold("Owner ID(s)")).WithValue(string.Join("\n", NadekoBot.Credentials.OwnerIds)).WithIsInline(true))
|
||||||
.AddField(efb => efb.WithName(Format.Bold("Uptime")).WithValue(stats.GetUptimeString("\n")).WithIsInline(true))
|
.AddField(efb => efb.WithName(Format.Bold("Uptime")).WithValue(stats.GetUptimeString("\n")).WithIsInline(true))
|
||||||
.AddField(efb => efb.WithName(Format.Bold("Presence")).WithValue($"{NadekoBot.Client.GetGuildsCount()} Servers\n{stats.TextChannels} Text Channels\n{stats.VoiceChannels} Voice Channels").WithIsInline(true))
|
.AddField(efb => efb.WithName(Format.Bold("Presence")).WithValue($"{NadekoBot.Client.GetGuildCount()} Servers\n{stats.TextChannels} Text Channels\n{stats.VoiceChannels} Voice Channels").WithIsInline(true))
|
||||||
#if !GLOBAL_NADEKO
|
#if !GLOBAL_NADEKO
|
||||||
.WithFooter(efb => efb.WithText($"Playing {Music.Music.MusicPlayers.Where(mp => mp.Value.CurrentSong != null).Count()} songs, {Music.Music.MusicPlayers.Sum(mp => mp.Value.Playlist.Count)} queued."))
|
.WithFooter(efb => efb.WithText($"Playing {Music.Music.MusicPlayers.Where(mp => mp.Value.CurrentSong != null).Count()} songs, {Music.Music.MusicPlayers.Sum(mp => mp.Value.Playlist.Count)} queued."))
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Regex emojiFinder { get; } = new Regex(@"<:(?<name>.+?):(?<id>\d*)>", RegexOptions.Compiled);
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
[NadekoCommand, Usage, Description, Aliases]
|
||||||
public async Task Showemojis([Remainder] string emojis)
|
public async Task Showemojis([Remainder] string emojis)
|
||||||
{
|
{
|
||||||
var matches = emojiFinder.Matches(emojis);
|
var tags = Context.Message.Tags.Where(t => t.Type == TagType.Emoji).Select(t => (Emoji)t.Value);
|
||||||
|
|
||||||
var result = string.Join("\n", matches.Cast<Match>()
|
var result = string.Join("\n", tags.Select(m => $"**Name:** {m} **Link:** {m.Url}"));
|
||||||
.Select(m => $"**Name:** {m.Groups["name"]} **Link:** http://discordapp.com/api/emojis/{m.Groups["id"]}.png"));
|
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(result))
|
if (string.IsNullOrWhiteSpace(result))
|
||||||
await Context.Channel.SendErrorAsync("No special emojis found.");
|
await Context.Channel.SendErrorAsync("No special emojis found.");
|
||||||
|
@ -28,7 +28,7 @@ namespace NadekoBot
|
|||||||
|
|
||||||
public static CommandService CommandService { get; private set; }
|
public static CommandService CommandService { get; private set; }
|
||||||
public static CommandHandler CommandHandler { get; private set; }
|
public static CommandHandler CommandHandler { get; private set; }
|
||||||
public static ShardedDiscordClient Client { get; private set; }
|
public static DiscordShardedClient Client { get; private set; }
|
||||||
public static BotCredentials Credentials { get; private set; }
|
public static BotCredentials Credentials { get; private set; }
|
||||||
|
|
||||||
public static GoogleApiService Google { get; private set; }
|
public static GoogleApiService Google { get; private set; }
|
||||||
@ -59,7 +59,7 @@ namespace NadekoBot
|
|||||||
_log.Info("Starting NadekoBot v" + StatsService.BotVersion);
|
_log.Info("Starting NadekoBot v" + StatsService.BotVersion);
|
||||||
|
|
||||||
//create client
|
//create client
|
||||||
Client = new ShardedDiscordClient(new DiscordSocketConfig
|
Client = new DiscordShardedClient(new DiscordSocketConfig
|
||||||
{
|
{
|
||||||
AudioMode = Discord.Audio.AudioMode.Outgoing,
|
AudioMode = Discord.Audio.AudioMode.Outgoing,
|
||||||
MessageCacheSize = 10,
|
MessageCacheSize = 10,
|
||||||
@ -67,6 +67,9 @@ namespace NadekoBot
|
|||||||
TotalShards = Credentials.TotalShards,
|
TotalShards = Credentials.TotalShards,
|
||||||
ConnectionTimeout = int.MaxValue
|
ConnectionTimeout = int.MaxValue
|
||||||
});
|
});
|
||||||
|
#if GLOBAL_NADEKO
|
||||||
|
Client.Log += Client_Log;
|
||||||
|
#endif
|
||||||
|
|
||||||
//initialize Services
|
//initialize Services
|
||||||
CommandService = new CommandService(new CommandServiceConfig() {
|
CommandService = new CommandService(new CommandServiceConfig() {
|
||||||
@ -93,9 +96,8 @@ namespace NadekoBot
|
|||||||
//connect
|
//connect
|
||||||
await Client.LoginAsync(TokenType.Bot, Credentials.Token).ConfigureAwait(false);
|
await Client.LoginAsync(TokenType.Bot, Credentials.Token).ConfigureAwait(false);
|
||||||
await Client.ConnectAsync().ConfigureAwait(false);
|
await Client.ConnectAsync().ConfigureAwait(false);
|
||||||
#if !GLOBAL_NADEKO
|
|
||||||
await Client.DownloadAllUsersAsync().ConfigureAwait(false);
|
await Client.DownloadAllUsersAsync().ConfigureAwait(false);
|
||||||
#endif
|
Stats.Initialize();
|
||||||
|
|
||||||
_log.Info("Connected");
|
_log.Info("Connected");
|
||||||
|
|
||||||
@ -104,6 +106,7 @@ namespace NadekoBot
|
|||||||
ModulePrefixes = new ConcurrentDictionary<string, string>(NadekoBot.BotConfig.ModulePrefixes.OrderByDescending(mp => mp.Prefix.Length).ToDictionary(m => m.ModuleName, m => m.Prefix));
|
ModulePrefixes = new ConcurrentDictionary<string, string>(NadekoBot.BotConfig.ModulePrefixes.OrderByDescending(mp => mp.Prefix.Length).ToDictionary(m => m.ModuleName, m => m.Prefix));
|
||||||
|
|
||||||
// start handling messages received in commandhandler
|
// start handling messages received in commandhandler
|
||||||
|
|
||||||
await CommandHandler.StartHandling().ConfigureAwait(false);
|
await CommandHandler.StartHandling().ConfigureAwait(false);
|
||||||
|
|
||||||
await CommandService.AddModulesAsync(this.GetType().GetTypeInfo().Assembly).ConfigureAwait(false);
|
await CommandService.AddModulesAsync(this.GetType().GetTypeInfo().Assembly).ConfigureAwait(false);
|
||||||
@ -114,6 +117,15 @@ namespace NadekoBot
|
|||||||
Console.WriteLine(await Stats.Print().ConfigureAwait(false));
|
Console.WriteLine(await Stats.Print().ConfigureAwait(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Task Client_Log(LogMessage arg)
|
||||||
|
{
|
||||||
|
_log.Warn(arg.Source + " | " + arg.Message);
|
||||||
|
if (arg.Exception != null)
|
||||||
|
_log.Warn(arg.Exception);
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
public async Task RunAndBlockAsync(params string[] args)
|
public async Task RunAndBlockAsync(params string[] args)
|
||||||
{
|
{
|
||||||
await RunAsync(args).ConfigureAwait(false);
|
await RunAsync(args).ConfigureAwait(false);
|
||||||
|
81
src/NadekoBot/Resources/CommandStrings.Designer.cs
generated
81
src/NadekoBot/Resources/CommandStrings.Designer.cs
generated
@ -1760,6 +1760,33 @@ namespace NadekoBot.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to cmdcosts.
|
||||||
|
/// </summary>
|
||||||
|
public static string cmdcosts_cmd {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("cmdcosts_cmd", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Shows a list of command costs. Paginated with 9 command per page..
|
||||||
|
/// </summary>
|
||||||
|
public static string cmdcosts_desc {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("cmdcosts_desc", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to `{0}cmdcosts` or `{0}cmdcosts 2`.
|
||||||
|
/// </summary>
|
||||||
|
public static string cmdcosts_usage {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("cmdcosts_usage", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to color clr.
|
/// Looks up a localized string similar to color clr.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -1787,6 +1814,33 @@ namespace NadekoBot.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to commandcost cmdcost.
|
||||||
|
/// </summary>
|
||||||
|
public static string commandcost_cmd {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("commandcost_cmd", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Sets a price for a command. Running that command will take currency from users. Set 0 to remove the price..
|
||||||
|
/// </summary>
|
||||||
|
public static string commandcost_desc {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("commandcost_desc", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to `{0}cmdcost 0 !!q` or `{0}cmdcost 1 >8ball`.
|
||||||
|
/// </summary>
|
||||||
|
public static string commandcost_usage {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("commandcost_usage", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to commands cmds.
|
/// Looks up a localized string similar to commands cmds.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -7241,6 +7295,33 @@ namespace NadekoBot.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to startevent.
|
||||||
|
/// </summary>
|
||||||
|
public static string startevent_cmd {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("startevent_cmd", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Starts one of the events seen on public nadeko..
|
||||||
|
/// </summary>
|
||||||
|
public static string startevent_desc {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("startevent_desc", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to `{0}startevent flowerreaction`.
|
||||||
|
/// </summary>
|
||||||
|
public static string startevent_usage {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("startevent_usage", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to startwar sw.
|
/// Looks up a localized string similar to startwar sw.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -2925,4 +2925,31 @@
|
|||||||
<data name="antispamignore_usage" xml:space="preserve">
|
<data name="antispamignore_usage" xml:space="preserve">
|
||||||
<value>`{0}antispamignore`</value>
|
<value>`{0}antispamignore`</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="cmdcosts_cmd" xml:space="preserve">
|
||||||
|
<value>cmdcosts</value>
|
||||||
|
</data>
|
||||||
|
<data name="cmdcosts_desc" xml:space="preserve">
|
||||||
|
<value>Shows a list of command costs. Paginated with 9 command per page.</value>
|
||||||
|
</data>
|
||||||
|
<data name="cmdcosts_usage" xml:space="preserve">
|
||||||
|
<value>`{0}cmdcosts` or `{0}cmdcosts 2`</value>
|
||||||
|
</data>
|
||||||
|
<data name="commandcost_cmd" xml:space="preserve">
|
||||||
|
<value>commandcost cmdcost</value>
|
||||||
|
</data>
|
||||||
|
<data name="commandcost_desc" xml:space="preserve">
|
||||||
|
<value>Sets a price for a command. Running that command will take currency from users. Set 0 to remove the price.</value>
|
||||||
|
</data>
|
||||||
|
<data name="commandcost_usage" xml:space="preserve">
|
||||||
|
<value>`{0}cmdcost 0 !!q` or `{0}cmdcost 1 >8ball`</value>
|
||||||
|
</data>
|
||||||
|
<data name="startevent_cmd" xml:space="preserve">
|
||||||
|
<value>startevent</value>
|
||||||
|
</data>
|
||||||
|
<data name="startevent_desc" xml:space="preserve">
|
||||||
|
<value>Starts one of the events seen on public nadeko.</value>
|
||||||
|
</data>
|
||||||
|
<data name="startevent_usage" xml:space="preserve">
|
||||||
|
<value>`{0}startevent flowerreaction`</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
@ -32,9 +32,9 @@ namespace NadekoBot.Services
|
|||||||
{
|
{
|
||||||
public const int GlobalCommandsCooldown = 1500;
|
public const int GlobalCommandsCooldown = 1500;
|
||||||
|
|
||||||
private ShardedDiscordClient _client;
|
private readonly DiscordShardedClient _client;
|
||||||
private CommandService _commandService;
|
private readonly CommandService _commandService;
|
||||||
private Logger _log;
|
private readonly Logger _log;
|
||||||
|
|
||||||
private List<IDMChannel> ownerChannels { get; set; }
|
private List<IDMChannel> ownerChannels { get; set; }
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ namespace NadekoBot.Services
|
|||||||
public ConcurrentHashSet<ulong> UsersOnShortCooldown { get; } = new ConcurrentHashSet<ulong>();
|
public ConcurrentHashSet<ulong> UsersOnShortCooldown { get; } = new ConcurrentHashSet<ulong>();
|
||||||
private Timer clearUsersOnShortCooldown { get; }
|
private Timer clearUsersOnShortCooldown { get; }
|
||||||
|
|
||||||
public CommandHandler(ShardedDiscordClient client, CommandService commandService)
|
public CommandHandler(DiscordShardedClient client, CommandService commandService)
|
||||||
{
|
{
|
||||||
_client = client;
|
_client = client;
|
||||||
_commandService = commandService;
|
_commandService = commandService;
|
||||||
@ -100,8 +100,8 @@ namespace NadekoBot.Services
|
|||||||
BlacklistCommands.BlacklistedChannels.Contains(usrMsg.Channel.Id) ||
|
BlacklistCommands.BlacklistedChannels.Contains(usrMsg.Channel.Id) ||
|
||||||
BlacklistCommands.BlacklistedUsers.Contains(usrMsg.Author.Id);
|
BlacklistCommands.BlacklistedUsers.Contains(usrMsg.Author.Id);
|
||||||
|
|
||||||
|
const float oneThousandth = 1.0f / 1000;
|
||||||
private async Task LogSuccessfulExecution(SocketUserMessage usrMsg, ExecuteCommandResult exec, SocketTextChannel channel, Stopwatch sw)
|
private async Task LogSuccessfulExecution(SocketUserMessage usrMsg, ExecuteCommandResult exec, SocketTextChannel channel, int ticks)
|
||||||
{
|
{
|
||||||
await CommandExecuted(usrMsg, exec.CommandInfo).ConfigureAwait(false);
|
await CommandExecuted(usrMsg, exec.CommandInfo).ConfigureAwait(false);
|
||||||
_log.Info("Command Executed after {4}s\n\t" +
|
_log.Info("Command Executed after {4}s\n\t" +
|
||||||
@ -113,10 +113,10 @@ namespace NadekoBot.Services
|
|||||||
(channel == null ? "PRIVATE" : channel.Guild.Name + " [" + channel.Guild.Id + "]"), // {1}
|
(channel == null ? "PRIVATE" : channel.Guild.Name + " [" + channel.Guild.Id + "]"), // {1}
|
||||||
(channel == null ? "PRIVATE" : channel.Name + " [" + channel.Id + "]"), // {2}
|
(channel == null ? "PRIVATE" : channel.Name + " [" + channel.Id + "]"), // {2}
|
||||||
usrMsg.Content, // {3}
|
usrMsg.Content, // {3}
|
||||||
sw.Elapsed.TotalSeconds);
|
ticks * oneThousandth);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LogErroredExecution(SocketUserMessage usrMsg, ExecuteCommandResult exec, SocketTextChannel channel, Stopwatch sw)
|
private void LogErroredExecution(SocketUserMessage usrMsg, ExecuteCommandResult exec, SocketTextChannel channel, int ticks)
|
||||||
{
|
{
|
||||||
_log.Warn("Command Errored after {5}s\n\t" +
|
_log.Warn("Command Errored after {5}s\n\t" +
|
||||||
"User: {0}\n\t" +
|
"User: {0}\n\t" +
|
||||||
@ -129,7 +129,7 @@ namespace NadekoBot.Services
|
|||||||
(channel == null ? "PRIVATE" : channel.Name + " [" + channel.Id + "]"), // {2}
|
(channel == null ? "PRIVATE" : channel.Name + " [" + channel.Id + "]"), // {2}
|
||||||
usrMsg.Content,// {3}
|
usrMsg.Content,// {3}
|
||||||
exec.Result.ErrorReason, // {4}
|
exec.Result.ErrorReason, // {4}
|
||||||
sw.Elapsed.TotalSeconds // {5}
|
ticks * oneThousandth // {5}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,13 +180,15 @@ namespace NadekoBot.Services
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void MessageReceivedHandler(SocketMessage msg)
|
private async Task MessageReceivedHandler(SocketMessage msg)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (msg.Author.IsBot || !NadekoBot.Ready) //no bots, wait until bot connected and initialized
|
if (msg.Author.IsBot || !NadekoBot.Ready) //no bots, wait until bot connected and initialized
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
var execTime = Environment.TickCount;
|
||||||
|
|
||||||
var usrMsg = msg as SocketUserMessage;
|
var usrMsg = msg as SocketUserMessage;
|
||||||
if (usrMsg == null) //has to be an user message, not system/other messages.
|
if (usrMsg == null) //has to be an user message, not system/other messages.
|
||||||
return;
|
return;
|
||||||
@ -226,17 +228,16 @@ namespace NadekoBot.Services
|
|||||||
string messageContent = usrMsg.Content;
|
string messageContent = usrMsg.Content;
|
||||||
|
|
||||||
// execute the command and measure the time it took
|
// execute the command and measure the time it took
|
||||||
var sw = Stopwatch.StartNew();
|
var exec = await ExecuteCommand(new CommandContext(_client, usrMsg), messageContent, DependencyMap.Empty, MultiMatchHandling.Best);
|
||||||
var exec = await ExecuteCommand(new CommandContext(_client.MainClient, usrMsg), messageContent, DependencyMap.Empty, MultiMatchHandling.Best);
|
execTime = Environment.TickCount - execTime;
|
||||||
sw.Stop();
|
|
||||||
|
|
||||||
if (exec.Result.IsSuccess)
|
if (exec.Result.IsSuccess)
|
||||||
{
|
{
|
||||||
await LogSuccessfulExecution(usrMsg, exec, channel, sw).ConfigureAwait(false);
|
await LogSuccessfulExecution(usrMsg, exec, channel, execTime).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else if (!exec.Result.IsSuccess && exec.Result.Error != CommandError.UnknownCommand)
|
else if (!exec.Result.IsSuccess && exec.Result.Error != CommandError.UnknownCommand)
|
||||||
{
|
{
|
||||||
LogErroredExecution(usrMsg, exec, channel, sw);
|
LogErroredExecution(usrMsg, exec, channel, execTime);
|
||||||
if (guild != null && exec.CommandInfo != null && exec.Result.Error == CommandError.Exception)
|
if (guild != null && exec.CommandInfo != null && exec.Result.Error == CommandError.Exception)
|
||||||
{
|
{
|
||||||
if (exec.PermissionCache != null && exec.PermissionCache.Verbose)
|
if (exec.PermissionCache != null && exec.PermissionCache.Verbose)
|
||||||
@ -354,6 +355,16 @@ namespace NadekoBot.Services
|
|||||||
return new ExecuteCommandResult(cmd, pc, SearchResult.FromError(CommandError.Exception, $"You need the **{pc.PermRole}** role in order to use permission commands."));
|
return new ExecuteCommandResult(cmd, pc, SearchResult.FromError(CommandError.Exception, $"You need the **{pc.PermRole}** role in order to use permission commands."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int price;
|
||||||
|
if (Permissions.CommandCostCommands.CommandCosts.TryGetValue(cmd.Aliases.First().Trim().ToLowerInvariant(), out price) && price > 0)
|
||||||
|
{
|
||||||
|
var success = await CurrencyHandler.RemoveCurrencyAsync(context.User.Id, $"Running {cmd.Name} command.", price).ConfigureAwait(false);
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
return new ExecuteCommandResult(cmd, pc, SearchResult.FromError(CommandError.Exception, $"Insufficient funds. You need {price}{NadekoBot.BotConfig.CurrencySign} to run this command."));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,6 +31,11 @@ namespace NadekoBot.Services.Database.Models
|
|||||||
public float Betroll67Multiplier { get; set; } = 2;
|
public float Betroll67Multiplier { get; set; } = 2;
|
||||||
public float Betroll91Multiplier { get; set; } = 3;
|
public float Betroll91Multiplier { get; set; } = 3;
|
||||||
public float Betroll100Multiplier { get; set; } = 10;
|
public float Betroll100Multiplier { get; set; } = 10;
|
||||||
|
//public HashSet<CommandCost> CommandCosts { get; set; } = new HashSet<CommandCost>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// I messed up, don't use
|
||||||
|
/// </summary>
|
||||||
public HashSet<CommandPrice> CommandPrices { get; set; } = new HashSet<CommandPrice>();
|
public HashSet<CommandPrice> CommandPrices { get; set; } = new HashSet<CommandPrice>();
|
||||||
|
|
||||||
|
|
||||||
|
27
src/NadekoBot/Services/Database/Models/CommandCost.cs
Normal file
27
src/NadekoBot/Services/Database/Models/CommandCost.cs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NadekoBot.Services.Database.Models
|
||||||
|
{
|
||||||
|
public class CommandCost : DbEntity
|
||||||
|
{
|
||||||
|
public int Cost { get; set; }
|
||||||
|
public string CommandName { get; set; }
|
||||||
|
|
||||||
|
public override int GetHashCode() =>
|
||||||
|
CommandName.GetHashCode();
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
var instance = obj as CommandCost;
|
||||||
|
|
||||||
|
if (instance == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return instance.CommandName == CommandName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -11,18 +11,5 @@ namespace NadekoBot.Services.Database.Models
|
|||||||
public int Price { get; set; }
|
public int Price { get; set; }
|
||||||
//this is unique
|
//this is unique
|
||||||
public string CommandName { get; set; }
|
public string CommandName { get; set; }
|
||||||
|
|
||||||
public override int GetHashCode() =>
|
|
||||||
CommandName.GetHashCode();
|
|
||||||
|
|
||||||
public override bool Equals(object obj)
|
|
||||||
{
|
|
||||||
var instance = obj as CommandPrice;
|
|
||||||
|
|
||||||
if (instance == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return instance.CommandName == CommandName;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -235,9 +235,14 @@ namespace NadekoBot.Services.Database
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region CommandPrice
|
#region CommandPrice
|
||||||
|
//well, i failed
|
||||||
modelBuilder.Entity<CommandPrice>()
|
modelBuilder.Entity<CommandPrice>()
|
||||||
.HasIndex(cp => cp.Price)
|
.HasIndex(cp => cp.Price)
|
||||||
.IsUnique();
|
.IsUnique();
|
||||||
|
|
||||||
|
//modelBuilder.Entity<CommandCost>()
|
||||||
|
// .HasIndex(cp => cp.CommandName)
|
||||||
|
// .IsUnique();
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ namespace NadekoBot.Services.Database.Repositories.Impl
|
|||||||
.Include(bc => bc.Blacklist)
|
.Include(bc => bc.Blacklist)
|
||||||
.Include(bc => bc.EightBallResponses)
|
.Include(bc => bc.EightBallResponses)
|
||||||
.Include(bc => bc.ModulePrefixes)
|
.Include(bc => bc.ModulePrefixes)
|
||||||
|
//.Include(bc => bc.CommandCosts)
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
|
|
||||||
if (config == null)
|
if (config == null)
|
||||||
|
@ -26,7 +26,7 @@ namespace NadekoBot.Services.Discord
|
|||||||
NadekoBot.Client.ReactionsCleared += Discord_ReactionsCleared;
|
NadekoBot.Client.ReactionsCleared += Discord_ReactionsCleared;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Discord_ReactionsCleared(ulong messageId, Optional<SocketUserMessage> reaction)
|
private Task Discord_ReactionsCleared(ulong messageId, Optional<SocketUserMessage> reaction)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -34,9 +34,11 @@ namespace NadekoBot.Services.Discord
|
|||||||
OnReactionsCleared?.Invoke();
|
OnReactionsCleared?.Invoke();
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Discord_ReactionRemoved(ulong messageId, Optional<SocketUserMessage> arg2, SocketReaction reaction)
|
private Task Discord_ReactionRemoved(ulong messageId, Optional<SocketUserMessage> arg2, SocketReaction reaction)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -44,9 +46,11 @@ namespace NadekoBot.Services.Discord
|
|||||||
OnReactionRemoved?.Invoke(reaction);
|
OnReactionRemoved?.Invoke(reaction);
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Discord_ReactionAdded(ulong messageId, Optional<SocketUserMessage> message, SocketReaction reaction)
|
private Task Discord_ReactionAdded(ulong messageId, Optional<SocketUserMessage> message, SocketReaction reaction)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -54,6 +58,8 @@ namespace NadekoBot.Services.Discord
|
|||||||
OnReactionAdded?.Invoke(reaction);
|
OnReactionAdded?.Invoke(reaction);
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UnsubAll()
|
public void UnsubAll()
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using Discord;
|
using Discord;
|
||||||
|
using Discord.WebSocket;
|
||||||
using NadekoBot.Extensions;
|
using NadekoBot.Extensions;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -11,10 +12,10 @@ namespace NadekoBot.Services.Impl
|
|||||||
{
|
{
|
||||||
public class StatsService : IStatsService
|
public class StatsService : IStatsService
|
||||||
{
|
{
|
||||||
private ShardedDiscordClient client;
|
private DiscordShardedClient client;
|
||||||
private DateTime started;
|
private DateTime started;
|
||||||
|
|
||||||
public const string BotVersion = "1.1.0";
|
public const string BotVersion = "1.1.1";
|
||||||
|
|
||||||
public string Author => "Kwoth#2560";
|
public string Author => "Kwoth#2560";
|
||||||
public string Library => "Discord.Net";
|
public string Library => "Discord.Net";
|
||||||
@ -30,7 +31,7 @@ namespace NadekoBot.Services.Impl
|
|||||||
|
|
||||||
Timer carbonitexTimer { get; }
|
Timer carbonitexTimer { get; }
|
||||||
|
|
||||||
public StatsService(ShardedDiscordClient client, CommandHandler cmdHandler)
|
public StatsService(DiscordShardedClient client, CommandHandler cmdHandler)
|
||||||
{
|
{
|
||||||
|
|
||||||
this.client = client;
|
this.client = client;
|
||||||
@ -39,21 +40,14 @@ namespace NadekoBot.Services.Impl
|
|||||||
this.client.MessageReceived += _ => Task.FromResult(MessageCounter++);
|
this.client.MessageReceived += _ => Task.FromResult(MessageCounter++);
|
||||||
cmdHandler.CommandExecuted += (_, e) => Task.FromResult(CommandsRan++);
|
cmdHandler.CommandExecuted += (_, e) => Task.FromResult(CommandsRan++);
|
||||||
|
|
||||||
this.client.Disconnected += _ => Reset();
|
|
||||||
|
|
||||||
this.client.Connected += () =>
|
|
||||||
{
|
|
||||||
var guilds = this.client.GetGuilds();
|
|
||||||
_textChannels = guilds.Sum(g => g.Channels.Where(cx => cx is ITextChannel).Count());
|
|
||||||
_voiceChannels = guilds.Sum(g => g.Channels.Count) - _textChannels;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.client.ChannelCreated += (c) =>
|
this.client.ChannelCreated += (c) =>
|
||||||
{
|
{
|
||||||
if (c is ITextChannel)
|
if (c is ITextChannel)
|
||||||
++_textChannels;
|
++_textChannels;
|
||||||
else if (c is IVoiceChannel)
|
else if (c is IVoiceChannel)
|
||||||
++_voiceChannels;
|
++_voiceChannels;
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.client.ChannelDestroyed += (c) =>
|
this.client.ChannelDestroyed += (c) =>
|
||||||
@ -62,6 +56,8 @@ namespace NadekoBot.Services.Impl
|
|||||||
--_textChannels;
|
--_textChannels;
|
||||||
else if (c is IVoiceChannel)
|
else if (c is IVoiceChannel)
|
||||||
--_voiceChannels;
|
--_voiceChannels;
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.client.JoinedGuild += (g) =>
|
this.client.JoinedGuild += (g) =>
|
||||||
@ -70,6 +66,8 @@ namespace NadekoBot.Services.Impl
|
|||||||
var vc = g.Channels.Count - tc;
|
var vc = g.Channels.Count - tc;
|
||||||
_textChannels += tc;
|
_textChannels += tc;
|
||||||
_voiceChannels += vc;
|
_voiceChannels += vc;
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.client.LeftGuild += (g) =>
|
this.client.LeftGuild += (g) =>
|
||||||
@ -78,6 +76,8 @@ namespace NadekoBot.Services.Impl
|
|||||||
var vc = g.Channels.Count - tc;
|
var vc = g.Channels.Count - tc;
|
||||||
_textChannels -= tc;
|
_textChannels -= tc;
|
||||||
_voiceChannels -= vc;
|
_voiceChannels -= vc;
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.carbonitexTimer = new Timer(async (state) =>
|
this.carbonitexTimer = new Timer(async (state) =>
|
||||||
@ -90,7 +90,7 @@ namespace NadekoBot.Services.Impl
|
|||||||
{
|
{
|
||||||
using (var content = new FormUrlEncodedContent(
|
using (var content = new FormUrlEncodedContent(
|
||||||
new Dictionary<string, string> {
|
new Dictionary<string, string> {
|
||||||
{ "servercount", this.client.GetGuildsCount().ToString() },
|
{ "servercount", this.client.GetGuildCount().ToString() },
|
||||||
{ "key", NadekoBot.Credentials.CarbonKey }}))
|
{ "key", NadekoBot.Credentials.CarbonKey }}))
|
||||||
{
|
{
|
||||||
content.Headers.Clear();
|
content.Headers.Clear();
|
||||||
@ -103,16 +103,24 @@ namespace NadekoBot.Services.Impl
|
|||||||
catch { }
|
catch { }
|
||||||
}, null, TimeSpan.FromHours(1), TimeSpan.FromHours(1));
|
}, null, TimeSpan.FromHours(1), TimeSpan.FromHours(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Initialize()
|
||||||
|
{
|
||||||
|
var guilds = this.client.GetGuilds();
|
||||||
|
_textChannels = guilds.Sum(g => g.Channels.Where(cx => cx is ITextChannel).Count());
|
||||||
|
_voiceChannels = guilds.Sum(g => g.Channels.Count) - _textChannels;
|
||||||
|
}
|
||||||
|
|
||||||
public Task<string> Print()
|
public Task<string> Print()
|
||||||
{
|
{
|
||||||
var curUser = client.CurrentUser();
|
var curUser = client.CurrentUser;
|
||||||
return Task.FromResult($@"
|
return Task.FromResult($@"
|
||||||
Author: [{Author}] | Library: [{Library}]
|
Author: [{Author}] | Library: [{Library}]
|
||||||
Bot Version: [{BotVersion}]
|
Bot Version: [{BotVersion}]
|
||||||
Bot ID: {curUser.Id}
|
Bot ID: {curUser.Id}
|
||||||
Owner ID(s): {string.Join(", ", NadekoBot.Credentials.OwnerIds)}
|
Owner ID(s): {string.Join(", ", NadekoBot.Credentials.OwnerIds)}
|
||||||
Uptime: {GetUptimeString()}
|
Uptime: {GetUptimeString()}
|
||||||
Servers: {client.GetGuildsCount()} | TextChannels: {TextChannels} | VoiceChannels: {VoiceChannels}
|
Servers: {client.GetGuildCount()} | TextChannels: {TextChannels} | VoiceChannels: {VoiceChannels}
|
||||||
Commands Ran this session: {CommandsRan}
|
Commands Ran this session: {CommandsRan}
|
||||||
Messages: {MessageCounter} [{MessagesPerSecond:F2}/sec] Heap: [{Heap} MB]");
|
Messages: {MessageCounter} [{MessagesPerSecond:F2}/sec] Heap: [{Heap} MB]");
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,8 @@ namespace NadekoBot
|
|||||||
client.MessageReceived += arg1 =>
|
client.MessageReceived += arg1 =>
|
||||||
{
|
{
|
||||||
if (arg1.Author == null || arg1.Author.IsBot)
|
if (arg1.Author == null || arg1.Author.IsBot)
|
||||||
return Task.CompletedTask; MessageReceived(arg1);
|
return Task.CompletedTask;
|
||||||
|
MessageReceived(arg1);
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
};
|
};
|
||||||
client.UserLeft += arg1 => { UserLeft(arg1); return Task.CompletedTask; };
|
client.UserLeft += arg1 => { UserLeft(arg1); return Task.CompletedTask; };
|
||||||
@ -107,7 +108,7 @@ namespace NadekoBot
|
|||||||
public DiscordSocketClient MainClient =>
|
public DiscordSocketClient MainClient =>
|
||||||
Clients[0];
|
Clients[0];
|
||||||
|
|
||||||
public SocketSelfUser CurrentUser() =>
|
public SocketSelfUser CurrentUser =>
|
||||||
Clients[0].CurrentUser;
|
Clients[0].CurrentUser;
|
||||||
|
|
||||||
public IEnumerable<SocketGuild> GetGuilds() =>
|
public IEnumerable<SocketGuild> GetGuilds() =>
|
||||||
@ -178,26 +179,9 @@ namespace NadekoBot
|
|||||||
public Task SetGame(string game) => Task.WhenAll(Clients.Select(ms => ms.SetGameAsync(game)));
|
public Task SetGame(string game) => Task.WhenAll(Clients.Select(ms => ms.SetGameAsync(game)));
|
||||||
|
|
||||||
|
|
||||||
public Task SetStream(string name, string url) => Task.WhenAll(Clients.Select(ms => ms.SetGameAsync(name, url, StreamType.NotStreaming)));
|
public Task SetStream(string name, string url) => Task.WhenAll(Clients.Select(ms => ms.SetGameAsync(name, url, StreamType.Twitch)));
|
||||||
|
|
||||||
public Task SetStatus(SettableUserStatus status) => Task.WhenAll(Clients.Select(ms => ms.SetStatusAsync(SettableUserStatusToUserStatus(status))));
|
//public Task SetStatus(SettableUserStatus status) => Task.WhenAll(Clients.Select(ms => ms.SetStatusAsync(SettableUserStatusToUserStatus(status))));
|
||||||
|
|
||||||
private static UserStatus SettableUserStatusToUserStatus(SettableUserStatus sus)
|
|
||||||
{
|
|
||||||
switch (sus)
|
|
||||||
{
|
|
||||||
case SettableUserStatus.Online:
|
|
||||||
return UserStatus.Online;
|
|
||||||
case SettableUserStatus.Invisible:
|
|
||||||
return UserStatus.Invisible;
|
|
||||||
case SettableUserStatus.Idle:
|
|
||||||
return UserStatus.AFK;
|
|
||||||
case SettableUserStatus.Dnd:
|
|
||||||
return UserStatus.DoNotDisturb;
|
|
||||||
}
|
|
||||||
|
|
||||||
return UserStatus.Online;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum SettableUserStatus
|
public enum SettableUserStatus
|
||||||
|
@ -24,10 +24,13 @@ namespace NadekoBot.Extensions
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// danny kamisama
|
/// danny kamisama
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static async Task SendPaginatedConfirmAsync(this IMessageChannel channel, int currentPage, Func<int, EmbedBuilder> pageFunc, int? lastPage = null)
|
public static async Task SendPaginatedConfirmAsync(this IMessageChannel channel, int currentPage, Func<int, EmbedBuilder> pageFunc, int? lastPage = null, bool addPaginatedFooter = true)
|
||||||
{
|
{
|
||||||
lastPage += 1;
|
lastPage += 1;
|
||||||
var embed = pageFunc(currentPage).AddPaginatedFooter(currentPage, lastPage);
|
var embed = pageFunc(currentPage);
|
||||||
|
|
||||||
|
if(addPaginatedFooter)
|
||||||
|
embed.AddPaginatedFooter(currentPage, lastPage);
|
||||||
|
|
||||||
var msg = await channel.EmbedAsync(embed) as IUserMessage;
|
var msg = await channel.EmbedAsync(embed) as IUserMessage;
|
||||||
|
|
||||||
@ -47,12 +50,20 @@ namespace NadekoBot.Extensions
|
|||||||
{
|
{
|
||||||
if (currentPage == 1)
|
if (currentPage == 1)
|
||||||
return;
|
return;
|
||||||
await msg.ModifyAsync(x => x.Embed = pageFunc(--currentPage).AddPaginatedFooter(currentPage, lastPage).Build()).ConfigureAwait(false);
|
var toSend = pageFunc(--currentPage);
|
||||||
|
if (addPaginatedFooter)
|
||||||
|
toSend.AddPaginatedFooter(currentPage, lastPage);
|
||||||
|
await msg.ModifyAsync(x => x.Embed = toSend.Build()).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else if (r.Emoji.Name == arrow_right)
|
else if (r.Emoji.Name == arrow_right)
|
||||||
{
|
{
|
||||||
if (lastPage == null || lastPage > currentPage)
|
if (lastPage == null || lastPage > currentPage)
|
||||||
await msg.ModifyAsync(x => x.Embed = pageFunc(++currentPage).AddPaginatedFooter(currentPage, lastPage).Build()).ConfigureAwait(false);
|
{
|
||||||
|
var toSend = pageFunc(++currentPage);
|
||||||
|
if (addPaginatedFooter)
|
||||||
|
toSend.AddPaginatedFooter(currentPage, lastPage);
|
||||||
|
await msg.ModifyAsync(x => x.Embed = toSend.Build()).ConfigureAwait(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex) { Console.WriteLine(ex); }
|
catch (Exception ex) { Console.WriteLine(ex); }
|
||||||
@ -192,7 +203,7 @@ namespace NadekoBot.Extensions
|
|||||||
await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(fileStream, fileName, caption, isTTS).ConfigureAwait(false);
|
await (await user.CreateDMChannelAsync().ConfigureAwait(false)).SendFileAsync(fileStream, fileName, caption, isTTS).ConfigureAwait(false);
|
||||||
|
|
||||||
public static bool IsAuthor(this IUserMessage msg) =>
|
public static bool IsAuthor(this IUserMessage msg) =>
|
||||||
NadekoBot.Client.CurrentUser().Id == msg.Author.Id;
|
NadekoBot.Client.CurrentUser.Id == msg.Author.Id;
|
||||||
|
|
||||||
public static IEnumerable<IUser> Members(this IRole role) =>
|
public static IEnumerable<IUser> Members(this IRole role) =>
|
||||||
role.Guild.GetUsersAsync().GetAwaiter().GetResult().Where(u => u.RoleIds.Contains(role.Id)) ?? Enumerable.Empty<IUser>();
|
role.Guild.GetUsersAsync().GetAwaiter().GetResult().Where(u => u.RoleIds.Contains(role.Id)) ?? Enumerable.Empty<IUser>();
|
||||||
|
Loading…
Reference in New Issue
Block a user