Skip to content

Commit

Permalink
微調整. ( ღ'ᴗ'ღ )
Browse files Browse the repository at this point in the history
  • Loading branch information
non117 committed Feb 13, 2012
1 parent e19b8c8 commit 410c2b9
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 44 deletions.
10 changes: 4 additions & 6 deletions src/boxnya.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,7 @@ def settings_loader(settings):
"LOG_SETTINGS":log_settings,
"ENABLE_MODULES":getattr(settings, "ENABLE_MODULES", []),
"INOUT":settings.INOUT,
"INPUT_SETTINGS":getattr(settings, "INPUT_SETTINGS", {}),
"FILTER_SETTINGS":getattr(settings, "FILTER_SETTINGS", {}),
"OUTPUT_SETTINGS":getattr(settings, "OUTPUT_SETTINGS", {}),
"MODULE_SETTINGS":getattr(settings, "MODULE_SETTINGS", {}),
}

try:
Expand All @@ -47,7 +45,7 @@ def settings_loader(settings):
sys.exit("Error : Cannot import settings module.")

def setting_replacer(re_pattern, replace_list):
settings_dir = os.path.dirname(os.path.abspath(__file__)) + "settings.py"
settings_dir = os.path.dirname(os.path.abspath(__file__)) + "/settings.py"
with open(settings_dir,"r+w") as f:
base_str = [part_s for part_s in re.split(re_pattern,f.read()) if part_s]
setting_strs = []
Expand All @@ -61,7 +59,7 @@ def setting_replacer(re_pattern, replace_list):

def twitterinitializer():
global settings
twitter_setting = settings.get("INPUT_SETTINGS").get("twitter",[])
twitter_setting = settings.get("MODULE_SETTINGS").get("twitter",[])
if isinstance(twitter_setting, dict):
twitter_setting = [twitter_setting]
tokens = []
Expand Down Expand Up @@ -166,7 +164,7 @@ def main():
global settings
# ENABLE_MODULESが空なら全てのモジュールが有効なので, twitterは読み込まれる筈
if not settings["ENABLE_MODULES"] or "twitter" in settings["ENABLE_MODULES"]:
twitter_setting = settings["INPUT_SETTINGS"].get("twitter",{})
twitter_setting = settings["MODULE_SETTINGS"].get("twitter",{})
if isinstance(twitter_setting,dict):
twitter_setting = [twitter_setting]
if not (twitter_setting[0].get("atokensecret") and twitter_setting[0].get("atoken")):
Expand Down
32 changes: 18 additions & 14 deletions src/lib/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ def __init__(self, group=None, target=None, name=None, args=(), kwargs=None,
self.carrier = Carrier(name)
self.stopevent = Event()
self.init()
self.output_names = set(self.output_carriers.keys())

def init(self):
''' 初期処理をここに書く '''
Expand All @@ -82,20 +83,27 @@ def log(self, text, level='INFO'):
packet = {"text":text, "from":self.name, "level":level.upper()}
self.logger.carrier.handover(packet)

def send(self, data, target_names=[]):
def send(self, data, target=[], exclude=[]):
''' これでデータを投げる '''
packet = {"data":data, "from":self.name}
if target_names and isinstance(target_names, str):
target_names = [target_names]
for name, carrier in self.output_carriers.items():
if not target_names or name in target_names:# target_namesが空ならば常にTrue
carrier.handover(copy.deepcopy(packet))
if isinstance(target, str):
target = [target]
if isinstance(exclude, str):
exclude = [exclude]
if target:
output_names = self.output_names & set(target)
else:
output_names = self.output_names - set(exclude)

for name in output_names:
self.output_carriers[name].handover(copy.deepcopy(packet))


class Input(BaseThread):
''' ネットやシステムログなどBoxnyaの外界から定期的にデータを取ってきて, filter, outputに渡すスレッド '''
def fetch(self):
''' データを取ってくる処理をここに '''
#self.send(data, target_names)
#self.send(data, target, exclude)

def run(self):
try:
Expand Down Expand Up @@ -126,12 +134,10 @@ class Filter(Output):
'''
def filter(self, packet):
''' フィルター処理をここに書く '''
#return data
#self.send(data, target, exclude)

def throw(self, packet):
data = self.filter(packet)
if data:
self.send(data)
self.filter(packet)

class Logger(BaseThread):
''' ログを取るためのスレッド. Outputみたいな役割をもつ '''
Expand Down Expand Up @@ -240,9 +246,7 @@ def _set_settings(self, settings):
self.log_settings = settings["LOG_SETTINGS"]
self.enable_modules = settings["ENABLE_MODULES"]
self.input_to_output = settings["INOUT"]
self.all_settings.update(settings["INPUT_SETTINGS"])
self.all_settings.update(settings["FILTER_SETTINGS"])
self.all_settings.update(settings["OUTPUT_SETTINGS"])
self.all_settings.update(settings["MODULE_SETTINGS"])
for name, dic in self.all_settings.items():
if "include" in dic:
for mod_name in dic["include"]:
Expand Down
27 changes: 16 additions & 11 deletions src/lib/filters/egosearch.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,35 +24,40 @@ def filter(self, packet):
if data.get("mentions") and [user for user in self.screen_name if user in [mention["screen_name"] for mention in data["mentions"]]]:
mention = {"user":data["user"]["screen_name"],
"post":data["text"]}
return u"%(user)s: %(post)s" % mention
self.send(u"%(user)s: %(post)s" % mention, exclude = ["favbot"])

elif data.get("event") and data["target"]["screen_name"] in self.screen_name:
if "favorite" in data["event"]:
event = {"star":u"☆" if "un" in data["event"] else u"★",
"user":data["source"]["screen_name"],
"event":data["event"].title(),
"post":data["object"]["text"]}
return u"%(star)s %(user)s %(event)sd: %(post)s" % event
self.send(u"%(star)s %(user)s %(event)sd: %(post)s*" % event, exclude = ["favbot"])

elif "retweet" == data["event"]:
event = {"user":data["source"]["screen_name"],
"post":data["object"]["text"]}
return u"%(user)s Retweeted: %(post)s" % event
self.send(u"%(user)s Retweeted: %(post)s" % event, exclude = ["favbot"])

elif "dm" == data["event"]:
event = {"user":data["source"]["screen_name"],
"post":data["text"]}
return u"DM from %(user)s: %(post)s" % event
self.send(u"DM from %(user)s: %(post)s" % event, exclude = ["favbot"])

elif "follow" == data["event"]:
event = {"name":data["source"]["name"],
"screen_name":data["source"]["screen_name"]}
return u"%(name)s (@%(screen_name)s) is now following you" % event
self.send(u"%(name)s (@%(screen_name)s) is now following you" % event, exclude = ["favbot"])

elif "list" in data["event"]:
event = {"event":u"◆ Added into" if "add" in data["event"] else u"◇ Removed from",
"list":data["object"]["name"]}
return u"%(event) %(list)s" % event
elif data.get("event") == "favorite" and data["source"]["screen_name"] in self.protected:
self.send({"id":data["object"]["id"],"type":"protected"}, "favbot")
return None
self.send(u"%(event) %(list)s" % event, exclude = ["favbot"])

elif self.regexp and self.pattern.search(data.get("text", "")):
mention = {"user":data["user"]["screen_name"],
"post":data["text"]}
return u"%(user)s: %(post)s" % mention
return None
self.send(u"%(user)s: %(post)s" % mention, exclude = ["favbot"])

elif data.get("event") == "favorite" and data["source"]["screen_name"] in self.protected:
self.send({"id":data["object"]["id"],"type":"protected"}, target = ["favbot"])
22 changes: 9 additions & 13 deletions src/settings.py.example
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import os

# 基本設定
DAEMON = False
DAEMON = False #今は使えません
LOGGING = True
LOG_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),"log")
LOG_OUT = []
Expand All @@ -24,29 +24,25 @@ INOUT = {"twitter":["egosearch"],
}

# モジュール(プラグイン)の設定
# 各Input, Filter, Outputの設定はそれぞれ辞書になっています.
# 各モジュールの設定は辞書になっています.
# 辞書のキーがモジュール名, 値がモジュールに設定する{"項目名":"設定値"}になります.
# もし値の部分にリストが使われると, 中にある辞書の数だけモジュールがクローンされます.
# つまり, 設定された値の違う複数の同一モジュールを動かせるということです.
# また, 基本的に複数設定する項目はリスト[]の中に文字列""を書いてください.

# Input
INPUT_SETTINGS = {
MODULE_SETTINGS = {# Input
"gmail":{"username":"", "password":""},
# twitterの設定は python boxnya.py init を実行すると自動的に行われます.
"twitter":[{'atokensecret': '', 'atoken': ''},
{'atokensecret': '', 'atoken': ''}]
}
# Filter
FILTER_SETTINGS = {
{'atokensecret': '', 'atoken': ''}],

# Filter
"egosearch":{
"screen_name":["",""],
"regexp":"",# エゴサーチ用の正規表現
"protected":[""] #オプション
},
}

# Output
OUTPUT_SETTINGS = {
# Output
"imkayac":{"username":"", "password":"", "sig": ""},
"favbot":{"include":["twitter"]}
"favbot":{"include":["twitter"]} # "twitter"から設定をコピーしてきます.
}

0 comments on commit 410c2b9

Please sign in to comment.