.vcrole and .vcrolelist added
This commit is contained in:
		
							
								
								
									
										1260
									
								
								src/NadekoBot/Migrations/20170311054632_vcrole.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										1260
									
								
								src/NadekoBot/Migrations/20170311054632_vcrole.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										45
									
								
								src/NadekoBot/Migrations/20170311054632_vcrole.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/NadekoBot/Migrations/20170311054632_vcrole.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
| { | ||||
|     public partial class vcrole : Migration | ||||
|     { | ||||
|         protected override void Up(MigrationBuilder migrationBuilder) | ||||
|         { | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "VcRoleInfo", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     Id = table.Column<int>(nullable: false) | ||||
|                         .Annotation("Sqlite:Autoincrement", true), | ||||
|                     DateAdded = table.Column<DateTime>(nullable: true), | ||||
|                     GuildConfigId = table.Column<int>(nullable: true), | ||||
|                     RoleId = table.Column<ulong>(nullable: false), | ||||
|                     VoiceChannelId = table.Column<ulong>(nullable: false) | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_VcRoleInfo", x => x.Id); | ||||
|                     table.ForeignKey( | ||||
|                         name: "FK_VcRoleInfo_GuildConfigs_GuildConfigId", | ||||
|                         column: x => x.GuildConfigId, | ||||
|                         principalTable: "GuildConfigs", | ||||
|                         principalColumn: "Id", | ||||
|                         onDelete: ReferentialAction.Restrict); | ||||
|                 }); | ||||
|  | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "IX_VcRoleInfo_GuildConfigId", | ||||
|                 table: "VcRoleInfo", | ||||
|                 column: "GuildConfigId"); | ||||
|         } | ||||
|  | ||||
|         protected override void Down(MigrationBuilder migrationBuilder) | ||||
|         { | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "VcRoleInfo"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -963,6 +963,26 @@ namespace NadekoBot.Migrations | ||||
|                     b.ToTable("PokeGame"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<DateTime?>("DateAdded"); | ||||
|  | ||||
|                     b.Property<int?>("GuildConfigId"); | ||||
|  | ||||
|                     b.Property<ulong>("RoleId"); | ||||
|  | ||||
|                     b.Property<ulong>("VoiceChannelId"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("GuildConfigId"); | ||||
|  | ||||
|                     b.ToTable("VcRoleInfo"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
| @@ -1196,6 +1216,13 @@ namespace NadekoBot.Migrations | ||||
|                         .HasForeignKey("GuildConfigId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") | ||||
|                         .WithMany("VcRoleInfos") | ||||
|                         .HasForeignKey("GuildConfigId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Affinity") | ||||
|   | ||||
							
								
								
									
										177
									
								
								src/NadekoBot/Modules/Administration/Commands/VcRoleCommands.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								src/NadekoBot/Modules/Administration/Commands/VcRoleCommands.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | ||||
| using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Linq; | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using NadekoBot.Attributes; | ||||
| using System.Threading.Tasks; | ||||
| using Discord.WebSocket; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database.Models; | ||||
|  | ||||
| namespace NadekoBot.Modules.Administration | ||||
| { | ||||
|     public partial class Administration | ||||
|     { | ||||
|         [Group] | ||||
|         public class VcRoleCommands : NadekoSubmodule | ||||
|         { | ||||
|             private static ConcurrentDictionary<ulong, ConcurrentDictionary<ulong, IRole>> vcRoles { get; } | ||||
|  | ||||
|             static VcRoleCommands() | ||||
|             { | ||||
|                 NadekoBot.Client.UserVoiceStateUpdated += ClientOnUserVoiceStateUpdated; | ||||
|                 vcRoles = new ConcurrentDictionary<ulong, ConcurrentDictionary<ulong, IRole>>(); | ||||
|                 foreach (var gconf in NadekoBot.AllGuildConfigs) | ||||
|                 { | ||||
|                     var g = NadekoBot.Client.GetGuild(gconf.GuildId); | ||||
|                     if (g == null) | ||||
|                         continue; //todo delete everything from db if guild doesn't exist? | ||||
|  | ||||
|                     var infos = new ConcurrentDictionary<ulong, IRole>(); | ||||
|                     vcRoles.TryAdd(gconf.GuildId, infos); | ||||
|                     foreach (var ri in gconf.VcRoleInfos) | ||||
|                     { | ||||
|                         var role = g.GetRole(ri.RoleId); | ||||
|                         if (role == null) | ||||
|                             continue; //todo remove this entry from db | ||||
|  | ||||
|                         infos.TryAdd(ri.VoiceChannelId, role); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             private static Task ClientOnUserVoiceStateUpdated(SocketUser usr, SocketVoiceState oldState, | ||||
|                 SocketVoiceState newState) | ||||
|             { | ||||
|  | ||||
|                 var gusr = usr as SocketGuildUser; | ||||
|                 if (gusr == null) | ||||
|                     return Task.CompletedTask; | ||||
|  | ||||
|                 var oldVc = oldState.VoiceChannel; | ||||
|                 var newVc = newState.VoiceChannel; | ||||
|                 var _ = Task.Run(async () => | ||||
|                 { | ||||
|                     try | ||||
|                     { | ||||
|                         if (oldVc != newVc) | ||||
|                         { | ||||
|                             ulong guildId; | ||||
|                             guildId = newVc?.Guild.Id ?? oldVc.Guild.Id; | ||||
|  | ||||
|                             ConcurrentDictionary<ulong, IRole> guildVcRoles; | ||||
|                             if (vcRoles.TryGetValue(guildId, out guildVcRoles)) | ||||
|                             { | ||||
|                                 IRole role; | ||||
|                                 //remove old | ||||
|                                 if (oldVc != null && guildVcRoles.TryGetValue(oldVc.Id, out role)) | ||||
|                                 { | ||||
|                                     if (gusr.RoleIds.Contains(role.Id)) | ||||
|                                     { | ||||
|                                         await gusr.RemoveRolesAsync(role).ConfigureAwait(false); | ||||
|                                         await Task.Delay(500).ConfigureAwait(false); | ||||
|                                     } | ||||
|                                 } | ||||
|                                 //add new | ||||
|                                 if (newVc != null && guildVcRoles.TryGetValue(newVc.Id, out role)) | ||||
|                                 { | ||||
|                                     if (!gusr.RoleIds.Contains(role.Id)) | ||||
|                                         await gusr.AddRolesAsync(role).ConfigureAwait(false); | ||||
|                                 } | ||||
|                                  | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                     catch (Exception ex) | ||||
|                     { | ||||
|                         Administration._log.Warn(ex); | ||||
|                     } | ||||
|                 }); | ||||
|                 return Task.CompletedTask; | ||||
|             } | ||||
|  | ||||
|             [NadekoCommand, Usage, Description, Aliases] | ||||
|             [RequireUserPermission(GuildPermission.ManageRoles)] | ||||
|             [RequireUserPermission(GuildPermission.ManageChannels)] | ||||
|             [RequireBotPermission(GuildPermission.ManageRoles)] | ||||
|             // todo wait for the fix [RequireBotPermission(GuildPermission.ManageChannels)] | ||||
|             [RequireContext(ContextType.Guild)] | ||||
|             public async Task VcRole([Remainder]IRole role = null) | ||||
|             { | ||||
|                 var user = (IGuildUser) Context.User; | ||||
|  | ||||
|                 var vc = user.VoiceChannel; | ||||
|  | ||||
|                 if (vc == null || vc.GuildId != user.GuildId) | ||||
|                 { | ||||
|                     await ReplyErrorLocalized("must_be_in_voice").ConfigureAwait(false); | ||||
|                     return; | ||||
|                 } | ||||
|  | ||||
|                 var guildVcRoles = vcRoles.GetOrAdd(user.GuildId, new ConcurrentDictionary<ulong, IRole>()); | ||||
|  | ||||
|                 if (role == null) | ||||
|                 { | ||||
|                     if (guildVcRoles.TryRemove(vc.Id, out role)) | ||||
|                     { | ||||
|                         await ReplyConfirmLocalized("vcrole_removed", Format.Bold(vc.Name)).ConfigureAwait(false); | ||||
|                         using (var uow = DbHandler.UnitOfWork()) | ||||
|                         { | ||||
|                             var conf = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.VcRoleInfos)); | ||||
|                             conf.VcRoleInfos.RemoveWhere(x => x.VoiceChannelId == vc.Id); | ||||
|                             uow.Complete(); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     guildVcRoles.AddOrUpdate(vc.Id, role, (key, old) => role); | ||||
|                     using (var uow = DbHandler.UnitOfWork()) | ||||
|                     { | ||||
|                         var conf = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.VcRoleInfos)); | ||||
|                         conf.VcRoleInfos.RemoveWhere(x => x.VoiceChannelId == vc.Id); // remove old one | ||||
|                         conf.VcRoleInfos.Add(new VcRoleInfo()  | ||||
|                         { | ||||
|                             VoiceChannelId = vc.Id, | ||||
|                             RoleId = role.Id, | ||||
|                         }); // add new one | ||||
|                         uow.Complete(); | ||||
|                     } | ||||
|                     await ReplyConfirmLocalized("vcrole_added", Format.Bold(vc.Name), Format.Bold(role.Name)).ConfigureAwait(false); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             [NadekoCommand, Usage, Description, Aliases] | ||||
|             [RequireContext(ContextType.Guild)] | ||||
|             public async Task VcRoleList() | ||||
|             { | ||||
|                 var guild = (SocketGuild) Context.Guild; | ||||
|                 string text; | ||||
|                 ConcurrentDictionary<ulong, IRole> roles; | ||||
|                 if (vcRoles.TryGetValue(Context.Guild.Id, out roles)) | ||||
|                 { | ||||
|                     if (!roles.Any()) | ||||
|                     { | ||||
|                         text = GetText("no_vcroles"); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         text = string.Join("\n", roles.Select(x => | ||||
|                             $"{Format.Bold(guild.GetVoiceChannel(x.Key)?.Name ?? x.Key.ToString())} => {x.Value}")); | ||||
|                     } | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     text = GetText("no_vcroles"); | ||||
|                 } | ||||
|                 await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor() | ||||
|                         .WithTitle(GetText("vc_role_list")) | ||||
|                         .WithDescription(text)) | ||||
|                     .ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										54
									
								
								src/NadekoBot/Resources/CommandStrings.Designer.cs
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										54
									
								
								src/NadekoBot/Resources/CommandStrings.Designer.cs
									
									
									
										generated
									
									
									
								
							| @@ -8645,6 +8645,60 @@ namespace NadekoBot.Resources { | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to vcrole. | ||||
|         /// </summary> | ||||
|         public static string vcrole_cmd { | ||||
|             get { | ||||
|                 return ResourceManager.GetString("vcrole_cmd", resourceCulture); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to Sets or resets a role which will be given to users who join the voice channel you're in when you run this command. Provide no role name to disable. You must be in a voice channel to run this command.. | ||||
|         /// </summary> | ||||
|         public static string vcrole_desc { | ||||
|             get { | ||||
|                 return ResourceManager.GetString("vcrole_desc", resourceCulture); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to `{0}vcrole SomeRole` or `{0}vcrole`. | ||||
|         /// </summary> | ||||
|         public static string vcrole_usage { | ||||
|             get { | ||||
|                 return ResourceManager.GetString("vcrole_usage", resourceCulture); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to vcrolelist. | ||||
|         /// </summary> | ||||
|         public static string vcrolelist_cmd { | ||||
|             get { | ||||
|                 return ResourceManager.GetString("vcrolelist_cmd", resourceCulture); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to Shows a list of currently set voice channel roles.. | ||||
|         /// </summary> | ||||
|         public static string vcrolelist_desc { | ||||
|             get { | ||||
|                 return ResourceManager.GetString("vcrolelist_desc", resourceCulture); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to `{0}vcrolelist`. | ||||
|         /// </summary> | ||||
|         public static string vcrolelist_usage { | ||||
|             get { | ||||
|                 return ResourceManager.GetString("vcrolelist_usage", resourceCulture); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to verbose v. | ||||
|         /// </summary> | ||||
|   | ||||
| @@ -3168,4 +3168,22 @@ | ||||
|   <data name="lucky7_usage" xml:space="preserve"> | ||||
|     <value>`{0}l7 10` or `{0}l7 move` or `{0}l7 s`</value> | ||||
|   </data> | ||||
|   <data name="vcrolelist_cmd" xml:space="preserve"> | ||||
|     <value>vcrolelist</value> | ||||
|   </data> | ||||
|   <data name="vcrolelist_desc" xml:space="preserve"> | ||||
|     <value>Shows a list of currently set voice channel roles.</value> | ||||
|   </data> | ||||
|   <data name="vcrolelist_usage" xml:space="preserve"> | ||||
|     <value>`{0}vcrolelist`</value> | ||||
|   </data> | ||||
|   <data name="vcrole_cmd" xml:space="preserve"> | ||||
|     <value>vcrole</value> | ||||
|   </data> | ||||
|   <data name="vcrole_desc" xml:space="preserve"> | ||||
|     <value>Sets or resets a role which will be given to users who join the voice channel you're in when you run this command. Provide no role name to disable. You must be in a voice channel to run this command.</value> | ||||
|   </data> | ||||
|   <data name="vcrole_usage" xml:space="preserve"> | ||||
|     <value>`{0}vcrole SomeRole` or `{0}vcrole`</value> | ||||
|   </data> | ||||
| </root> | ||||
							
								
								
									
										45
									
								
								src/NadekoBot/Resources/ResponseStrings.Designer.cs
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										45
									
								
								src/NadekoBot/Resources/ResponseStrings.Designer.cs
									
									
									
										generated
									
									
									
								
							| @@ -763,6 +763,15 @@ namespace NadekoBot.Resources { | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to You must be in a voice channel on this server.. | ||||
|         /// </summary> | ||||
|         public static string administration_must_be_in_voice { | ||||
|             get { | ||||
|                 return ResourceManager.GetString("administration_must_be_in_voice", resourceCulture); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to I don't have the permission necessary for that most likely.. | ||||
|         /// </summary> | ||||
| @@ -862,6 +871,15 @@ namespace NadekoBot.Resources { | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to There are no voice channel roles.. | ||||
|         /// </summary> | ||||
|         public static string administration_no_vcroles { | ||||
|             get { | ||||
|                 return ResourceManager.GetString("administration_no_vcroles", resourceCulture); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to Old message. | ||||
|         /// </summary> | ||||
| @@ -1657,6 +1675,33 @@ namespace NadekoBot.Resources { | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to Voice channel roles. | ||||
|         /// </summary> | ||||
|         public static string administration_vc_role_list { | ||||
|             get { | ||||
|                 return ResourceManager.GetString("administration_vc_role_list", resourceCulture); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to Users who join {0} voice channel will get {1} role.. | ||||
|         /// </summary> | ||||
|         public static string administration_vcrole_added { | ||||
|             get { | ||||
|                 return ResourceManager.GetString("administration_vcrole_added", resourceCulture); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to Users who join {0} voice channel will no longer get a role.. | ||||
|         /// </summary> | ||||
|         public static string administration_vcrole_removed { | ||||
|             get { | ||||
|                 return ResourceManager.GetString("administration_vcrole_removed", resourceCulture); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         ///    Looks up a localized string similar to Voice channel created. | ||||
|         /// </summary> | ||||
|   | ||||
| @@ -2230,7 +2230,22 @@ Owner ID: {2}</value> | ||||
|   <data name="gambling_page" xml:space="preserve"> | ||||
|     <value>page {0}</value> | ||||
|   </data> | ||||
|   <data name="administration_must_be_in_voice" xml:space="preserve"> | ||||
|     <value>You must be in a voice channel on this server.</value> | ||||
|   </data> | ||||
|   <data name="administration_no_vcroles" xml:space="preserve"> | ||||
|     <value>There are no voice channel roles.</value> | ||||
|   </data> | ||||
|   <data name="administration_user_muted_time" xml:space="preserve"> | ||||
|     <value>{0} has been **muted** from text and voice chat for {1} minutes.</value> | ||||
|   </data> | ||||
|   <data name="administration_vcrole_added" xml:space="preserve"> | ||||
|     <value>Users who join {0} voice channel will get {1} role.</value> | ||||
|   </data> | ||||
|   <data name="administration_vcrole_removed" xml:space="preserve"> | ||||
|     <value>Users who join {0} voice channel will no longer get a role.</value> | ||||
|   </data> | ||||
|   <data name="administration_vc_role_list" xml:space="preserve"> | ||||
|     <value>Voice channel roles</value> | ||||
|   </data> | ||||
| </root> | ||||
| @@ -70,10 +70,17 @@ namespace NadekoBot.Services.Database.Models | ||||
|         public string TimeZoneId { get; set; } = null; | ||||
|  | ||||
|         public HashSet<UnmuteTimer> UnmuteTimers { get; set; } = new HashSet<UnmuteTimer>(); | ||||
|         public HashSet<VcRoleInfo> VcRoleInfos { get; set; } | ||||
|  | ||||
|         //public List<ProtectionIgnoredChannel> ProtectionIgnoredChannels { get; set; } = new List<ProtectionIgnoredChannel>(); | ||||
|     } | ||||
|  | ||||
|     public class VcRoleInfo : DbEntity | ||||
|     { | ||||
|         public ulong VoiceChannelId { get; set; } | ||||
|         public ulong RoleId { get; set; } | ||||
|     } | ||||
|  | ||||
|     public class UnmuteTimer : DbEntity | ||||
|     { | ||||
|         public ulong UserId { get; set; } | ||||
|   | ||||
| @@ -17,6 +17,7 @@ namespace NadekoBot.Services.Database.Repositories.Impl | ||||
|                     .ThenInclude(ls => ls.IgnoredChannels) | ||||
|                 .Include(gc => gc.MutedUsers) | ||||
|                 .Include(gc => gc.UnmuteTimers) | ||||
|                 .Include(gc => gc.VcRoleInfos) | ||||
|                 .Include(gc => gc.GenerateCurrencyChannelIds) | ||||
|                 .Include(gc => gc.FilterInvitesChannelIds) | ||||
|                 .Include(gc => gc.FilterWordsChannelIds) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user