1 package rero.bridges.event; 2 3 import java.util.regex.*; 4 import java.util.*; 5 import rero.util.*; 6 import sleep.engine.atoms.*; 7 import sleep.runtime.*; 8 9 import rero.script.*; 10 11 public class FilterChatListener extends EventChatListener 12 { 13 protected ScriptEnvironment env; 14 protected String [] filter; 15 protected String event; 16 protected CodeSnippet code; 17 protected int isPublic; 19 private static final Pattern filterPattern = Pattern.compile("(.*?) (.*?) (.*)"); 20 21 public FilterChatListener(ScriptEnvironment _env, String _event, String _filter, CodeSnippet _code) 22 { 23 env = _env; 24 event = _event.toUpperCase(); 25 26 if (event.equals("PUBLIC")) 27 { 28 isPublic = 1; 29 event = "PRIVMSG"; 30 } 31 else if (event.equals("PUBLIC_ACTION")) 32 { 33 isPublic = 1; 34 event = "ACTION"; 35 } 36 else if (event.equals("PRIVATE_ACTION")) 37 { 38 isPublic = 2; 39 event = "ACTION"; 40 } 41 else if (event.equals("MSG")) 42 { 43 isPublic = 2; 44 event = "MSG"; 45 } 46 else if (event.length() > 6 && event.substring(0, 5).equals("REPL_")) 47 { 48 isPublic = 0; 49 event = event.substring(5, event.length()); 50 } 51 else 52 { 53 isPublic = 0; 54 } 55 56 code = _code; 57 58 filter = new String [3]; 62 _filter = (env.evaluateExpression(_filter) + ""); 63 64 Matcher matcher = filterPattern.matcher(_filter.toUpperCase()); 65 66 if (matcher.matches()) 67 { 68 filter[0] = matcher.group(1); 69 filter[1] = matcher.group(2); 70 filter[2] = matcher.group(3); 71 addListener(_code); 72 } 73 else 74 { 75 _env.getScriptInstance().fireWarning("Invalid format for event " + _event + " filter: " + _filter, _code.getLineNumber()); 76 } 77 } 78 79 private boolean isMatch(HashMap eventDescription) 80 { 81 String target, parms, from; 82 target = (eventDescription.get("$target") + "").toUpperCase(); 83 from = (eventDescription.get("$source") + "").toUpperCase(); 84 parms = (eventDescription.get("$parms") + "").toUpperCase(); 85 86 if (target.equals("")) { target = "<none>"; } 87 if (from.equals("")) { target = "<none>"; } 88 89 boolean check = true; 90 91 if (isPublic > 0 && ClientUtils.isChannel(target)) 92 { 93 check = isPublic == 1; 94 } 95 96 return check && StringUtils.iswm(filter[0], from) && 97 StringUtils.iswm(filter[1], target) && 98 StringUtils.iswm(filter[2], parms); 99 } 100 101 public boolean isChatEvent(String eventId, HashMap eventDescription) 102 { 103 if (!code.isValid()) 104 { 105 return false; 106 } 107 108 return (eventId.toUpperCase().equals(event) && isMatch(eventDescription)); 109 } 110 } 111 | Popular Tags |