示例#1
0
        public async Task DoTeamUpdate()
        {
            if (_fs.Forum != null)
            {
                var oldStaff = _staff;
                _staff = await _fs.Forum.GetMembersList(MembersListType.Staff).ConfigureAwait(false);

                var rankAdded   = _staff.Where(uiNew => oldStaff.All(uiOld => uiOld.Id != uiNew.Id)).ToArray();
                var rankChanged = oldStaff.Where(uiOld => _staff.Any(uiNew => uiNew.Id == uiOld.Id && !string.Equals(uiNew.UserTitle, uiOld.UserTitle, StringComparison.OrdinalIgnoreCase))).Select(uiOld => new RankUpdateItem(uiOld, _staff.First(uiNew => uiNew.Id == uiOld.Id))).ToArray();
                var rankRemoved = oldStaff.Where(uiOld => _staff.All(uiNew => uiNew.Id != uiOld.Id)).ToArray();

                await TeamMemberAdded.Invoke(rankAdded).ConfigureAwait(false);

                await TeamMemberRankChanged.Invoke(rankChanged).ConfigureAwait(false);

                await TeamMemberRemoved.Invoke(rankRemoved).ConfigureAwait(false);

                using var uow = _db.UnitOfWork;
                var guildConfigs    = uow.GuildConfigs.GetAllGuildConfigs(_client.Guilds.Select(g => g.Id).ToList()).Where(gc => gc.TeamUpdateChannelId.HasValue).ToList();
                var teamUpdateRanks = uow.TeamUpdateRanks.GetAll().AsEnumerable().Where(tur => guildConfigs.Any(gc => gc.GuildId == tur.GuildId)).GroupBy(tur => tur.GuildId).ToList();

                foreach (var gc in guildConfigs)
                {
                    var guild             = _client.GetGuild(gc.GuildId);
                    var teamUpdateChannel = guild?.GetTextChannel(gc.TeamUpdateChannelId.Value);

                    if (teamUpdateChannel != null)
                    {
                        var roles = teamUpdateRanks.FirstOrDefault(turgroup => turgroup.Key == gc.GuildId)?.ToArray();

                        if (!(roles is null) && roles.Length != 0)
                        {
                            await TeamMemberAdded_Message.Invoke(teamUpdateChannel, rankAdded).ConfigureAwait(false);

                            await TeamMemberRankChanged_Message.Invoke(teamUpdateChannel, rankChanged).ConfigureAwait(false);

                            await TeamMemberRemoved_Message.Invoke(teamUpdateChannel, rankRemoved).ConfigureAwait(false);
                        }
                    }
                }
            }
        }