/// <summary> /// Gets a <see cref="IrcChannelUserModes"/> instance from prefixes preceding a name in a NAMES reply. /// </summary> internal static IrcChannelUserModes GetUserMode(string prefixes, IrcNetworkParameters parameters) { var mode = IrcChannelUserModes.Normal; foreach (char c in prefixes) { mode |= parameters.ChannelModes.UserPrefixes[c]; } return(mode); }
/// <summary> /// Gets the prefixes and actual name from a prefixed channel user name. /// </summary> private static ModifiedName SplitName(string prefixedName, IrcNetworkParameters parameters) { int index = 0; while (parameters.ChannelModes.UserPrefixes.ContainsKey(prefixedName[index])) { index++; } if (index == 0) { return(new ModifiedName(prefixedName, string.Empty)); } string prefixes = prefixedName.Substring(0, index); string name = prefixedName.Substring(index); return(new ModifiedName(name, prefixes)); }
/// <summary> /// Attempts to find what the real name of an <see cref="IrcChannel"/> is from the specified channel name which might include modes. /// </summary> /// <remarks> /// The channel name may begin with the mode char associated with the user (e.g. @#example) /// Some networks send multiple mode chars. (e.g. @+#example) /// There is no way to distinguish a voiced user (+#example) from a weird but legal channel name (+#example). /// Thus, this method is not guaranteed to return an accurate result. /// </remarks> internal static ModifiedName GuessChannelName(string nameWithMode, IrcNetworkParameters parameters) { int prefixIndex = nameWithMode.IndexOf(StandardChannelPrefix); if (prefixIndex == -1) { do { prefixIndex++; } while (!parameters.IsChannelPrefix(nameWithMode[prefixIndex])); } if (prefixIndex == 0) { return(new ModifiedName(nameWithMode, string.Empty)); } string modes = nameWithMode.Substring(0, prefixIndex); string name = nameWithMode.Substring(prefixIndex); return(new ModifiedName(name, modes)); }