Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions example_bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,20 @@
SERVER = "" # Matrix server URL


def hi_callback(room, event):
def hi_callback(room, event, data):
# Somebody said hi, let's say Hi back
room.send_text("Hi, " + event['sender'])


def echo_callback(room, event):
def echo_callback(room, event, data):
args = event['content']['body'].split()
args.pop(0)

# Echo what they said back
room.send_text(' '.join(args))


def dieroll_callback(room, event):
def dieroll_callback(room, event, data):
# someone wants a random number
args = event['content']['body'].split()

Expand All @@ -55,6 +55,11 @@ def dieroll_callback(room, event):
result = random.randrange(1,die_max+1)
room.send_text(str(result))

def generic_callback(room, event, data):
# Somebody wanted to be greeted, let's answer him with the registered
# greeting, passed in the data argument
room.send_text(data + event['sender'])


def main():
# Create an instance of the MatrixBotAPI
Expand All @@ -72,6 +77,13 @@ def main():
dieroll_handler = MCommandHandler("d", dieroll_callback)
bot.add_handler(dieroll_handler)

# Add two handlers for the greet/cheers command, using the same generic
# greeting callback and the data argument
cheers_handler = MCommandHandler("cheers", generic_callback)
greet_handler = MCommandHandler("greet", generic_callback)
bot.add_handler(cheers_handler, "Cheers, ")
bot.add_handler(greet_handler, "Greetings, ")

# Start polling
bot.start_polling()

Expand Down
32 changes: 30 additions & 2 deletions matrix_bot_api/matrix_bot_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ def __init__(self, username, password, server, rooms=None):
# Store empty list of handlers
self.handlers = []

# Store dict with additional arguments to handlers
# This allows to provide additional arguments to a specific handler
# callback on registration.
self.additional_arguments = {}

# If rooms is None, we should listen for invites and automatically accept them
if rooms is None:
self.client.add_invite_listener(self.handle_invite)
Expand All @@ -45,8 +50,30 @@ def __init__(self, username, password, server, rooms=None):
for room in self.rooms:
room.add_listener(self.handle_message)

def add_handler(self, handler):
def add_handler(self, handler, arg=''):
self.handlers.append(handler)
self.additional_arguments[handler] = arg

def remove_handler(self, handler):
try:
self.handlers.remove(handler)
except ValueError as e:
return

try:
self.additional_arguments.pop(handler)
except KeyError as e:
return

def get_handler(self, trigger):
res = []

for h in self.handlers:
if h.triggers_on(trigger):
res.append(h)

return res


def handle_message(self, room, event):
# Make sure we didn't send this message
Expand All @@ -57,7 +84,8 @@ def handle_message(self, room, event):
for handler in self.handlers:
if handler.test_callback(room, event):
# This handler needs to be called
handler.handle_callback(room, event)
arg = self.additional_arguments[handler]
handler.handle_callback(room, event, arg)

def handle_invite(self, room_id, state):
print("Got invite to room: " + str(room_id))
Expand Down
6 changes: 6 additions & 0 deletions matrix_bot_api/mcommand_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,9 @@ def test_command(self, room, event):
if re.match(self.cmd_char + self.command, event['content']['body']):
return True
return False

def triggers_on(self, trigger):
if trigger == self.command:
return True
else:
return False
6 changes: 6 additions & 0 deletions matrix_bot_api/mregex_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,9 @@ def test_regex(self, room, event):
return True

return False

def triggers_on(self, trigger):
if trigger == self.regex_str:
return True
else:
return False