Skip to content

Commit

Permalink
Skills now can have multiple rules. Each rule is a regex and have a c…
Browse files Browse the repository at this point in the history
…allback
  • Loading branch information
vaurdan committed Feb 18, 2017
1 parent f31b350 commit f01d583
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 23 deletions.
5 changes: 2 additions & 3 deletions inputs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,10 +183,9 @@ def process_message( self, message ):
# Loop thru the skills
for level, skill_group in sorted(skills.iteritems()):
for skill in skill_group:
if skill.test(message.get_content()):
# Try to run the message
if skill.run(message):
logger.info( "Found a match on %s" % skill.name )
# Process the message
skill.run(message)

except Exception as e:
logger.exception( "Error in the %s message processing: %s" % ( message.get_input_id(), e.args[0]) )
Expand Down
41 changes: 31 additions & 10 deletions skills/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@

class Skill:

regex = ".*"

ignore_case = True

def __init__(self, bot, args={}):
Expand All @@ -17,11 +15,22 @@ def __init__(self, bot, args={}):
self.io_manager = bot.io_manager
self.io = self.io_manager.get_io_by_skill(self.name)
self.args = {}
self.rules = {}
#self.outputs = bot.get_outputs_by_skill(self.name)

logger.info( "Initializing Skill %s with IO=%s" % (self.name, self.io) )

def get_regex(self):
self.setup_rules()

def setup_rules(self):
logger.warning("%s has no rules. Please implement the setup_rules method." % self.name)
return False

def add_rule( self, regex, callback ):
logger.info("[ %s ] Registering rule %s" % (self.name, regex) )
self.rules[ regex ] = callback
return True

def compile_regex(self, regex):
flag = 0

if self.ignore_case:
Expand All @@ -30,15 +39,25 @@ def get_regex(self):
flag |= re.LOCALE
flag |= re.UNICODE

return re.compile( self.regex, flag)
return re.compile( regex, flag)

def test(self, string):
'Returns true if the regex matches'
return self.get_regex().match(string) is not None
for rule, callback in self.rules.iteritems():
regex = self.compile_regex( rule )
if regex.match(string) is not None:
return True
return False

def run(self, message):
'Runs the algoritmh for a given string'
return "Not Implemented"
content_string = message.get_content()
for rule, callback in self.rules.iteritems():
regex = self.compile_regex( rule )
if regex.match(content_string) is not None:
callback(message)
return True
return False

def add_output(self, output_message):
# Store the output in the correct queue
Expand All @@ -62,14 +81,16 @@ def send_message(self, text_message, original_message, reply=True, args = {}):
message = TextMessage( text_message, original_message, **args )
self.add_output(message)

'''
Alias of Skill.send_message
'''
def send_text(self, text_message, original_message, reply=True, args = {}):
self.send_message(text_message, original_message, reply, **args)

def send_image(self, image_message, original_message, reply=True, args = {}):

# setup the args
args['reply'] = reply

message = ImageMessage( image_message, original_message, **args )
self.add_output(message)

self.add_output(message)
8 changes: 5 additions & 3 deletions skills/goodbyeworld/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
# -*- coding: utf-8 -*-
from skills import Skill
from skills import Skill, Rule

class GoodbyeWorld(Skill):

regex="^Adeus Ambrósio(!|\.+)*$"
def setup_rules(self):
self.add_rule("^Adeus Ambrósio(!|\.+)*$", self.say_bye)

def run(self, message):
def say_bye(self, message):
self.send_message( "Adeus, %s!" % str(message.user().name), message )

9 changes: 5 additions & 4 deletions skills/helloworld/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
from skills import Skill

class HelloWorld(Skill):
regex="^(olá|ola) Ambrósio(!|\.+)*$"

def run(self, message):
self.send_message( "Olá %s!" % str(message.user().name), message, )
self.send_message( "Isto é um teste", message, reply=False)
def setup_rules(self):
self.add_rule("^(olá|ola) Ambrósio(!|\.+)*$", self.say_hello)

def say_hello(self, message):
self.send_message( "Olá %s!" % str(message.user().name), message )
self.send_message( "Isto é um teste", message, reply=False)
10 changes: 7 additions & 3 deletions skills/talkontelegram/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@
from skills import Skill

class TalkOnTelegram(Skill):
regex="^\/talk (.*)"

def run(self, message):
return string.replace('/talk ', '')
def setup_rules(self):
self.add_rule("^\/talk (.*)", self.talk)

def talk(self, message):
string = message.get_content()
self.send_message( string.replace('/talk ', ''), message, reply=False)

0 comments on commit f01d583

Please sign in to comment.