public async Task ResyncChannelUsermodes(string channelMask)
        {
            var                     db     = peerChatCacheDb.GetDatabase();
            IScanningCursor         cursor = null;
            IEnumerable <HashEntry> entries;

            do
            {
                entries = db.HashScan("channels", channelMask, 10, cursor?.Cursor ?? 0);
                foreach (var entry in entries)
                {
                    var channelId = int.Parse(entry.Value);
                    var userIds   = GetChannelUsers(channelId);
                    foreach (var userId in userIds)
                    {
                        var summary         = GetSummaryByUserid(userId);
                        var chanUserSummary = new PeerchatChannelUserSummary();
                        chanUserSummary.ChannelName = entry.Name;
                        chanUserSummary.UserSummary = summary;
                        await ApplyUsermode(chanUserSummary, null);
                    }
                }
                cursor = (IScanningCursor)entries;
            } while ((cursor?.Cursor ?? 0) != 0);
        }
        public async Task <UsermodeRecord> GetEffectiveUsermode(PeerchatChannelUserSummary channelUserSummary)
        {
            var lookup = new UsermodeLookup();

            lookup.channelmask = channelUserSummary.ChannelName;
            lookup.hostmask    = channelUserSummary.UserSummary.Hostname;
            lookup.profileid   = channelUserSummary.UserSummary.Profileid;
            lookup.gameid      = channelUserSummary.UserSummary.Gameid;

            var record = new UsermodeRecord();

            record.channelmask = channelUserSummary.ChannelName;
            record.expiresAt   = DateTime.MaxValue;

            var usermodes = (await Lookup(lookup)).ToList();

            foreach (var usermode in usermodes)
            {
                record.modeflags |= usermode.modeflags;
                if (usermode.expiresAt.HasValue && usermode.expiresAt < record.expiresAt)
                {
                    record.expiresAt = usermode.expiresAt;
                }
            }

            if (record.expiresAt == DateTime.MaxValue)
            {
                record.expiresAt = null;
            }

            return(record);
        }
        private async Task ApplyUsermodesToChannel(string channelName, UsermodeRecord model)
        {
            var db = peerChatCacheDb.GetDatabase();
            var id = db.StringGet("channel_" + channelName);
            //scan channel users
            var             channel_users_key = "channel_" + id + "_users";
            IScanningCursor cursor            = null;
            IEnumerable <SortedSetEntry> entries;

            do
            {
                entries = db.SortedSetScan(channel_users_key, cursor: cursor?.Cursor ?? 0);
                foreach (var entry in entries)
                {
                    var userId             = int.Parse(entry.Element);
                    var summary            = GetSummaryByUserid(userId);
                    var channelUserSummary = new PeerchatChannelUserSummary();
                    channelUserSummary.ChannelName = channelName;
                    channelUserSummary.UserSummary = summary;
                    var effectiveUsermode = await GetEffectiveUsermode(channelUserSummary);
                    await ApplyUsermode(channelUserSummary, effectiveUsermode);
                }
            } while ((cursor?.Cursor ?? 0) != 0);

            //
            if (!string.IsNullOrEmpty(model.hostmask) && model.hostmask.Length > 0 && (model.modeflags & (int)EUserChannelFlag.EUserChannelFlag_Banned) != 0)
            {
                ConnectionFactory factory = connectionFactory.Get();
                using (IConnection connection = factory.CreateConnection())
                {
                    using (IModel channel = connection.CreateModel())
                    {
                        var    modeString       = "+b *@" + model.hostmask;
                        var    modeStringBytes  = System.Text.Encoding.UTF8.GetBytes(modeString);
                        String message          = String.Format("\\type\\MODE\\toChannelId\\{0}\\message\\{1}\\fromUserId\\-1\\includeSelf\\1", id, Convert.ToBase64String(modeStringBytes));
                        byte[] messageBodyBytes = System.Text.Encoding.UTF8.GetBytes(message);

                        IBasicProperties props = channel.CreateBasicProperties();
                        props.ContentType = "text/plain";
                        channel.BasicPublish(PEERCHAT_EXCHANGE, PEERCAHT_CLIENT_MESSAGE_KEY, props, messageBodyBytes);
                    }
                }
            }
        }
        public async Task ApplyUsermode(PeerchatChannelUserSummary channelUserSummary, UsermodeRecord usermode)
        {
            bool kickUser = false;

            if (usermode == null)
            {
                usermode = await GetEffectiveUsermode(channelUserSummary);
            }
            var db          = peerChatCacheDb.GetDatabase();
            var channelId   = db.StringGet("channelname_" + channelUserSummary.ChannelName);
            var channel_key = "channel_" + channelId.ToString() + "_user_" + channelUserSummary.UserSummary.Id;

            var redisValue       = db.HashGet(channel_key, "modeflags");
            int currentModeflags = int.Parse(redisValue.ToString());

            int    newModeflags = usermode.modeflags | (int)EUserChannelFlag.EUserChannelFlag_IsInChannel;
            string removeString = "";
            string addString    = "";

            string userString = "";

            if (checkFlagRemoved(EUserChannelFlag.EUserChannelFlag_Voice, newModeflags, currentModeflags))
            {
                removeString += "v";
                userString   += " " + channelUserSummary.UserSummary.Nick;
            }
            if (checkFlagRemoved(EUserChannelFlag.EUserChannelFlag_HalfOp, newModeflags, currentModeflags) || checkFlagRemoved(EUserChannelFlag.EUserChannelFlag_Op, newModeflags, currentModeflags) || checkFlagRemoved(EUserChannelFlag.EUserChannelFlag_Owner, newModeflags, currentModeflags))
            {
                removeString += "o";
                userString   += " " + channelUserSummary.UserSummary.Nick;
            }

            if (checkFlagAdded(EUserChannelFlag.EUserChannelFlag_Voice, newModeflags, currentModeflags))
            {
                addString  += "v";
                userString += " " + channelUserSummary.UserSummary.Nick;
            }

            //remove banned user
            if (checkFlagAdded(EUserChannelFlag.EUserChannelFlag_Banned, newModeflags, currentModeflags))
            {
                kickUser = true;
            }
            if (checkFlagAdded(EUserChannelFlag.EUserChannelFlag_HalfOp, newModeflags, currentModeflags) || checkFlagAdded(EUserChannelFlag.EUserChannelFlag_Op, newModeflags, currentModeflags) || checkFlagAdded(EUserChannelFlag.EUserChannelFlag_Owner, newModeflags, currentModeflags))
            {
                addString  += "o";
                userString += " " + channelUserSummary.UserSummary.Nick;
            }

            db.HashSet(channel_key, "modeflags", newModeflags);

            var modeString = "";

            if (removeString.Length > 0)
            {
                modeString += "-" + removeString;
            }
            if (addString.Length > 0)
            {
                modeString += "+" + addString;
            }
            modeString += userString;


            if (modeString.Length == 0 && !kickUser)
            {
                return;
            }

            ConnectionFactory factory = connectionFactory.Get();

            using (IConnection connection = factory.CreateConnection())
            {
                using (IModel channel = connection.CreateModel())
                {
                    IBasicProperties props = channel.CreateBasicProperties();
                    props.ContentType = "text/plain";
                    if (modeString.Length > 0)
                    {
                        var    modeStringBytes  = System.Text.Encoding.UTF8.GetBytes(modeString);
                        String message          = String.Format("\\type\\MODE\\toChannelId\\{0}\\message\\{1}\\fromUserId\\-1\\includeSelf\\1", channelId.ToString(), Convert.ToBase64String(modeStringBytes));
                        byte[] messageBodyBytes = System.Text.Encoding.UTF8.GetBytes(message);
                        channel.BasicPublish(PEERCHAT_EXCHANGE, PEERCAHT_CLIENT_MESSAGE_KEY, props, messageBodyBytes);
                    }


                    if (kickUser)
                    {
                        byte[] nameBytes        = System.Text.Encoding.UTF8.GetBytes("Banned");
                        String kickMessage      = String.Format("\\type\\KICK\\toChannelId\\{0}\\message\\{1}\\fromUserId\\-1\\includeSelf\\1\\toUserSummary\\{2}", channelId.ToString(), Convert.ToBase64String(nameBytes), channelUserSummary.UserSummary.ToString());
                        byte[] kickMessageBytes = System.Text.Encoding.UTF8.GetBytes(kickMessage);
                        channel.BasicPublish(PEERCHAT_EXCHANGE, PEERCAHT_CLIENT_MESSAGE_KEY, props, kickMessageBytes);
                        newModeflags = 0;
                        db.SortedSetRemove("channel_" + channelId + "_users", channelUserSummary.UserSummary.Id);
                        db.KeyDelete("channel_" + channelId + "_user_" + channelUserSummary.UserSummary.Id);
                    }

                    String modeflagsMessage      = string.Format("\\type\\UPDATE_USER_CHANMODEFLAGS\\to\\{0}\\user_id\\{1}\\modeflags\\{2}", channelUserSummary.ChannelName, channelUserSummary.UserSummary.Id, newModeflags);
                    byte[] modeflagsMessageBytes = System.Text.Encoding.UTF8.GetBytes(modeflagsMessage);
                    channel.BasicPublish(PEERCHAT_EXCHANGE, PEERCHAT_KEYUPDATE_KEY, props, modeflagsMessageBytes);
                }
            }
        }
Exemple #5
0
 public async Task ReapplyEffectiveUsermode([FromBody] PeerchatChannelUserSummary channelUserSummary)
 {
     await usermodeRepository.ApplyUsermode(channelUserSummary, null);
 }
Exemple #6
0
 public async Task <UsermodeRecord> GetEffectiveUsermode([FromBody] PeerchatChannelUserSummary channelUserSummary)
 {
     return(await usermodeRepository.GetEffectiveUsermode(channelUserSummary));
 }