From 6ebe321de9deacd4a52e402891cc80cb75814d2d Mon Sep 17 00:00:00 2001 From: Kwoth Date: Tue, 17 Oct 2023 18:44:47 +0000 Subject: [PATCH 1/3] Shouldn't be able to apply to clubs while in a club anymore. Fixes #423 --- src/NadekoBot/Modules/Xp/Club/ClubService.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/NadekoBot/Modules/Xp/Club/ClubService.cs b/src/NadekoBot/Modules/Xp/Club/ClubService.cs index d90b7ac17..85ecaee1d 100644 --- a/src/NadekoBot/Modules/Xp/Club/ClubService.cs +++ b/src/NadekoBot/Modules/Xp/Club/ClubService.cs @@ -19,7 +19,6 @@ public class ClubService : INService, IClubService _httpFactory = httpFactory; } - public async Task CreateClubAsync(IUser user, string clubName) { //must be lvl 5 and must not be in a club already @@ -140,7 +139,7 @@ public class ClubService : INService, IClubService //user banned or a member of a club, or already applied, // or doesn't min minumum level requirement, can't apply - if (du.Club is not null) + if (du.ClubId is not null) return ClubApplyResult.AlreadyInAClub; if (club.Bans.Any(x => x.UserId == du.Id)) From 82a48b101b671e9aa29b7a5586801dafd47aba54 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Tue, 17 Oct 2023 18:57:17 +0000 Subject: [PATCH 2/3] Fix for langset ts-ts, closes #419 --- src/NadekoBot/Modules/Administration/LocalizationCommands.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/NadekoBot/Modules/Administration/LocalizationCommands.cs b/src/NadekoBot/Modules/Administration/LocalizationCommands.cs index 8890811de..dca00a6ca 100644 --- a/src/NadekoBot/Modules/Administration/LocalizationCommands.cs +++ b/src/NadekoBot/Modules/Administration/LocalizationCommands.cs @@ -65,7 +65,10 @@ public partial class Administration _localization.SetGuildCulture(ctx.Guild, ci); } - await ReplyConfirmLocalizedAsync(strs.lang_set(Format.Bold(ci.ToString()), Format.Bold(ci.NativeName))); + var nativeName = ci.NativeName; + if (ci.Name == "ts-TS") + nativeName = _supportedLocales[ci.Name]; + await ReplyConfirmLocalizedAsync(strs.lang_set(Format.Bold(ci.ToString()), Format.Bold(nativeName))); } catch (Exception) { From 77358a563d68288a156543d72dd70c077de0dc66 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Mon, 23 Oct 2023 17:48:54 +0000 Subject: [PATCH 3/3] Added .clubreject which lets you reject applications to the club. Updated some dependencies. --- .../NadekoBot.Generators.csproj | 2 +- src/NadekoBot/Modules/Xp/Club/Club.cs | 18 +++++++++++++++++ src/NadekoBot/Modules/Xp/Club/ClubService.cs | 20 +++++++++++++++++++ src/NadekoBot/Modules/Xp/Club/IClubService.cs | 1 + .../Xp/Club/Results/ClubAcceptResult.cs | 7 +++++++ src/NadekoBot/NadekoBot.csproj | 4 ++-- .../Services/Impl/GoogleApiService.cs | 10 +++++++--- src/NadekoBot/data/aliases.yml | 2 ++ .../data/strings/commands/commands.en-US.yml | 4 ++++ .../strings/responses/responses.en-US.json | 1 + .../Ayu.Discord.Voice.csproj | 2 +- 11 files changed, 64 insertions(+), 7 deletions(-) diff --git a/src/NadekoBot.Generators/NadekoBot.Generators.csproj b/src/NadekoBot.Generators/NadekoBot.Generators.csproj index 4ff08c5d9..7b4968a11 100644 --- a/src/NadekoBot.Generators/NadekoBot.Generators.csproj +++ b/src/NadekoBot.Generators/NadekoBot.Generators.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/NadekoBot/Modules/Xp/Club/Club.cs b/src/NadekoBot/Modules/Xp/Club/Club.cs index a58642f7d..8d699465f 100644 --- a/src/NadekoBot/Modules/Xp/Club/Club.cs +++ b/src/NadekoBot/Modules/Xp/Club/Club.cs @@ -282,6 +282,24 @@ public partial class Xp else if(result == ClubAcceptResult.NotOwnerOrAdmin) await ReplyErrorLocalizedAsync(strs.club_admin_perms); } + + [Cmd] + [Priority(1)] + public Task ClubReject(IUser user) + => ClubReject(user.ToString()); + + [Cmd] + [Priority(0)] + public async Task ClubReject([Leftover] string userName) + { + var result = _service.RejectApplication(ctx.User.Id, userName, out var discordUser); + if (result == ClubDenyResult.Rejected) + await ReplyConfirmLocalizedAsync(strs.club_rejected(Format.Bold(discordUser.ToString()))); + else if(result == ClubDenyResult.NoSuchApplicant) + await ReplyErrorLocalizedAsync(strs.club_accept_invalid_applicant); + else if(result == ClubDenyResult.NotOwnerOrAdmin) + await ReplyErrorLocalizedAsync(strs.club_admin_perms); + } [Cmd] public async Task ClubLeave() diff --git a/src/NadekoBot/Modules/Xp/Club/ClubService.cs b/src/NadekoBot/Modules/Xp/Club/ClubService.cs index 85ecaee1d..48e2360d1 100644 --- a/src/NadekoBot/Modules/Xp/Club/ClubService.cs +++ b/src/NadekoBot/Modules/Xp/Club/ClubService.cs @@ -185,6 +185,26 @@ public class ClubService : INService, IClubService uow.SaveChanges(); return ClubAcceptResult.Accepted; } + + public ClubDenyResult RejectApplication(ulong clubOwnerUserId, string userName, out DiscordUser discordUser) + { + discordUser = null; + using var uow = _db.GetDbContext(); + var club = uow.Clubs.GetByOwnerOrAdmin(clubOwnerUserId); + if (club is null) + return ClubDenyResult.NotOwnerOrAdmin; + + var applicant = + club.Applicants.FirstOrDefault(x => x.User.ToString().ToUpperInvariant() == userName.ToUpperInvariant()); + if (applicant is null) + return ClubDenyResult.NoSuchApplicant; + + club.Applicants.Remove(applicant); + + discordUser = applicant.User; + uow.SaveChanges(); + return ClubDenyResult.Rejected; + } public ClubInfo GetClubWithBansAndApplications(ulong ownerUserId) { diff --git a/src/NadekoBot/Modules/Xp/Club/IClubService.cs b/src/NadekoBot/Modules/Xp/Club/IClubService.cs index 1b5c79d95..5f4866044 100644 --- a/src/NadekoBot/Modules/Xp/Club/IClubService.cs +++ b/src/NadekoBot/Modules/Xp/Club/IClubService.cs @@ -13,6 +13,7 @@ public interface IClubService bool GetClubByName(string clubName, out ClubInfo club); ClubApplyResult ApplyToClub(IUser user, ClubInfo club); ClubAcceptResult AcceptApplication(ulong clubOwnerUserId, string userName, out DiscordUser discordUser); + ClubDenyResult RejectApplication(ulong clubOwnerUserId, string userName, out DiscordUser discordUser); ClubInfo? GetClubWithBansAndApplications(ulong ownerUserId); ClubLeaveResult LeaveClub(IUser user); bool SetDescription(ulong userId, string? desc); diff --git a/src/NadekoBot/Modules/Xp/Club/Results/ClubAcceptResult.cs b/src/NadekoBot/Modules/Xp/Club/Results/ClubAcceptResult.cs index c8e725c45..627ab5919 100644 --- a/src/NadekoBot/Modules/Xp/Club/Results/ClubAcceptResult.cs +++ b/src/NadekoBot/Modules/Xp/Club/Results/ClubAcceptResult.cs @@ -5,4 +5,11 @@ public enum ClubAcceptResult Accepted, NotOwnerOrAdmin, NoSuchApplicant, +} + +public enum ClubDenyResult +{ + Rejected, + NoSuchApplicant, + NotOwnerOrAdmin } \ No newline at end of file diff --git a/src/NadekoBot/NadekoBot.csproj b/src/NadekoBot/NadekoBot.csproj index 5127c4b95..8e5ad93a1 100644 --- a/src/NadekoBot/NadekoBot.csproj +++ b/src/NadekoBot/NadekoBot.csproj @@ -30,7 +30,7 @@ - + @@ -52,7 +52,7 @@ - + diff --git a/src/NadekoBot/Services/Impl/GoogleApiService.cs b/src/NadekoBot/Services/Impl/GoogleApiService.cs index dd7b06189..ea7971a93 100644 --- a/src/NadekoBot/Services/Impl/GoogleApiService.cs +++ b/src/NadekoBot/Services/Impl/GoogleApiService.cs @@ -57,7 +57,7 @@ public sealed partial class GoogleApiService : IGoogleApiService, INService return (await query.ExecuteAsync()).Items.Select(i => i.Id.PlaylistId); } - public async Task> GetRelatedVideosAsync(string id, int count = 1, string user = null) + public async Task> GetRelatedVideosAsync(string id, int count = 2, string user = null) { if (string.IsNullOrWhiteSpace(id)) throw new ArgumentNullException(nameof(id)); @@ -67,10 +67,14 @@ public sealed partial class GoogleApiService : IGoogleApiService, INService var query = _yt.Search.List("snippet"); query.MaxResults = count; - query.RelatedToVideoId = id; + query.Q = id; + // query.RelatedToVideoId = id; query.Type = "video"; query.QuotaUser = user; - return (await query.ExecuteAsync()).Items.Select(i => "https://www.youtube.com/watch?v=" + i.Id.VideoId); + // bad workaround as there's no replacement for related video querying right now. + // Query youtube with the id of the video, take a second video in the results + // skip the first one as that's probably the same video. + return (await query.ExecuteAsync()).Items.Select(i => "https://www.youtube.com/watch?v=" + i.Id.VideoId).Skip(1); } public async Task> GetVideoLinksByKeywordAsync(string keywords, int count = 1) diff --git a/src/NadekoBot/data/aliases.yml b/src/NadekoBot/data/aliases.yml index c09a86afa..1efc29abe 100644 --- a/src/NadekoBot/data/aliases.yml +++ b/src/NadekoBot/data/aliases.yml @@ -1116,6 +1116,8 @@ clubapply: - clubapply clubaccept: - clubaccept +clubreject: + - clubreject clubleave: - clubleave clubdisband: diff --git a/src/NadekoBot/data/strings/commands/commands.en-US.yml b/src/NadekoBot/data/strings/commands/commands.en-US.yml index 0639cddcd..2caec755d 100644 --- a/src/NadekoBot/data/strings/commands/commands.en-US.yml +++ b/src/NadekoBot/data/strings/commands/commands.en-US.yml @@ -1929,6 +1929,10 @@ clubaccept: desc: "Accept a user who applied to your club." args: - "user#1337" +clubreject: + desc: "Reject a user who applied to your club." + args: + - "user#1337" clubleave: desc: "Leaves the club you're currently in." args: diff --git a/src/NadekoBot/data/strings/responses/responses.en-US.json b/src/NadekoBot/data/strings/responses/responses.en-US.json index 0e176b734..77d3ea9b0 100644 --- a/src/NadekoBot/data/strings/responses/responses.en-US.json +++ b/src/NadekoBot/data/strings/responses/responses.en-US.json @@ -848,6 +848,7 @@ "club_not_exists": "That club doesn't exist.", "club_applied": "You've applied for membership in {0} club.", "club_accepted": "Accepted user {0} to the club.", + "club_rejected": "The application by {0} has been rejected.", "club_accept_invalid_applicant": "That user has not applied to your club.", "club_left": "You've left the club.", "club_not_in_a_club": "You are not in a club.", diff --git a/src/ayu/Ayu.Discord.Voice/Ayu.Discord.Voice.csproj b/src/ayu/Ayu.Discord.Voice/Ayu.Discord.Voice.csproj index e10fcc782..eb665ebce 100644 --- a/src/ayu/Ayu.Discord.Voice/Ayu.Discord.Voice.csproj +++ b/src/ayu/Ayu.Discord.Voice/Ayu.Discord.Voice.csproj @@ -7,7 +7,7 @@ 1.0.2 - +