summaryrefslogtreecommitdiff
path: root/pjsip-apps
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2009-08-24 11:56:13 +0000
committerBenny Prijono <bennylp@teluu.com>2009-08-24 11:56:13 +0000
commit04c1872db2effd3ba4f118328aae9d024c647fbc (patch)
tree29dd9c848b0508133c33da82ed844cfba89cc868 /pjsip-apps
parent4077e16cb659407bcd5c162b10a2383f0b53138b (diff)
More #956: added admin commands and html mode
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2912 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip-apps')
-rw-r--r--pjsip-apps/src/confbot/confbot.py150
-rw-r--r--pjsip-apps/src/confbot/config.py17
2 files changed, 151 insertions, 16 deletions
diff --git a/pjsip-apps/src/confbot/confbot.py b/pjsip-apps/src/confbot/confbot.py
index 4a772aef..aa5efbf7 100644
--- a/pjsip-apps/src/confbot/confbot.py
+++ b/pjsip-apps/src/confbot/confbot.py
@@ -81,7 +81,15 @@ class BuddyCb(pj.BuddyCallback):
def on_typing(self, is_typing):
self.member.on_typing(is_typing, buddy=self.buddy)
+
+
+
+##############################################################################
+#
+#
# This class represents individual room member (either/both chat and voice conf)
+#
+#
class Member:
def __init__(self, bot, uri):
self.uri = uri
@@ -92,6 +100,7 @@ class Member:
self.in_chat = False
self.in_voice = False
self.im_error = False
+ self.html = False
def __str__(self):
str = string.ljust(self.uri, 30) + " -- "
@@ -102,11 +111,16 @@ class Member:
str = str + "Offline"
str = str + " ["
if (self.in_voice):
- str = str + " incall"
+ str = str + " voice"
if (self.in_chat):
- str = str + " inchat "
+ str = str + " chat"
+ if (self.html):
+ str = str + " html"
+ else:
+ str = str + " plain"
+
if (self.im_error):
- str = str + " imerror"
+ str = str + " im_error"
str = str + "]"
return str
@@ -133,6 +147,13 @@ class Member:
def send_pager(self, body, mime="text/plain"):
self.bot.DEBUG("send_pager() to " + self.uri)
if self.in_chat and not self.im_error and self.buddy:
+ if self.html:
+ #This will make us receive html!
+ #mime = "text/html"
+ body = body.replace("<", "&lt;")
+ body = body.replace(">", "&gt;")
+ body = body.replace('"', "&quot;")
+ body = body.replace("\n", "<BR>\n")
self.buddy.send_pager(body, content_type=mime)
self.bot.DEBUG("..sent\n")
else:
@@ -240,7 +261,14 @@ class Member:
def on_pager_status(self, body, im_id, code, reason, call=None, buddy=None):
self.im_error = (code/100 != 2)
+
+
+##############################################################################
+#
+#
# The Bot instance (singleton)
+#
+#
class Bot(pj.AccountCallback):
def __init__(self):
pj.AccountCallback.__init__(self, None)
@@ -248,6 +276,7 @@ class Bot(pj.AccountCallback):
self.acc = None
self.calls = []
self.members = {}
+ self.cfg = None
def DEBUG(self, msg, level=TRACE):
print msg,
@@ -256,6 +285,7 @@ class Bot(pj.AccountCallback):
return """
--h[elp] Display this help screen
--j[oin] Join the chat room
+--html on|off Set to receive HTML or plain text
Participant commands:
--s[how] Show confbot settings
@@ -278,7 +308,7 @@ Admin commands:
def listmembers(self):
msg = ""
for uri, m in self.members.iteritems():
- msg = msg + str(m)
+ msg = msg + str(m) + "\n"
return msg
def showsettings(self):
@@ -295,7 +325,7 @@ ConfBot status and settings:
def main(self, cfg_file):
try:
- cfg = __import__(cfg_file)
+ cfg = self.cfg = __import__(cfg_file)
self.lib.init(ua_cfg=cfg.ua_cfg, log_cfg=cfg.log_cfg, media_cfg=cfg.media_cfg)
self.lib.set_null_snd_dev()
@@ -363,24 +393,115 @@ ConfBot status and settings:
del self.members[member.uri]
del member
+ def handle_admin_cmd(self, member, body):
+ if member and self.cfg.admins and not member.uri in self.cfg.admins:
+ member.send_pager("You are not admin")
+ return
+ args = body.split()
+ msg = ""
+
+ if len(args)==1:
+ args.append(" ")
+
+ if args[1]=="list":
+ if not self.cfg.admins:
+ msg = "Everyone is admin!"
+ else:
+ msg = str(self.cfg.admins)
+ elif args[1]=="add":
+ if len(args)!=3:
+ msg = "Usage: add <URI>"
+ else:
+ self.cfg.admins.append(args[2])
+ msg = args[2] + " added as admin"
+ elif args[1]=="del":
+ if len(args)!=3:
+ msg = "Usage: del <URI>"
+ elif args[2] not in self.cfg.admins:
+ msg = args[2] + " is not admin"
+ else:
+ self.cfg.admins.remove(args[2])
+ msg = args[2] + " has been removed from admins"
+ elif args[1]=="rr":
+ msg = "Reregistering.."
+ self.acc.set_registration(True)
+ elif args[1]=="call":
+ if len(args)!=3:
+ msg = "Usage: call <URI>"
+ else:
+ uri = args[2]
+ try:
+ call = self.acc.make_call(uri)
+ except pj.Error, e:
+ msg = "Error: " + str(e)
+ call = None
+
+ if call:
+ if not uri in self.members:
+ m = Member(self, uri)
+ self.members[m.uri] = m
+ else:
+ m = self.members[uri]
+ msg = "Adding " + m.uri + " to voice conference.."
+ m.join_call(call)
+ elif args[1]=="dc" or args[1]=="hold" or args[1]=="update" or args[1]=="reinvite":
+ if len(args)!=3:
+ msg = "Usage: " + args[1] + " <URI>"
+ else:
+ uri = args[2]
+ if not uri in self.members:
+ msg = "Member not found/URI doesn't match (note: case matters!)"
+ else:
+ m = self.members[uri]
+ if m.call:
+ if args[1]=="dc":
+ msg = "Disconnecting.."
+ m.call.hangup(603, "You're disconnected by admin")
+ elif args[1]=="hold":
+ msg = "Holding the call"
+ m.call.hold()
+ elif args[1]=="update":
+ msg = "Sending UPDATE"
+ m.call.update()
+ elif args[1]=="reinvite":
+ msg = "Sending re-INVITE"
+ m.call.reinvite()
+ else:
+ msg = "He is not in call"
+ else:
+ msg = "Unknown admin command " + body
+
+ #print "msg is '%(msg)s'" % {'msg': msg}
+
+ if True:
+ if member:
+ member.send_pager(msg)
+ else:
+ print msg
+
def handle_cmd(self, member, from_uri, body):
body = body.strip(" \t\r\n")
msg = ""
handled = True
- if body=="--list" or body=="--l":
+ if body=="--l" or body=="--list":
msg = self.listmembers()
if msg=="":
msg = "Nobody is here"
- elif body=="--show" or body=="--s":
+ elif body[0:3]=="--s":
msg = self.showsettings()
- elif body=="--help" or body=="--h":
+ elif body[0:6]=="--html" and member:
+ if body[8:11]=="off":
+ member.html = False
+ else:
+ member.html = True
+ elif body=="--h" or body=="--help":
msg = self.helpstring()
elif body=="--leave":
if not member or not member.buddy:
msg = "You are not in chatroom"
else:
member.buddy.unsubscribe()
- elif body=="--join" or body=="--j":
+ elif body[0:3]=="--j":
if not from_uri in self.members:
m = Member(self, from_uri)
self.members[m.uri] = m
@@ -390,6 +511,9 @@ ConfBot status and settings:
m = self.members[from_uri]
self.DEBUG("Adding " + m.uri + " to chatroom\n")
m.join_chat()
+ elif body[0:3]=="--a":
+ self.handle_admin_cmd(member, body)
+ handled = True
else:
handled = False
@@ -422,7 +546,8 @@ ConfBot status and settings:
ai = self.acc.info()
self.DEBUG("Registration state: %(code)d/%(reason)s\n" % \
{'code': ai.reg_status, 'reason': ai.reg_reason}, INFO)
- pass
+ if ai.reg_status/100==2 and ai.reg_expires > 0:
+ self.acc.set_basic_status(True)
def on_pager(self, from_uri, contact, mime_type, body):
body = body.strip(" \t\r\n")
@@ -436,9 +561,14 @@ ConfBot status and settings:
pass
+
+
+##############################################################################
+#
#
# main()
#
+#
if __name__ == "__main__":
bot = Bot()
bot.main(CFG_FILE)
diff --git a/pjsip-apps/src/confbot/config.py b/pjsip-apps/src/confbot/config.py
index b6d284ea..5eadcd79 100644
--- a/pjsip-apps/src/confbot/config.py
+++ b/pjsip-apps/src/confbot/config.py
@@ -4,14 +4,19 @@
#
import pjsua as pj
+# Set of admins. If empty then everyone is admin!
+admins = set([])
+
# acc_cfg holds the account config (set it to None to disable account)
+acc_cfg = None
acc_cfg = pj.AccountConfig()
-acc_cfg.id = "sip:102@pjsip.org"
-acc_cfg.reg_uri = "sip:pjsip.org"
-acc_cfg.proxy = [ "sip:pjsip.org;lr;transport=tcp" ]
-acc_cfg.auth_cred = [ pj.AuthCred("*", "102", "pw102") ]
-acc_cfg.publish_enabled = True
-acc_cfg.require_timer = True
+if acc_cfg:
+ acc_cfg.id = "sip:bot@pjsip.org"
+ acc_cfg.reg_uri = "sip:pjsip.org"
+ acc_cfg.proxy = [ "sip:pjsip.org;lr;transport=tcp" ]
+ acc_cfg.auth_cred = [ pj.AuthCred("*", "bot", "secretpass") ]
+ acc_cfg.publish_enabled = True
+ #acc_cfg.require_timer = True
# Transport configs (set them to None to disable the transport)
udp_cfg = pj.TransportConfig(5080)