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