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 - +