diff --git a/NadekoBot.Core/Modules/Xp/Club.cs b/NadekoBot.Core/Modules/Xp/Club.cs index a6351cbf..4dceab75 100644 --- a/NadekoBot.Core/Modules/Xp/Club.cs +++ b/NadekoBot.Core/Modules/Xp/Club.cs @@ -26,6 +26,19 @@ namespace NadekoBot.Modules.Xp _client = client; } + [NadekoCommand, Usage, Description, Aliases] + public async Task ClubTransfer([Remainder]IUser newOwner) + { + var club = _service.TransferClub(Context.User, newOwner); + + if(club != null) + await ReplyConfirmLocalized("club_transfered", + Format.Bold(club.Name), + Format.Bold(newOwner.ToString())).ConfigureAwait(false); + else + await ReplyErrorLocalized("club_transfer_failed").ConfigureAwait(false); + } + [NadekoCommand, Usage, Description, Aliases] public async Task ClubAdmin([Remainder]IUser toAdmin) { diff --git a/NadekoBot.Core/Modules/Xp/Services/ClubService.cs b/NadekoBot.Core/Modules/Xp/Services/ClubService.cs index 75181cd9..151b0ded 100644 --- a/NadekoBot.Core/Modules/Xp/Services/ClubService.cs +++ b/NadekoBot.Core/Modules/Xp/Services/ClubService.cs @@ -51,6 +51,27 @@ namespace NadekoBot.Modules.Xp.Services return true; } + public ClubInfo TransferClub(IUser from, IUser newOwner) + { + ClubInfo club; + using (var uow = _db.UnitOfWork) + { + club = uow.Clubs.GetByOwner(from.Id); + var newOwnerUser = uow.DiscordUsers.GetOrCreate(newOwner); + + if (club == null || + club.Owner.UserId != from.Id || + !club.Users.Contains(newOwnerUser)) + return null; + + club.Owner.IsClubAdmin = true; // old owner will stay as admin + newOwnerUser.IsClubAdmin = true; + club.Owner = newOwnerUser; + uow.Complete(); + } + return club; + } + public bool ToggleAdmin(IUser owner, IUser toAdmin) { bool newState; @@ -58,14 +79,14 @@ namespace NadekoBot.Modules.Xp.Services { var club = uow.Clubs.GetByOwner(owner.Id); var adminUser = uow.DiscordUsers.GetOrCreate(toAdmin); - - if (club.OwnerId == adminUser.Id) - return true; - + if (club == null || club.Owner.UserId != owner.Id || !club.Users.Contains(adminUser)) throw new InvalidOperationException(); + if (club.OwnerId == adminUser.Id) + return true; + newState = adminUser.IsClubAdmin = !adminUser.IsClubAdmin; uow.Complete(); } diff --git a/src/NadekoBot/_strings/ResponseStrings.en-US.json b/src/NadekoBot/_strings/ResponseStrings.en-US.json index abe93236..7707615d 100644 --- a/src/NadekoBot/_strings/ResponseStrings.en-US.json +++ b/src/NadekoBot/_strings/ResponseStrings.en-US.json @@ -925,5 +925,7 @@ "administration_invalid": "Invalid / Can't be found ({0})", "administration_mass_kill_in_progress": "Mass Banning and Blacklisting of {0} users is in progress...", "administration_mass_kill_completed": "Mass Banning and Blacklisting of {0} users is complete.", - "searches_failed_finding_novel": "Can't find that novel. Make sure you've typed the exact full name, and that it exists on novelupdates.com" + "searches_failed_finding_novel": "Can't find that novel. Make sure you've typed the exact full name, and that it exists on novelupdates.com", + "xp_club_transfered": "Ownership of the club {0} has been transfered to {1}", + "xp_club_transfer_failed": "Transfer failed. You must be the club owner. Target must be a member of your club." } \ No newline at end of file diff --git a/src/NadekoBot/_strings/cmd/command_strings.json b/src/NadekoBot/_strings/cmd/command_strings.json index 5cdb1b94..96b04854 100644 --- a/src/NadekoBot/_strings/cmd/command_strings.json +++ b/src/NadekoBot/_strings/cmd/command_strings.json @@ -2871,6 +2871,13 @@ "{0}clubcreate b1nzy's friends" ] }, + "clubtransfer": { + "Cmd": "clubtransfer", + "Desc": "Transfers the ownership of the club to another member of the club.", + "Usage": [ + "{0}clubtransfer @b1nzy" + ] + }, "clubinformation": { "Cmd": "clubinfo", "Desc": "Shows information about the club.",