.rlr - Set a level requirement on a self-assignable role

This commit is contained in:
Master Kwoth 2017-11-07 14:48:39 +01:00
parent 7f5961e905
commit f7ef8eae12
5 changed files with 2074 additions and 1 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,26 @@
using Microsoft.EntityFrameworkCore.Migrations;
using System;
using System.Collections.Generic;
namespace NadekoBot.Migrations
{
public partial class sarlevelreq : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "LevelRequirement",
table: "SelfAssignableRoles",
type: "INTEGER",
nullable: false,
defaultValue: 0);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "LevelRequirement",
table: "SelfAssignableRoles");
}
}
}

View File

@ -1149,6 +1149,8 @@ namespace NadekoBot.Migrations
b.Property<ulong>("GuildId"); b.Property<ulong>("GuildId");
b.Property<int>("LevelRequirement");
b.Property<ulong>("RoleId"); b.Property<ulong>("RoleId");
b.HasKey("Id"); b.HasKey("Id");

View File

@ -10,6 +10,8 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using NadekoBot.Common.Attributes; using NadekoBot.Common.Attributes;
using NadekoBot.Common.Collections; using NadekoBot.Common.Collections;
using Microsoft.EntityFrameworkCore;
using NadekoBot.Modules.Xp.Common;
namespace NadekoBot.Modules.Administration namespace NadekoBot.Modules.Administration
{ {
@ -147,7 +149,10 @@ namespace NadekoBot.Modules.Administration
} }
else else
{ {
rolesStr.AppendLine(Format.Bold(role.Name)); if (roleModel.LevelRequirement == 0)
rolesStr.AppendLine(Format.Bold(role.Name));
else
rolesStr.AppendLine(Format.Bold(role.Name) + $" (lvl {roleModel.LevelRequirement}+)");
roleCnt++; roleCnt++;
} }
} }
@ -188,6 +193,42 @@ namespace NadekoBot.Modules.Administration
await ReplyConfirmLocalized("self_assign_no_excl").ConfigureAwait(false); await ReplyConfirmLocalized("self_assign_no_excl").ConfigureAwait(false);
} }
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.ManageRoles)]
public async Task RoleLevelReq(int level, [Remainder] IRole role)
{
if (level < 0)
return;
bool notExists = false;
using (var uow = _db.UnitOfWork)
{
//todo add firacode font to visual studio
var roles = uow.SelfAssignedRoles.GetFromGuild(Context.Guild.Id);
var sar = roles.SelectMany(x => x).FirstOrDefault(x => x.RoleId == role.Id);
if (sar != null)
{
sar.LevelRequirement = level;
uow.Complete();
}
else
{
notExists = true;
}
}
if (notExists)
{
await ReplyErrorLocalized("self_assign_not").ConfigureAwait(false);
return;
}
await ReplyConfirmLocalized("self_assign_level_req",
Format.Bold(role.Name),
Format.Bold(level.ToString())).ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
public async Task Iam([Remainder] IRole role) public async Task Iam([Remainder] IRole role)
@ -196,12 +237,16 @@ namespace NadekoBot.Modules.Administration
GuildConfig conf; GuildConfig conf;
SelfAssignedRole[] roles; SelfAssignedRole[] roles;
LevelStats userLevelData;
using (var uow = _db.UnitOfWork) using (var uow = _db.UnitOfWork)
{ {
conf = uow.GuildConfigs.For(Context.Guild.Id, set => set); conf = uow.GuildConfigs.For(Context.Guild.Id, set => set);
roles = uow.SelfAssignedRoles.GetFromGuild(Context.Guild.Id) roles = uow.SelfAssignedRoles.GetFromGuild(Context.Guild.Id)
.SelectMany(x => x) .SelectMany(x => x)
.ToArray(); .ToArray();
var stats = uow.Xp.GetOrCreateUser(Context.Guild.Id, Context.User.Id);
userLevelData = new LevelStats(stats.Xp + stats.AwardedXp);
} }
var theRoleYouWant = roles.FirstOrDefault(r => r.RoleId == role.Id); var theRoleYouWant = roles.FirstOrDefault(r => r.RoleId == role.Id);
if (theRoleYouWant == null) if (theRoleYouWant == null)
@ -209,6 +254,11 @@ namespace NadekoBot.Modules.Administration
await ReplyErrorLocalized("self_assign_not").ConfigureAwait(false); await ReplyErrorLocalized("self_assign_not").ConfigureAwait(false);
return; return;
} }
if (theRoleYouWant.LevelRequirement > userLevelData.Level)
{
await ReplyErrorLocalized("self_assign_not_level", Format.Bold(theRoleYouWant.LevelRequirement.ToString())).ConfigureAwait(false);
return;
}
if (guildUser.RoleIds.Contains(role.Id)) if (guildUser.RoleIds.Contains(role.Id))
{ {
await ReplyErrorLocalized("self_assign_already", Format.Bold(role.Name)).ConfigureAwait(false); await ReplyErrorLocalized("self_assign_already", Format.Bold(role.Name)).ConfigureAwait(false);

View File

@ -6,5 +6,6 @@
public ulong RoleId { get; set; } public ulong RoleId { get; set; }
public int Group { get; set; } public int Group { get; set; }
public int LevelRequirement { get; set; }
} }
} }