Пример #1
0
        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();
            }
        }
Пример #2
0
        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();
            }
        }
Пример #3
0
        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);
            }
        }