public bool ProcessMessage(string channel, string user, string message, bool wasDirectlyAddressed) { var youtubeMatch = _thingiRegex.Match(message); if (!youtubeMatch.Success) { return(false); } var url = youtubeMatch.Groups[0].Value; var id = youtubeMatch.Groups["id"].Value; _logger.LogInformation("Checking for Thingiverse title for '{id}'", id); var referenceData = _data.AddThingiverseReference(id); if (referenceData.Title != null) { _logger.LogInformation("Already have a title for Thingiverse {Item}: {Title}", referenceData.Item, referenceData.Title); _client.SendMessage(channel, $"{user} linked to \"{referenceData.Title}\" on thingiverse => {referenceData.Count} IRC mentions"); return(false); } GetAndSaveTitle(url, id, channel, user, referenceData?.Count ?? 1); return(false); }
private void DoSetAccess(ServerMessage message, IIrcClient ircClient, ILogger logger) { var nickName = message.GetSender(); var channelName = message.GetChannelName(); var userAccessLevel = ircClient.UserService.GetOrCreateUser(nickName, channelName).AccessLevel; if (userAccessLevel <= 0) return; try { var targetNickName = message.Trailing.Split(' ')[1]; var targetAccessLevel = int.Parse(message.Trailing.Split(' ')[2]); if (targetAccessLevel > (userAccessLevel)) { logger.Write( $"Not enough access for {nickName} to use !setaccess on {channelName} useraccesslevel={userAccessLevel} target={targetAccessLevel}"); ircClient.SendMessage( $"You cannot set another users access level to a number greater than your own ({userAccessLevel})", channelName); return; } var targetUser = ircClient.UserService.GetOrCreateUser(targetNickName, channelName); targetUser.AccessLevel = targetAccessLevel; ircClient.UserService.SaveUser(targetUser); ircClient.SendMessage($"New access level for @{targetNickName} is {targetAccessLevel}.", channelName); } catch (Exception e) { if (e is FormatException || e is IndexOutOfRangeException) { ircClient.SendMessage($"Usage: !setaccess <user> <accesslevel>", channelName); return; } throw; } }
public bool ProcessMessage(string channel, string user, string message, bool wasDirectlyAddressed) { if (message != "status?") { return(false); } var moodValue = _data.GetMood(); var moodString = MoodToString(moodValue); _client.SendMessage(channel, $"Gthx.NET version {GthxBot.Version}: OK; Up for {_util.TimeBetweenString(_startTime)}; mood: {moodString}"); return(true); }
private async void FindAndReportLurkersAsync(string channel) { // TODO: Is there a better way to do or report performance data with Serilog? var start = DateTime.Now; var allUsers = await _client.GetUsersInChannelAsync(channel); _logger.LogInformation("Time to get all users: {TimeInSeconds}", DateTime.Now - start); var dbStart = DateTime.Now; // TODO: Check the performance of this. May want to add a different call to GthxData // that takes a list of users so this can be optimized to search the DB more efficiently var lurkers = allUsers.Where(user => user != _botNick.BotNick && _data.GetLastSeen(user) == null); _logger.LogInformation("Time to find lurkers: {TimeInSeconds}", DateTime.Now - start); // Note: It doesn't matter that this doesn't limit the search to a single channel. // If this instance of the bot shares a DB with other channels, it's because they want all // the same info, so it's just okay that this counts people as saying something even // if it's in a different channel. _client.SendMessage(channel, $"{lurkers.Count()} of the {allUsers.Count} users in {channel} right now have never said anything."); }
public void SendWelcome(IUser networkUser, string channel, IIrcClient client) { var welcomeOverride = this.GetOverride(channel); var applyOverride = false; if (welcomeOverride != null) { applyOverride = this.DoesOverrideApply(networkUser, welcomeOverride); } if (applyOverride) { this.logger.WarnFormat("Detected applicable override, firing alternate welcome"); if (welcomeOverride.Message != null) { var welcomeMessage = this.responder.Respond( welcomeOverride.Message, channel, new[] { networkUser.Nickname, channel }); foreach (var message in welcomeMessage) { client.SendMessage(channel, message.CompileMessage()); } } } else { // Either no override defined, or override not matching. this.logger.InfoFormat("Welcoming {0} into {1}...", networkUser, channel); if (welcomeOverride != null && welcomeOverride.ExemptNonMatching && client.Channels[channel].Users[client.Nickname].Operator) { var modeTarget = $"*!*@{networkUser.Hostname}"; lock (this.appliedExemptions) { if (!this.appliedExemptions.ContainsKey(channel)) { this.appliedExemptions.Add(channel, new List <ExemptListEntry>()); } this.appliedExemptions[channel] .Add(new ExemptListEntry { User = networkUser, Exemption = modeTarget }); } client.Mode(channel, "+e " + modeTarget); var notificationTarget = this.GetCrossChannelNotificationTarget(channel); if (notificationTarget != null) { client.SendMessage( notificationTarget, $"Auto-exempting {networkUser.Nickname}. Please alert ops if there are issues. (Ops: /mode {channel} -e {modeTarget} )"); } } var welcomeMessage = this.responder.Respond( "channelservices.welcomer.welcome", channel, new object[] { networkUser.Nickname, channel }); foreach (var message in welcomeMessage) { client.SendMessage(channel, message.CompileMessage()); } } WelcomerActivations.WithLabels(channel).Inc(); }
/// <summary> /// The do event processing. /// </summary> /// <param name="channel"> /// The channel. /// </param> /// <param name="user"> /// The user. /// </param> /// <param name="client"> /// The client. /// </param> public void DoEventProcessing(string channel, IUser user, IIrcClient client) { try { // channel checks var alertChannel = this.GetAlertChannel(channel); if (alertChannel == null) { return; } var ip = this.GetIpAddress(user); if (ip == null) { return; } string baseWiki = LegacyConfig.Singleton()["baseWiki", channel]; MediaWikiSite mediaWikiSite = this.mediaWikiSiteRepository.GetById(int.Parse(baseWiki)); BlockInformation blockInformation = mediaWikiSite.GetBlockInformation(ip.ToString()).FirstOrDefault(); if (blockInformation.Id != null) { string orgname = null; var textResult = HttpRequest.Get(string.Format("http://ip-api.com/line/{0}?fields=org,as,status", ip)); var resultData = textResult.Split('\r', '\n'); if (resultData.FirstOrDefault() == "success") { orgname = string.Format(", org: {0}", resultData[1]); } var message = string.Format( "Joined user {0} ({4}{5}) in channel {1} is blocked ({2}) because: {3}", user.Nickname, channel, blockInformation.Target, blockInformation.BlockReason, ip, orgname); client.SendMessage(alertChannel, message); } } catch (Exception ex) { this.logger.Error("Unknown error occurred in BlockMonitoringService", ex); } }