ShardedDiscordClient Implemented. I'm not feeling well
This commit is contained in:
		
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -31,4 +31,5 @@ src/NadekoBot/project.lock.json | |||||||
| NadekoBot.sln.iml | NadekoBot.sln.iml | ||||||
| .idea/workspace.xml | .idea/workspace.xml | ||||||
| .idea/vcs.xml | .idea/vcs.xml | ||||||
| .idea/modules.xml | .idea/modules.xml | ||||||
|  | src/tests/bin | ||||||
| @@ -22,7 +22,7 @@ namespace NadekoBot.Modules.Administration | |||||||
|     [NadekoModule("Administration", ".")] |     [NadekoModule("Administration", ".")] | ||||||
|     public partial class Administration : DiscordModule |     public partial class Administration : DiscordModule | ||||||
|     { |     { | ||||||
|         public Administration(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) |         public Administration(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) | ||||||
|         { |         { | ||||||
|             NadekoBot.CommandHandler.CommandExecuted += DelMsgOnCmd_Handler; |             NadekoBot.CommandHandler.CommandExecuted += DelMsgOnCmd_Handler; | ||||||
|         } |         } | ||||||
| @@ -614,7 +614,7 @@ namespace NadekoBot.Modules.Administration | |||||||
|         { |         { | ||||||
|             var channel = (ITextChannel)umsg.Channel; |             var channel = (ITextChannel)umsg.Channel; | ||||||
|  |  | ||||||
|             foreach (var ch in (await _client.GetGuildsAsync().ConfigureAwait(false)).Select(async g => await g.GetDefaultChannelAsync().ConfigureAwait(false))) |             foreach (var ch in _client.GetGuilds().Select(async g => await g.GetDefaultChannelAsync().ConfigureAwait(false))) | ||||||
|             { |             { | ||||||
|                 await channel.SendMessageAsync(message).ConfigureAwait(false); |                 await channel.SendMessageAsync(message).ConfigureAwait(false); | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ namespace NadekoBot.Modules.Administration | |||||||
|         [Group] |         [Group] | ||||||
|         public class LogCommands |         public class LogCommands | ||||||
|         { |         { | ||||||
|             private DiscordSocketClient _client { get; } |             private ShardedDiscordClient _client { get; } | ||||||
|             private Logger _log { get; } |             private Logger _log { get; } | ||||||
|  |  | ||||||
|             private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】"; |             private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】"; | ||||||
| @@ -33,7 +33,7 @@ namespace NadekoBot.Modules.Administration | |||||||
|             private Timer t; |             private Timer t; | ||||||
|             private IGoogleApiService _google { get; } |             private IGoogleApiService _google { get; } | ||||||
|  |  | ||||||
|             public LogCommands(DiscordSocketClient client, IGoogleApiService google) |             public LogCommands(ShardedDiscordClient client, IGoogleApiService google) | ||||||
|             { |             { | ||||||
|                 _client = client; |                 _client = client; | ||||||
|                 _google = google; |                 _google = google; | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ namespace NadekoBot.Modules.Administration | |||||||
|         { |         { | ||||||
|             public static ConcurrentDictionary<ulong, Ratelimiter> RatelimitingChannels = new ConcurrentDictionary<ulong, Ratelimiter>(); |             public static ConcurrentDictionary<ulong, Ratelimiter> RatelimitingChannels = new ConcurrentDictionary<ulong, Ratelimiter>(); | ||||||
|  |  | ||||||
|             private DiscordSocketClient _client { get; } |             private ShardedDiscordClient _client { get; } | ||||||
|  |  | ||||||
|             public class Ratelimiter |             public class Ratelimiter | ||||||
|             { |             { | ||||||
|   | |||||||
| @@ -12,9 +12,9 @@ namespace NadekoBot.Modules.Administration | |||||||
|         [Group] |         [Group] | ||||||
|         class SelfCommands |         class SelfCommands | ||||||
|         { |         { | ||||||
|             private DiscordSocketClient _client; |             private ShardedDiscordClient _client; | ||||||
|  |  | ||||||
|             public SelfCommands(DiscordSocketClient client) |             public SelfCommands(ShardedDiscordClient client) | ||||||
|             { |             { | ||||||
|                 this._client = client; |                 this._client = client; | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ namespace NadekoBot.Modules.ClashOfClans | |||||||
|     { |     { | ||||||
|         public static ConcurrentDictionary<ulong, List<ClashWar>> ClashWars { get; set; } = new ConcurrentDictionary<ulong, List<ClashWar>>(); |         public static ConcurrentDictionary<ulong, List<ClashWar>> ClashWars { get; set; } = new ConcurrentDictionary<ulong, List<ClashWar>>(); | ||||||
|  |  | ||||||
|         public ClashOfClans(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) |         public ClashOfClans(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) | ||||||
|         { |         { | ||||||
|             using (var uow = DbHandler.UnitOfWork()) |             using (var uow = DbHandler.UnitOfWork()) | ||||||
|             { |             { | ||||||
|   | |||||||
| @@ -10,11 +10,11 @@ namespace NadekoBot.Modules | |||||||
|     { |     { | ||||||
|         protected ILocalization _l { get; } |         protected ILocalization _l { get; } | ||||||
|         protected CommandService _commands { get; } |         protected CommandService _commands { get; } | ||||||
|         protected DiscordSocketClient _client { get; } |         protected ShardedDiscordClient  _client { get; } | ||||||
|         protected Logger _log { get; } |         protected Logger _log { get; } | ||||||
|         private string _prefix { get; } |         private string _prefix { get; } | ||||||
|  |  | ||||||
|         public DiscordModule(ILocalization loc, CommandService cmds, DiscordSocketClient client) |         public DiscordModule(ILocalization loc, CommandService cmds, ShardedDiscordClient client) | ||||||
|         { |         { | ||||||
|             string prefix; |             string prefix; | ||||||
|             if (NadekoBot.ModulePrefixes.TryGetValue(this.GetType().Name, out prefix)) |             if (NadekoBot.ModulePrefixes.TryGetValue(this.GetType().Name, out prefix)) | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ namespace NadekoBot.Modules.Gambling | |||||||
|         public static string CurrencyPluralName { get; set; } |         public static string CurrencyPluralName { get; set; } | ||||||
|         public static string CurrencySign { get; set; } |         public static string CurrencySign { get; set; } | ||||||
|          |          | ||||||
|         public Gambling(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) |         public Gambling(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) | ||||||
|         { |         { | ||||||
|             using (var uow = DbHandler.UnitOfWork()) |             using (var uow = DbHandler.UnitOfWork()) | ||||||
|             { |             { | ||||||
|   | |||||||
| @@ -111,7 +111,7 @@ namespace NadekoBot.Modules.Games.Trivia | |||||||
|                 { |                 { | ||||||
|                     if (!(umsg.Channel is IGuildChannel && umsg.Channel is ITextChannel)) return; |                     if (!(umsg.Channel is IGuildChannel && umsg.Channel is ITextChannel)) return; | ||||||
|                     if ((umsg.Channel as ITextChannel).Guild != guild) return; |                     if ((umsg.Channel as ITextChannel).Guild != guild) return; | ||||||
|                     if (umsg.Author.Id == (await NadekoBot.Client.GetCurrentUserAsync()).Id) return; |                     if (umsg.Author.Id == NadekoBot.Client.GetCurrentUser().Id) return; | ||||||
|  |  | ||||||
|                     var guildUser = umsg.Author as IGuildUser; |                     var guildUser = umsg.Author as IGuildUser; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ namespace NadekoBot.Modules.Games | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         public Games(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) |         public Games(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) | ||||||
|         { |         { | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -97,7 +97,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 = $"{(await NadekoBot.Client.GetCurrentUserAsync()).Mention} won! :{GetRPSPick(nadekoPick)}: beats :{GetRPSPick(pick)}:"; |                 msg = $"{NadekoBot.Client.GetCurrentUser().Mention} won! :{GetRPSPick(nadekoPick)}: beats :{GetRPSPick(pick)}:"; | ||||||
|             else |             else | ||||||
|                 msg = $"{umsg.Author.Mention} won! :{GetRPSPick(pick)}: beats :{GetRPSPick(nadekoPick)}:"; |                 msg = $"{umsg.Author.Mention} won! :{GetRPSPick(pick)}: beats :{GetRPSPick(nadekoPick)}:"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ namespace NadekoBot.Modules.Help | |||||||
|                 return str + String.Format(str, NadekoBot.Credentials.ClientId); |                 return str + String.Format(str, NadekoBot.Credentials.ClientId); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         public Help(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) |         public Help(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) | ||||||
|         { |         { | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -99,7 +99,7 @@ namespace NadekoBot.Modules.Help | |||||||
|         [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] |         [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] | ||||||
|         [RequireContext(ContextType.Guild)] |         [RequireContext(ContextType.Guild)] | ||||||
|         [OwnerOnly] |         [OwnerOnly] | ||||||
|         public async Task Hgit(IUserMessage umsg) |         public Task Hgit(IUserMessage umsg) | ||||||
|         { |         { | ||||||
|             var helpstr = new StringBuilder(); |             var helpstr = new StringBuilder(); | ||||||
|  |  | ||||||
| @@ -115,12 +115,13 @@ namespace NadekoBot.Modules.Help | |||||||
|                 } |                 } | ||||||
|                 helpstr.AppendLine($"`{com.Text}` {string.Join(" ", com.Aliases.Skip(1).Select(a=>"`"+a+"`"))} | {com.Remarks} | {com.Summary}"); |                 helpstr.AppendLine($"`{com.Text}` {string.Join(" ", com.Aliases.Skip(1).Select(a=>"`"+a+"`"))} | {com.Remarks} | {com.Summary}"); | ||||||
|             } |             } | ||||||
|             helpstr = helpstr.Replace((await NadekoBot.Client.GetCurrentUserAsync()).Username , "@BotName"); |             helpstr = helpstr.Replace(NadekoBot.Client.GetCurrentUser().Username , "@BotName"); | ||||||
| #if DEBUG | #if DEBUG | ||||||
|             File.WriteAllText("../../../../../docs/Commands List.md", helpstr.ToString()); |             File.WriteAllText("../../../../../docs/Commands List.md", helpstr.ToString()); | ||||||
| #else | #else | ||||||
|             File.WriteAllText("commandlist.md", helpstr.ToString()); |             File.WriteAllText("commandlist.md", helpstr.ToString()); | ||||||
| #endif | #endif | ||||||
|  |             return Task.CompletedTask; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] |         [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ namespace NadekoBot.Modules.Music | |||||||
|         public const string MusicDataPath = "data/musicdata"; |         public const string MusicDataPath = "data/musicdata"; | ||||||
|         private IGoogleApiService _google; |         private IGoogleApiService _google; | ||||||
|  |  | ||||||
|         public Music(ILocalization loc, CommandService cmds, DiscordSocketClient client, IGoogleApiService google) : base(loc, cmds, client) |         public Music(ILocalization loc, CommandService cmds, ShardedDiscordClient client, IGoogleApiService google) : base(loc, cmds, client) | ||||||
|         { |         { | ||||||
|             //it can fail if its currenctly opened or doesn't exist. Either way i don't care |             //it can fail if its currenctly opened or doesn't exist. Either way i don't care | ||||||
|             try { Directory.Delete(MusicDataPath, true); } catch { } |             try { Directory.Delete(MusicDataPath, true); } catch { } | ||||||
| @@ -520,16 +520,33 @@ namespace NadekoBot.Modules.Music | |||||||
|             await channel.SendMessageAsync($"🎵🔁`Repeat playlist {(currentValue ? "enabled" : "disabled")}`").ConfigureAwait(false); |             await channel.SendMessageAsync($"🎵🔁`Repeat playlist {(currentValue ? "enabled" : "disabled")}`").ConfigureAwait(false); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         /// |         //[LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] | ||||||
|         //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] |  | ||||||
|         //[RequireContext(ContextType.Guild)] |         //[RequireContext(ContextType.Guild)] | ||||||
|         //public async Task Save(IUserMessage umsg, [Remainder] string name) |         //public async Task Save(IUserMessage umsg, [Remainder] string name) | ||||||
|         //{ |         //{ | ||||||
|         //    var channel = (ITextChannel)umsg.Channel; |         //    var channel = (ITextChannel)umsg.Channel; | ||||||
|  |         //    MusicPlayer musicPlayer; | ||||||
|  |         //    if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) | ||||||
|  |         //        return; | ||||||
|  |  | ||||||
|  |         //    var curSong = musicPlayer.CurrentSong; | ||||||
|  |         //    var items = musicPlayer.Playlist.Append(curSong); | ||||||
|  |  | ||||||
|  |         //    MusicPlaylist playlist; | ||||||
|  |         //    using (var uow = DbHandler.UnitOfWork()) | ||||||
|  |         //    { | ||||||
|  |         //        playlist = new MusicPlaylist | ||||||
|  |         //        { | ||||||
|  |         //            Name = name, | ||||||
|  |         //            Songs = items.ToList() | ||||||
|  |         //        }; | ||||||
|  |         //        uow.MusicPlaylists.Add(playlist); | ||||||
|  |         //    } | ||||||
|  |  | ||||||
|  |         //    await channel.SendMessageAsync($"Playlist saved as {name}, id: {playlist.Id}."); | ||||||
|         //} |         //} | ||||||
|  |  | ||||||
|         //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] |         //[LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] | ||||||
|         //[RequireContext(ContextType.Guild)] |         //[RequireContext(ContextType.Guild)] | ||||||
|         //public async Task Load(IUserMessage umsg, [Remainder] string name) |         //public async Task Load(IUserMessage umsg, [Remainder] string name) | ||||||
|         //{ |         //{ | ||||||
| @@ -537,7 +554,7 @@ namespace NadekoBot.Modules.Music | |||||||
|  |  | ||||||
|         //} |         //} | ||||||
|  |  | ||||||
|         //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] |         //[LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] | ||||||
|         //[RequireContext(ContextType.Guild)] |         //[RequireContext(ContextType.Guild)] | ||||||
|         //public async Task Playlists(IUserMessage umsg, [Remainder] string num) |         //public async Task Playlists(IUserMessage umsg, [Remainder] string num) | ||||||
|         //{ |         //{ | ||||||
| @@ -545,7 +562,7 @@ namespace NadekoBot.Modules.Music | |||||||
|  |  | ||||||
|         //} |         //} | ||||||
|  |  | ||||||
|         //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] |         //[LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] | ||||||
|         //[RequireContext(ContextType.Guild)] |         //[RequireContext(ContextType.Guild)] | ||||||
|         //public async Task DeletePlaylist(IUserMessage umsg, [Remainder] string pl) |         //public async Task DeletePlaylist(IUserMessage umsg, [Remainder] string pl) | ||||||
|         //{ |         //{ | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ namespace NadekoBot.Modules.NSFW | |||||||
|     [NadekoModule("NSFW", "~")] |     [NadekoModule("NSFW", "~")] | ||||||
|     public class NSFW : DiscordModule |     public class NSFW : DiscordModule | ||||||
|     { |     { | ||||||
|         public NSFW(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) |         public NSFW(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) | ||||||
|         { |         { | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ namespace NadekoBot.Modules.Permissions | |||||||
|     [NadekoModule("Permissions", ";")] |     [NadekoModule("Permissions", ";")] | ||||||
|     public class Permissions : DiscordModule |     public class Permissions : DiscordModule | ||||||
|     { |     { | ||||||
|         public Permissions(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) |         public Permissions(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) | ||||||
|         { |         { | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ namespace NadekoBot.Modules.Games | |||||||
|     [Module(">", AppendSpace = false)] |     [Module(">", AppendSpace = false)] | ||||||
|     public partial class Pokemon : DiscordModule |     public partial class Pokemon : DiscordModule | ||||||
|     { |     { | ||||||
|         public Pokemon(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) |         public Pokemon(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) | ||||||
|         { |         { | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ namespace NadekoBot.Modules.Searches | |||||||
|     { |     { | ||||||
|         private IGoogleApiService _google { get; } |         private IGoogleApiService _google { get; } | ||||||
|  |  | ||||||
|         public Searches(ILocalization loc, CommandService cmds, DiscordSocketClient client, IGoogleApiService youtube) : base(loc, cmds, client) |         public Searches(ILocalization loc, CommandService cmds, ShardedDiscordClient client, IGoogleApiService youtube) : base(loc, cmds, client) | ||||||
|         { |         { | ||||||
|             _google = youtube; |             _google = youtube; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ namespace NadekoBot.Modules.Translator | |||||||
|     [NadekoModule("Translator", "~")] |     [NadekoModule("Translator", "~")] | ||||||
|     public class Translator : DiscordModule |     public class Translator : DiscordModule | ||||||
|     { |     { | ||||||
|         public Translator(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) |         public Translator(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) | ||||||
|         { |         { | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ namespace NadekoBot.Modules.Utility | |||||||
|     [NadekoModule("Utility", ".")] |     [NadekoModule("Utility", ".")] | ||||||
|     public partial class Utility : DiscordModule |     public partial class Utility : DiscordModule | ||||||
|     { |     { | ||||||
|         public Utility(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) |         public Utility(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) | ||||||
|         { |         { | ||||||
|  |  | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -26,7 +26,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 DiscordSocketClient Client { get; private set; } |         public static ShardedDiscordClient  Client { get; private set; } | ||||||
|         public static Localization Localizer { get; private set; } |         public static Localization Localizer { get; private set; } | ||||||
|         public static BotCredentials Credentials { get; private set; } |         public static BotCredentials Credentials { get; private set; } | ||||||
|  |  | ||||||
| @@ -43,7 +43,7 @@ namespace NadekoBot | |||||||
|             _log.Info("Starting NadekoBot v" + typeof(NadekoBot).GetTypeInfo().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion); |             _log.Info("Starting NadekoBot v" + typeof(NadekoBot).GetTypeInfo().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion); | ||||||
|  |  | ||||||
|             //create client |             //create client | ||||||
|             Client = new DiscordSocketClient(new DiscordSocketConfig |             Client = new ShardedDiscordClient (new DiscordSocketConfig | ||||||
|             { |             { | ||||||
|                 AudioMode = Discord.Audio.AudioMode.Outgoing, |                 AudioMode = Discord.Audio.AudioMode.Outgoing, | ||||||
|                 MessageCacheSize = 10, |                 MessageCacheSize = 10, | ||||||
| @@ -61,7 +61,7 @@ namespace NadekoBot | |||||||
|             //setup DI |             //setup DI | ||||||
|             var depMap = new DependencyMap(); |             var depMap = new DependencyMap(); | ||||||
|             depMap.Add<ILocalization>(Localizer); |             depMap.Add<ILocalization>(Localizer); | ||||||
|             depMap.Add<DiscordSocketClient>(Client); |             depMap.Add<ShardedDiscordClient >(Client); | ||||||
|             depMap.Add<CommandService>(CommandService); |             depMap.Add<CommandService>(CommandService); | ||||||
|             depMap.Add<IGoogleApiService>(Google); |             depMap.Add<IGoogleApiService>(Google); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,13 +18,13 @@ namespace NadekoBot.Services | |||||||
| { | { | ||||||
|     public class CommandHandler |     public class CommandHandler | ||||||
|     { |     { | ||||||
|         private DiscordSocketClient _client; |         private ShardedDiscordClient  _client; | ||||||
|         private CommandService _commandService; |         private CommandService _commandService; | ||||||
|         private Logger _log; |         private Logger _log; | ||||||
|  |  | ||||||
|         public event EventHandler<CommandExecutedEventArgs> CommandExecuted = delegate { }; |         public event EventHandler<CommandExecutedEventArgs> CommandExecuted = delegate { }; | ||||||
|  |  | ||||||
|         public CommandHandler(DiscordSocketClient client, CommandService commandService) |         public CommandHandler(ShardedDiscordClient client, CommandService commandService) | ||||||
|         { |         { | ||||||
|             _client = client; |             _client = client; | ||||||
|             _commandService = commandService; |             _commandService = commandService; | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ namespace NadekoBot.Services.Impl | |||||||
|     public class StatsService : IStatsService |     public class StatsService : IStatsService | ||||||
|     { |     { | ||||||
|         private int messageCounter; |         private int messageCounter; | ||||||
|         private DiscordSocketClient client; |         private ShardedDiscordClient  client; | ||||||
|         private DateTime started; |         private DateTime started; | ||||||
|         private int commandsRan = 0; |         private int commandsRan = 0; | ||||||
|  |  | ||||||
| @@ -22,7 +22,7 @@ namespace NadekoBot.Services.Impl | |||||||
|         public string Heap => Math.Round((double)GC.GetTotalMemory(false) / 1.MiB(), 2).ToString(); |         public string Heap => Math.Round((double)GC.GetTotalMemory(false) / 1.MiB(), 2).ToString(); | ||||||
|  |  | ||||||
|  |  | ||||||
|         public StatsService(DiscordSocketClient client, CommandHandler cmdHandler) |         public StatsService(ShardedDiscordClient  client, CommandHandler cmdHandler) | ||||||
|         { |         { | ||||||
|  |  | ||||||
|             this.client = client; |             this.client = client; | ||||||
| @@ -33,14 +33,18 @@ namespace NadekoBot.Services.Impl | |||||||
|  |  | ||||||
|             this.client.Disconnected += _ => Reset(); |             this.client.Disconnected += _ => Reset(); | ||||||
|         } |         } | ||||||
|         public Task<string> Print() => Task.FromResult($@"`Author: Kwoth` `Library: Discord.Net` |         public Task<string> Print() | ||||||
|  |         { | ||||||
|  |             var curUser = client.GetCurrentUser(); | ||||||
|  |             return Task.FromResult($@"`Author: Kwoth` `Library: Discord.Net` | ||||||
| `Bot Version: {BotVersion}` | `Bot Version: {BotVersion}` | ||||||
| `Bot id: {(client.GetCurrentUser()).Id}` | `Bot id: {curUser.Id}` | ||||||
| `Owners' Ids: {string.Join(", ", NadekoBot.Credentials.OwnerIds)}` | `Owners' Ids: {string.Join(", ", NadekoBot.Credentials.OwnerIds)}` | ||||||
| `Uptime: {GetUptimeString()}` | `Uptime: {GetUptimeString()}` | ||||||
| `Servers: {client.GetGuilds().Count} | TextChannels: {client.GetGuilds().SelectMany(g => g.GetChannels().Where(c => c is ITextChannel)).Count()} | VoiceChannels: {client.GetGuilds().SelectMany(g => g.GetChannels().Where(c => c is IVoiceChannel)).Count()}` | `Servers: {client.GetGuilds().Count} | TextChannels: {client.GetGuilds().SelectMany(g => g.GetChannels().Where(c => c is ITextChannel)).Count()} | VoiceChannels: {client.GetGuilds().SelectMany(g => g.GetChannels().Where(c => c is IVoiceChannel)).Count()}` | ||||||
| `Commands Ran this session: {commandsRan}` | `Commands Ran this session: {commandsRan}` | ||||||
| `Messages: {messageCounter} ({messageCounter / (double)GetUptime().TotalSeconds:F2}/sec)` `Heap: {Heap} MB`"); | `Messages: {messageCounter} ({messageCounter / (double)GetUptime().TotalSeconds:F2}/sec)` `Heap: {Heap} MB`"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         public Task Reset() |         public Task Reset() | ||||||
|         { |         { | ||||||
|   | |||||||
							
								
								
									
										83
									
								
								src/NadekoBot/ShardedDiscordClient.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								src/NadekoBot/ShardedDiscordClient.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | |||||||
|  | using Discord; | ||||||
|  | using Discord.WebSocket; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using Discord.API; | ||||||
|  | using Discord.Logging; | ||||||
|  | using System.IO; | ||||||
|  |  | ||||||
|  | namespace NadekoBot | ||||||
|  | { | ||||||
|  |     public class ShardedDiscordClient  | ||||||
|  |     { | ||||||
|  |         private DiscordSocketConfig discordSocketConfig; | ||||||
|  |  | ||||||
|  |         public Func<IGuildUser, Task> UserJoined { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |         public Func<IMessage, Task> MessageReceived { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |         public Func<IGuildUser, Task> UserLeft { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |         public Func<IGuildUser, IGuildUser, Task> UserUpdated { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |         public Func<Optional<IMessage>, IMessage, Task> MessageUpdated { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |         public Func<ulong, Optional<IMessage>, Task> MessageDeleted { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |         public Func<IUser, IGuild, Task> UserBanned { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |         public Func<IUser, IGuild, Task> UserUnbanned { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |         public Func<IGuildUser, IPresence, IPresence, Task> UserPresenceUpdated { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |         public Func<IUser, IVoiceState, IVoiceState, Task> UserVoiceStateUpdated { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |         public Func<IChannel, Task> ChannelCreated { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |         public Func<IChannel, Task> ChannelDestroyed { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |         public Func<IChannel, IChannel, Task> ChannelUpdated { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |         public Func<Exception, Task> Disconnected { get; internal set; } = delegate { return Task.CompletedTask; }; | ||||||
|  |  | ||||||
|  |         private IReadOnlyList<DiscordSocketClient> Clients { get; } | ||||||
|  |  | ||||||
|  |         public ShardedDiscordClient (DiscordSocketConfig discordSocketConfig) | ||||||
|  |         { | ||||||
|  |             this.discordSocketConfig = discordSocketConfig; | ||||||
|  |  | ||||||
|  |             var clientList = new List<DiscordSocketClient>(); | ||||||
|  |             for (int i = 0; i < discordSocketConfig.TotalShards; i++) | ||||||
|  |             { | ||||||
|  |                 discordSocketConfig.ShardId = i; | ||||||
|  |                 var client = new DiscordSocketClient(discordSocketConfig); | ||||||
|  |                 clientList.Add(client); | ||||||
|  |                 client.UserJoined += async arg1 => await UserJoined(arg1); | ||||||
|  |                 client.MessageReceived += async arg1 => await MessageReceived(arg1); | ||||||
|  |                 client.UserLeft += async arg1 => await UserLeft(arg1); | ||||||
|  |                 client.UserUpdated += async (arg1, gu2) => await UserUpdated(arg1, gu2); | ||||||
|  |                 client.MessageUpdated += async (arg1, m2) => await MessageUpdated(arg1, m2); | ||||||
|  |                 client.MessageDeleted += async (arg1, arg2) => await MessageDeleted(arg1, arg2); | ||||||
|  |                 client.UserBanned += async (arg1, arg2) => await UserBanned(arg1, arg2); | ||||||
|  |                 client.UserPresenceUpdated += async (arg1, arg2, arg3) => await UserPresenceUpdated(arg1, arg2, arg3); | ||||||
|  |                 client.UserVoiceStateUpdated += async (arg1, arg2, arg3) => await UserVoiceStateUpdated(arg1, arg2, arg3); | ||||||
|  |                 client.ChannelCreated += async arg => await ChannelCreated(arg); | ||||||
|  |                 client.ChannelDestroyed += async arg => await ChannelDestroyed(arg); | ||||||
|  |                 client.ChannelUpdated += async (arg1, arg2) => await ChannelUpdated(arg1, arg2); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             Clients = clientList.AsReadOnly(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public ISelfUser GetCurrentUser() =>  | ||||||
|  |             Clients.Select(c => c.GetCurrentUser()).FirstOrDefault(u => u != null); | ||||||
|  |  | ||||||
|  |         public IReadOnlyCollection<IGuild> GetGuilds() => | ||||||
|  |             Clients.SelectMany(c => c.GetGuilds()).ToArray(); | ||||||
|  |  | ||||||
|  |         public IGuild GetGuild(ulong id) => | ||||||
|  |             Clients.Select(c => c.GetGuild(id)).FirstOrDefault(g => g != null); | ||||||
|  |  | ||||||
|  |         public Task<IDMChannel> GetDMChannelAsync(ulong channelId) => | ||||||
|  |             Clients.Select(async c => await c.GetDMChannelAsync(channelId).ConfigureAwait(false)).FirstOrDefault(c => c != null); | ||||||
|  |  | ||||||
|  |         internal Task LoginAsync(TokenType tokenType, string token) => | ||||||
|  |             Task.WhenAll(Clients.Select(c => c.LoginAsync(tokenType, token))); | ||||||
|  |  | ||||||
|  |         internal Task ConnectAsync() => | ||||||
|  |             Task.WhenAll(Clients.Select(c => c.ConnectAsync())); | ||||||
|  |  | ||||||
|  |         internal Task DownloadAllUsersAsync() => | ||||||
|  |             Task.WhenAll(Clients.Select(c => c.DownloadAllUsersAsync())); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user