public static async Task OnMemberLeave(ModCoreShard shard, GuildMemberRemoveEventArgs ea) { using (var db = shard.Database.CreateContext()) { var cfg = ea.Guild.GetGuildSettings(db); if (cfg == null || !cfg.RoleState.Enable) { return; } var rs = cfg.RoleState; if (ea.Member.Roles.Any()) // no roles or cache miss, but at this point little can be done about it { var rsx = rs.IgnoredRoleIds; var roles = ea.Member.Roles.Select(xr => xr.Id).Except(rsx).Select(xul => (long)xul); var state = db.RolestateRoles.SingleOrDefault(xs => xs.GuildId == (long)ea.Guild.Id && xs.MemberId == (long)ea.Member.Id); if (state == null) // no rolestate, create it { state = new DatabaseRolestateRoles { GuildId = (long)ea.Guild.Id, MemberId = (long)ea.Member.Id, RoleIds = roles.ToArray() }; await db.RolestateRoles.AddAsync(state); } else // rolestate exists, update it { state.RoleIds = roles.ToArray(); db.RolestateRoles.Update(state); } } var nickstate = db.RolestateNicks.SingleOrDefault(xs => xs.GuildId == (long)ea.Guild.Id && xs.MemberId == (long)ea.Member.Id); shard.Client.Logger.Log(LogLevel.Debug, "ModCore", $"Do nickname shites: {ea.Member.Nickname}", System.DateTime.Now); if (nickstate == null) // no nickstate, create it { shard.Client.Logger.Log(LogLevel.Debug, "ModCore", "Create nickname shites", System.DateTime.Now); nickstate = new DatabaseRolestateNick { GuildId = (long)ea.Guild.Id, MemberId = (long)ea.Member.Id, Nickname = ea.Member.Nickname }; await db.RolestateNicks.AddAsync(nickstate); } else // nickstate exists, update it { shard.Client.Logger.Log(LogLevel.Debug, "ModCore", "Update nickname shites", System.DateTime.Now); nickstate.Nickname = ea.Member.Nickname; db.RolestateNicks.Update(nickstate); } // at this point, channel overrides do not exist await db.SaveChangesAsync(); } }
public static async Task OnMemberUpdate(ModCoreShard shard, GuildMemberUpdateEventArgs ea) { using (var db = shard.Database.CreateContext()) { var cfg = ea.Guild.GetGuildSettings(db); if (cfg == null || !cfg.RoleState.Enable) { return; } var rs = cfg.RoleState; var gld = ea.Guild; var roleids = db.RolestateRoles.SingleOrDefault(xs => xs.GuildId == (long)ea.Guild.Id && xs.MemberId == (long)ea.Member.Id); if (roleids == null) { roleids = new DatabaseRolestateRoles { GuildId = (long)ea.Guild.Id, MemberId = (long)ea.Member.Id }; } roleids.RoleIds = ea.RolesAfter .Select(xr => xr.Id) .Except(rs.IgnoredRoleIds) .Select(xid => (long)xid) .ToArray(); db.RolestateRoles.Update(roleids); var nick = db.RolestateNicks.SingleOrDefault(xs => xs.GuildId == (long)ea.Guild.Id && xs.MemberId == (long)ea.Member.Id); if (nick == null) { nick = new DatabaseRolestateNick { GuildId = (long)ea.Guild.Id, MemberId = (long)ea.Member.Id, }; } nick.Nickname = ea.NicknameAfter; db.RolestateNicks.Update(nick); await db.SaveChangesAsync(); } }
public static async Task OnMemberJoin(ModCoreShard shard, GuildMemberAddEventArgs ea) { var gld = ea.Guild; GuildSettings cfg = null; GuildRoleStateConfig rs = null; DatabaseRolestateRoles roleids = null; DatabaseRolestateOverride[] chperms = null; DatabaseRolestateNick nick = null; using (var db = shard.Database.CreateContext()) { cfg = ea.Guild.GetGuildSettings(db); if (cfg == null || !cfg.RoleState.Enable) return; rs = cfg.RoleState; roleids = db.RolestateRoles.SingleOrDefault(xs => xs.GuildId == (long)ea.Guild.Id && xs.MemberId == (long)ea.Member.Id); chperms = db.RolestateOverrides.Where(xs => xs.GuildId == (long)ea.Guild.Id && xs.MemberId == (long)ea.Member.Id).ToArray(); nick = db.RolestateNicks.SingleOrDefault(xs => xs.GuildId == (long)ea.Guild.Id && xs.MemberId == (long)ea.Member.Id); } if (roleids?.RoleIds != null) { var oroles = roleids.RoleIds .Select(xid => (ulong)xid) .Except(rs.IgnoredRoleIds) .Select(xid => gld.GetRole(xid)) .Where(xr => xr != null).ToList(); var roles = oroles; var highestself = ea.Guild.CurrentMember.Roles.Select(x => x.Position).Max(); roles.RemoveAll(x => x.Position > highestself); if (roles.Any()) await ea.Member.ReplaceRolesAsync(roles, "Restoring Role State."); } else { var ar = cfg.AutoRole; if (ar.Enable && ea.Guild.Roles.Count(x => x.Value.Id == (ulong)ar.RoleId) > 0) { var role = ea.Guild.Roles.First(x => x.Value.Id == (ulong)ar.RoleId); await ea.Member.GrantRoleAsync(role.Value, "AutoRole"); } } if (chperms.Any()) { foreach (var chperm in chperms) { var chn = gld.GetChannel((ulong)chperm.ChannelId); if (chn == null) continue; await chn.AddOverwriteAsync(ea.Member, (Permissions)chperm.PermsAllow, (Permissions)chperm.PermsDeny, "Restoring Role State"); } } if(nick != null) { ea.Client.DebugLogger.LogMessage(LogLevel.Debug, "ModCore", $"Set new old nick: {nick.Nickname}", System.DateTime.Now); var m = await ea.Guild.GetMemberAsync(ea.Member.Id); await m.ModifyAsync(x => x.Nickname = nick.Nickname); } }