Source code for errbot.core_plugins.chatRoom
import logging
from errbot import BotPlugin, SeparatorArgParser, ShlexArgParser, botcmd
from errbot.backends.base import RoomNotJoinedError
log = logging.getLogger(__name__)
[docs]class ChatRoom(BotPlugin):
connected = False
[docs] def callback_connect(self):
self.log.info("Connecting bot chatrooms")
if not self.connected:
self.connected = True
for room in self.bot_config.CHATROOM_PRESENCE:
self.log.debug("Try to join room %s", repr(room))
try:
self._join_room(room)
except Exception:
# Ensure failure to join a room doesn't crash the plugin
# as a whole.
self.log.exception(f"Joining room {repr(room)} failed")
def _join_room(self, room):
username = self.bot_config.CHATROOM_FN
password = None
if isinstance(room, (tuple, list)):
room, password = room # unpack
self.log.info(
"Joining room %s with username %s and pass ***.", room, username
)
else:
self.log.info("Joining room %s with username %s.", room, username)
self.query_room(room).join(
username=self.bot_config.CHATROOM_FN, password=password
)
[docs] def deactivate(self):
self.connected = False
super().deactivate()
[docs] @botcmd(split_args_with=ShlexArgParser())
def room_create(self, message, args):
"""
Create a chatroom.
Usage:
!room create <room>
Examples (XMPP):
!room create example-room@chat.server.tld
Examples (IRC):
!room create #example-room
"""
if len(args) < 1:
return "Please tell me which chatroom to create."
room = self.query_room(args[0])
room.create()
return f"Created the room {room}."
[docs] @botcmd(split_args_with=ShlexArgParser())
def room_join(self, message, args):
"""
Join (creating it first if needed) a chatroom.
Usage:
!room join <room> [<password>]
Examples (XMPP):
!room join example-room@chat.server.tld
!room join example-room@chat.server.tld super-secret-password
Examples (IRC):
!room join #example-room
!room join #example-room super-secret-password
!room join #example-room "password with spaces"
"""
arglen = len(args)
if arglen < 1:
return "Please tell me which chatroom to join."
args[0].strip()
room_name, password = (args[0], None) if arglen == 1 else (args[0], args[1])
room = self.query_room(room_name)
if room is None:
return f"Cannot find room {room_name}."
room.join(username=self.bot_config.CHATROOM_FN, password=password)
return f"Joined the room {room_name}."
[docs] @botcmd(split_args_with=ShlexArgParser())
def room_leave(self, message, args):
"""
Leave a chatroom.
Usage:
!room leave <room>
Examples (XMPP):
!room leave example-room@chat.server.tld
Examples (IRC):
!room leave #example-room
"""
if len(args) < 1:
return "Please tell me which chatroom to leave."
self.query_room(args[0]).leave()
return f"Left the room {args[0]}."
[docs] @botcmd(split_args_with=ShlexArgParser())
def room_destroy(self, message, args):
"""
Destroy a chatroom.
Usage:
!room destroy <room>
Examples (XMPP):
!room destroy example-room@chat.server.tld
Examples (IRC):
!room destroy #example-room
"""
if len(args) < 1:
return "Please tell me which chatroom to destroy."
self.query_room(args[0]).destroy()
return f"Destroyed the room {args[0]}."
[docs] @botcmd(split_args_with=ShlexArgParser())
def room_invite(self, message, args):
"""
Invite one or more people into a chatroom.
Usage:
!room invite <room> <identifier1> [<identifier2>, ..]
Examples (XMPP):
!room invite room@conference.server.tld bob@server.tld
Examples (IRC):
!room invite #example-room bob
"""
if len(args) < 2:
return "Please tell me which person(s) to invite into which room."
self.query_room(args[0]).invite(*args[1:])
return f'Invited {", ".join(args[1:])} into the room {args[0]}.'
[docs] @botcmd
def room_list(self, message, args):
"""
List chatrooms the bot has joined.
Usage:
!room list
Examples:
!room list
"""
rooms = [str(room) for room in self.rooms()]
if len(rooms):
rooms_str = "\n\t".join(rooms)
return f"I'm currently in these rooms:\n\t{rooms_str}"
else:
return "I'm not currently in any rooms."
[docs] @botcmd(split_args_with=ShlexArgParser())
def room_occupants(self, message, args):
"""
List the occupants in a given chatroom.
Usage:
!room occupants <room 1> [<room 2> ..]
Examples (XMPP):
!room occupants room@conference.server.tld
Examples (IRC):
!room occupants #example-room #another-example-room
"""
if len(args) < 1:
yield "Please supply a room to list the occupants of."
return
for room in args:
try:
occupants = [o.person for o in self.query_room(room).occupants]
occupants_str = "\n\t".join(map(str, occupants))
yield f"Occupants in {room}:\n\t{occupants_str}."
except RoomNotJoinedError as e:
yield f"Cannot list occupants in {room}: {e}."
[docs] @botcmd(split_args_with=ShlexArgParser())
def room_topic(self, message, args):
"""
Get or set the topic for a room.
Usage:
!room topic <room> [<new topic>]
Examples (XMPP):
!room topic example-room@chat.server.tld
!room topic example-room@chat.server.tld "Err rocks!"
Examples (IRC):
!room topic #example-room
!room topic #example-room "Err rocks!"
"""
arglen = len(args)
if arglen < 1:
return "Please tell me which chatroom you want to know the topic of."
if arglen == 1:
try:
topic = self.query_room(args[0]).topic
except RoomNotJoinedError as e:
return f"Cannot get the topic for {args[0]}: {e}."
if topic is None:
return f"No topic is set for {args[0]}."
else:
return f"Topic for {args[0]}: {topic}."
else:
try:
self.query_room(args[0]).topic = args[1]
except RoomNotJoinedError as e:
return f"Cannot set the topic for {args[0]}: {e}."
return f"Topic for {args[0]} set."
[docs] def callback_message(self, msg):
try:
if msg.is_direct:
username = msg.frm.person
if username in self.bot_config.CHATROOM_RELAY:
self.log.debug("Message to relay from %s.", username)
body = msg.body
rooms = self.bot_config.CHATROOM_RELAY[username]
for roomstr in rooms:
self.send(self.query_room(roomstr), body)
elif msg.is_group:
fr = msg.frm
chat_room = str(fr.room)
if chat_room in self.bot_config.REVERSE_CHATROOM_RELAY:
users_to_relay_to = self.bot_config.REVERSE_CHATROOM_RELAY[
chat_room
]
self.log.debug("Message to relay to %s.", users_to_relay_to)
body = f"[{fr.person}] {msg.body}"
for user in users_to_relay_to:
self.send(user, body)
except Exception as e:
self.log.exception(f"crashed in callback_message {e}")