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); } } }
public async Task ReapplyEffectiveUsermode([FromBody] PeerchatChannelUserSummary channelUserSummary) { await usermodeRepository.ApplyUsermode(channelUserSummary, null); }
public async Task <UsermodeRecord> GetEffectiveUsermode([FromBody] PeerchatChannelUserSummary channelUserSummary) { return(await usermodeRepository.GetEffectiveUsermode(channelUserSummary)); }