示例#1
0
 public override Boolean Execute(FilterArgs args)
 {
     if (!String.IsNullOrEmpty(_matchPattern))
     {
         return args.Drop =
             Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) &&
             ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern));
     }
     return false;
 }
示例#2
0
 public override Boolean Execute(FilterArgs args)
 {
     if (!String.IsNullOrEmpty(_matchPattern))
     {
         return(args.Drop =
                    Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) &&
                    ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern)));
     }
     return(false);
 }
示例#3
0
        public override Boolean Execute(FilterArgs args)
        {
            if (!String.IsNullOrEmpty(_matchPattern))
            {
                if (Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) &&
                    ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern)))
                {
                    if (IsRemoveContent || !String.IsNullOrEmpty(_replacePattern))
                    {
                        args.Content = Regex.Replace(args.Content, _matchPattern, (_replacePattern ?? String.Empty), RegexOptions.IgnoreCase);
                    }

                    args.IRCMessageType = _messageType;
                    return(true);
                }
            }
            return(false);
        }
示例#4
0
        /// <summary>
        /// メッセージをフィルタします
        /// </summary>
        /// <param name="args"></param>
        /// <returns>メッセージを捨てるかどうか</returns>
        public Boolean ExecuteFilters(FilterArgs args)
        {
            TraceLogger.Filter.Information(String.Format("Filter: User: {0} / Message: {1}", args.User.ScreenName, args.Content.Replace('\n', ' ')));
            Trace.Indent();
            try
            {
                foreach (FilterItem item in _items)
                {
                    if (!item.Enabled)
                    {
                        continue;
                    }

                    Trace.Indent();
                    try
                    {
                        Boolean executed = item.Execute(args);
                        if (args.Drop)
                        {
                            TraceLogger.Filter.Information(String.Format("=> Drop", item.GetType().Name, args.User.ScreenName,
                                                                         args.Content.Replace('\n', ' ')));
                            return(false);
                        }
                        else if (executed)
                        {
                            TraceLogger.Filter.Information(String.Format("=> Execute Result: Filter: {0} / User: {1} / Message: {2}",
                                                                         item.GetType().Name,
                                                                         args.User.ScreenName, args.Content.Replace('\n', ' ')));
                        }
                    }
                    finally
                    {
                        Trace.Unindent();
                    }
                }
            }
            finally
            {
                Trace.Unindent();
            }

            return(true);
        }
示例#5
0
        public override Boolean Execute(FilterArgs args)
        {
            if (String.IsNullOrEmpty(_channelName))
            {
                return(false);
            }

            if (!String.IsNullOrEmpty(_matchPattern))
            {
                Boolean rerouteRequired =
                    Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) &&
                    ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern));

                if (!rerouteRequired)
                {
                    return(false);
                }

                IRCMessage msg;
                switch (args.IRCMessageType.ToUpperInvariant())
                {
                case "NOTICE":
                    msg = new NoticeMessage(_channelName, args.Content);
                    break;

                case "PRIVMSG":
                default:
                    msg = new PrivMsgMessage(_channelName, args.Content);
                    break;
                }
                msg.SenderNick = args.User.ScreenName;
                msg.SenderHost = "twitter@" + Server.ServerName;
                args.Session.Send(msg);

                if (!_duplicate)
                {
                    args.Drop = true;
                }

                return(true);
            }
            return(false);
        }
示例#6
0
        public override Boolean Execute(FilterArgs args)
        {
            if (!String.IsNullOrEmpty(_matchPattern))
            {
                if (Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) &&
                    ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern)))
                {
                    if (IsRemoveContent || !String.IsNullOrEmpty(_replacePattern))
                    {
                        args.Content = Regex.Replace(args.Content, _matchPattern, (_replacePattern ?? String.Empty), RegexOptions.IgnoreCase);
                    }

                    args.IRCMessageType = _messageType;
                    return true;
                }
            }
            return false;
        }
示例#7
0
        public override Boolean Execute(FilterArgs args)
        {
            if (String.IsNullOrEmpty(_channelName))
                return false;

            if (!String.IsNullOrEmpty(_matchPattern))
            {
                Boolean rerouteRequired =
                    Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) &&
                    ((String.IsNullOrEmpty(_userMatchPattern)) ? true : Regex.IsMatch(args.User.ScreenName, _userMatchPattern));

                if (!rerouteRequired)
                    return false;

                IRCMessage msg;
                switch (args.IRCMessageType.ToUpperInvariant())
                {
                    case "NOTICE":
                        msg = new NoticeMessage(_channelName, args.Content);
                        break;
                    case "PRIVMSG":
                    default:
                        msg = new PrivMsgMessage(_channelName, args.Content);
                        break;
                }
                msg.SenderNick = args.User.ScreenName;
                msg.SenderHost = "twitter@" + Server.ServerName;
                args.Session.Send(msg);

                if (!_duplicate)
                    args.Drop = true;

                return true;
            }
            return false;
        }
示例#8
0
        public override Boolean Execute(FilterArgs args)
        {
            if (!String.IsNullOrEmpty(_matchPattern))
            {
                if (Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) &&
                    ((String.IsNullOrEmpty(_userMatchPattern))
                         ? true
                         : Regex.IsMatch(args.User.ScreenName, _userMatchPattern)))
                {
                    Encoding encIn = (InputEncoding == null)
                                         ? Encoding.Default
                                         :(String.Compare(InputEncoding, "UTF-8", true) == 0)
                                                 ? new UTF8Encoding(false)
                                                 : Encoding.GetEncoding(InputEncoding);

                    Encoding encOut = (OutputEncoding == null)
                                          ? Encoding.Default
                                          : (String.Compare(OutputEncoding, "UTF-8", true) == 0)
                                                ? new UTF8Encoding(false)
                                                : Encoding.GetEncoding(OutputEncoding);

                    TraceLogger.Filter.Information(String.Format("Start: {0} ({1})", ProcessPath, Arguments));

                    ProcessStartInfo psInfo = new ProcessStartInfo(ProcessPath, Arguments);
                    psInfo.RedirectStandardInput = true;
                    psInfo.RedirectStandardOutput = true;
                    psInfo.StandardOutputEncoding = encIn; // Process -> TIG のエンコーディング
                    psInfo.UseShellExecute = false;
                    psInfo.WindowStyle = ProcessWindowStyle.Hidden;
                    psInfo.CreateNoWindow = true;

                    Dictionary<String, String> headers =
                        new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
                    String content;
                    using (System.Diagnostics.Process process = System.Diagnostics.Process.Start(psInfo))
                    using (StreamWriter sw = new StreamWriter(process.StandardInput.BaseStream, encOut))
                    {
                        sw.WriteLine("Url: http://twitter.com/{0}/statuses/{1}", args.Status.User.ScreenName,
                                     args.Status.Id);
                        WriteFieldsAndProperties(sw, "User", args.User);
                        WriteFieldsAndProperties(sw, "Status", args.Status);
                        sw.WriteLine("Filter-Drop: {0}", args.Drop);
                        sw.WriteLine("Filter-IRCMessageType: {0}", args.IRCMessageType);
                        sw.WriteLine();
                        if (XmlMode)
                            Status.Serializer.Serialize(sw, args.Status);
                        else
                            sw.WriteLine(args.Content);
                        sw.Close();

                        String output = process.StandardOutput.ReadToEnd();
                        if (String.IsNullOrEmpty(output))
                            return false;

                        String[] parts = output.Split(new string[] {"\n\n"}, 2, StringSplitOptions.RemoveEmptyEntries);
                        if (parts.Length == 1)
                        {
                            content = parts[0].Trim();
                        }
                        else
                        {
                            if (parts.Length == 0)
                            {
                                TraceLogger.Filter.Information("Filter was recieved invalid data");
                                return false;
                            }
                            foreach (var line in parts[0].Split('\n'))
                            {
                                String[] headerParts = line.Split(new char[] {':'}, 2);
                                if (headerParts.Length != 2)
                                    continue;

                                headers[headerParts[0].Trim()] = headerParts[1].Trim();
                            }
                            content = parts[1].Trim();
                        }

                        if (process.WaitForExit(60*1000))
                        {
                            TraceLogger.Filter.Information("Process Exited: " + process.ExitCode.ToString());
                            // 終了コード見る
                            if (process.ExitCode == 0)
                            {
                                // 書き換え
                                Boolean drop = args.Drop;
                                if (headers.ContainsKey("Filter-Drop"))
                                    Boolean.TryParse(headers["Filter-Drop"], out drop);
                                if (headers.ContainsKey("Filter-IRCMessageType"))
                                    args.IRCMessageType = headers["Filter-IRCMessageType"];

                                args.Content = content;
                            }
                            else
                            {
                                // 何もしない
                                return false;
                            }
                        }
                    }

                    args.IRCMessageType = _messageType;
                    return true;
                }
            }
            return false;
        }
示例#9
0
        /// <summary>
        /// メッセージをフィルタします
        /// </summary>
        /// <param name="args"></param>
        /// <returns>メッセージを捨てるかどうか</returns>
        public Boolean ExecuteFilters(FilterArgs args)
        {
            TraceLogger.Filter.Information(String.Format("Filter: User: {0} / Message: {1}",args.User.ScreenName, args.Content.Replace('\n', ' ')));
            Trace.Indent();
            try
            {
                foreach (FilterItem item in _items)
                {
                    if (!item.Enabled)
                        continue;

                    Trace.Indent();
                    try
                    {
                        Boolean executed = item.Execute(args);
                        if (args.Drop)
                        {
                            TraceLogger.Filter.Information(String.Format("=> Drop", item.GetType().Name, args.User.ScreenName,
                                                          args.Content.Replace('\n', ' ')));
                            return false;
                        }
                        else if (executed)
                        {
                            TraceLogger.Filter.Information(String.Format("=> Execute Result: Filter: {0} / User: {1} / Message: {2}",
                                                          item.GetType().Name,
                                                          args.User.ScreenName, args.Content.Replace('\n', ' ')));
                        }
                    }
                    finally
                    {
                        Trace.Unindent();
                    }
                }
            }
            finally
            {
                Trace.Unindent();
            }

            return true;
        }
示例#10
0
 public abstract Boolean Execute(FilterArgs args);
示例#11
0
        public override Boolean Execute(FilterArgs args)
        {
            if (!String.IsNullOrEmpty(_matchPattern))
            {
                if (Regex.IsMatch(args.Content, _matchPattern, RegexOptions.IgnoreCase) &&
                    ((String.IsNullOrEmpty(_userMatchPattern))
                         ? true
                         : Regex.IsMatch(args.User.ScreenName, _userMatchPattern)))
                {
                    Encoding encIn = (InputEncoding == null)
                                         ? Encoding.Default
                                         :(String.Compare(InputEncoding, "UTF-8", true) == 0)
                                                 ? new UTF8Encoding(false)
                                                 : Encoding.GetEncoding(InputEncoding);

                    Encoding encOut = (OutputEncoding == null)
                                          ? Encoding.Default
                                          : (String.Compare(OutputEncoding, "UTF-8", true) == 0)
                                                ? new UTF8Encoding(false)
                                                : Encoding.GetEncoding(OutputEncoding);

                    TraceLogger.Filter.Information(String.Format("Start: {0} ({1})", ProcessPath, Arguments));

                    ProcessStartInfo psInfo = new ProcessStartInfo(ProcessPath, Arguments);
                    psInfo.RedirectStandardInput  = true;
                    psInfo.RedirectStandardOutput = true;
                    psInfo.StandardOutputEncoding = encIn; // Process -> TIG のエンコーディング
                    psInfo.UseShellExecute        = false;
                    psInfo.WindowStyle            = ProcessWindowStyle.Hidden;
                    psInfo.CreateNoWindow         = true;

                    Dictionary <String, String> headers =
                        new Dictionary <string, string>(StringComparer.InvariantCultureIgnoreCase);
                    String content;
                    using (System.Diagnostics.Process process = System.Diagnostics.Process.Start(psInfo))
                        using (StreamWriter sw = new StreamWriter(process.StandardInput.BaseStream, encOut))
                        {
                            sw.WriteLine("Url: http://twitter.com/{0}/statuses/{1}", args.Status.User.ScreenName,
                                         args.Status.Id);
                            WriteFieldsAndProperties(sw, "User", args.User);
                            WriteFieldsAndProperties(sw, "Status", args.Status);
                            sw.WriteLine("Filter-Drop: {0}", args.Drop);
                            sw.WriteLine("Filter-IRCMessageType: {0}", args.IRCMessageType);
                            sw.WriteLine();
                            if (XmlMode)
                            {
                                Status.Serializer.Serialize(sw, args.Status);
                            }
                            else
                            {
                                sw.WriteLine(args.Content);
                            }
                            sw.Close();

                            String output = process.StandardOutput.ReadToEnd();
                            if (String.IsNullOrEmpty(output))
                            {
                                return(false);
                            }

                            String[] parts = output.Split(new string[] { "\n\n" }, 2, StringSplitOptions.RemoveEmptyEntries);
                            if (parts.Length == 1)
                            {
                                content = parts[0].Trim();
                            }
                            else
                            {
                                if (parts.Length == 0)
                                {
                                    TraceLogger.Filter.Information("Filter was recieved invalid data");
                                    return(false);
                                }
                                foreach (var line in parts[0].Split('\n'))
                                {
                                    String[] headerParts = line.Split(new char[] { ':' }, 2);
                                    if (headerParts.Length != 2)
                                    {
                                        continue;
                                    }

                                    headers[headerParts[0].Trim()] = headerParts[1].Trim();
                                }
                                content = parts[1].Trim();
                            }

                            if (process.WaitForExit(60 * 1000))
                            {
                                TraceLogger.Filter.Information("Process Exited: " + process.ExitCode.ToString());
                                // 終了コード見る
                                if (process.ExitCode == 0)
                                {
                                    // 書き換え
                                    Boolean drop = args.Drop;
                                    if (headers.ContainsKey("Filter-Drop"))
                                    {
                                        Boolean.TryParse(headers["Filter-Drop"], out drop);
                                    }
                                    if (headers.ContainsKey("Filter-IRCMessageType"))
                                    {
                                        args.IRCMessageType = headers["Filter-IRCMessageType"];
                                    }

                                    args.Content = content;
                                }
                                else
                                {
                                    // 何もしない
                                    return(false);
                                }
                            }
                        }

                    args.IRCMessageType = _messageType;
                    return(true);
                }
            }
            return(false);
        }
示例#12
0
 public abstract Boolean Execute(FilterArgs args);