예제 #1
0
        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);
        }
예제 #2
0
        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;
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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.");
        }
예제 #5
0
        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();
        }
예제 #6
0
        /// <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);
            }
        }