Changeset 2912 for pjproject/trunk


Ignore:
Timestamp:
Aug 24, 2009 11:56:13 AM (15 years ago)
Author:
bennylp
Message:

More #956: added admin commands and html mode

Location:
pjproject/trunk/pjsip-apps/src/confbot
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip-apps/src/confbot/confbot.py

    r2911 r2912  
    8282                self.member.on_typing(is_typing, buddy=self.buddy) 
    8383 
     84 
     85 
     86 
     87############################################################################## 
     88# 
     89# 
    8490# This class represents individual room member (either/both chat and voice conf) 
     91# 
     92# 
    8593class Member: 
    8694        def __init__(self, bot, uri): 
     
    93101                self.in_voice = False 
    94102                self.im_error = False 
     103                self.html = False 
    95104         
    96105        def __str__(self): 
     
    103112                str = str + " [" 
    104113                if (self.in_voice): 
    105                         str = str + " incall" 
     114                        str = str + " voice" 
    106115                if (self.in_chat): 
    107                         str = str + " inchat " 
     116                        str = str + " chat" 
     117                        if (self.html): 
     118                                str = str + " html" 
     119                        else: 
     120                                str = str + " plain" 
     121 
    108122                if (self.im_error): 
    109                         str = str + " imerror" 
     123                        str = str + " im_error" 
    110124                str = str + "]" 
    111125                return str 
     
    134148                self.bot.DEBUG("send_pager() to " + self.uri) 
    135149                if self.in_chat and not self.im_error and self.buddy: 
     150                        if self.html: 
     151                                #This will make us receive html! 
     152                                #mime = "text/html" 
     153                                body = body.replace("<", "&lt;") 
     154                                body = body.replace(">", "&gt;") 
     155                                body = body.replace('"', "&quot;") 
     156                                body = body.replace("\n", "<BR>\n") 
    136157                        self.buddy.send_pager(body, content_type=mime) 
    137158                        self.bot.DEBUG("..sent\n") 
     
    241262                self.im_error = (code/100 != 2) 
    242263 
     264 
     265 
     266############################################################################## 
     267# 
     268# 
    243269# The Bot instance (singleton) 
     270# 
     271# 
    244272class Bot(pj.AccountCallback): 
    245273        def __init__(self): 
     
    249277                self.calls = [] 
    250278                self.members = {} 
     279                self.cfg = None 
    251280 
    252281        def DEBUG(self, msg, level=TRACE): 
     
    257286--h[elp]            Display this help screen 
    258287--j[oin]            Join the chat room 
     288--html on|off       Set to receive HTML or plain text 
    259289 
    260290Participant commands: 
     
    279309                msg = "" 
    280310                for uri, m in self.members.iteritems(): 
    281                         msg = msg + str(m) 
     311                        msg = msg + str(m) + "\n" 
    282312                return msg 
    283313         
     
    296326        def main(self, cfg_file): 
    297327                try: 
    298                         cfg = __import__(cfg_file) 
     328                        cfg = self.cfg = __import__(cfg_file) 
    299329                         
    300330                        self.lib.init(ua_cfg=cfg.ua_cfg, log_cfg=cfg.log_cfg, media_cfg=cfg.media_cfg) 
     
    364394                        del member 
    365395                         
     396        def handle_admin_cmd(self, member, body): 
     397                if member and self.cfg.admins and not member.uri in self.cfg.admins: 
     398                        member.send_pager("You are not admin") 
     399                        return 
     400                args = body.split() 
     401                msg = "" 
     402 
     403                if len(args)==1: 
     404                        args.append(" ") 
     405 
     406                if args[1]=="list": 
     407                        if not self.cfg.admins: 
     408                                msg = "Everyone is admin!" 
     409                        else: 
     410                                msg = str(self.cfg.admins) 
     411                elif args[1]=="add": 
     412                        if len(args)!=3: 
     413                                msg = "Usage: add <URI>" 
     414                        else: 
     415                                self.cfg.admins.append(args[2]) 
     416                                msg = args[2] + " added as admin" 
     417                elif args[1]=="del": 
     418                        if len(args)!=3: 
     419                                msg = "Usage: del <URI>" 
     420                        elif args[2] not in self.cfg.admins: 
     421                                msg = args[2] + " is not admin" 
     422                        else: 
     423                                self.cfg.admins.remove(args[2]) 
     424                                msg = args[2] + " has been removed from admins" 
     425                elif args[1]=="rr": 
     426                        msg = "Reregistering.." 
     427                        self.acc.set_registration(True) 
     428                elif args[1]=="call": 
     429                        if len(args)!=3: 
     430                                msg = "Usage: call <URI>" 
     431                        else: 
     432                                uri = args[2] 
     433                                try: 
     434                                        call = self.acc.make_call(uri) 
     435                                except pj.Error, e: 
     436                                        msg = "Error: " + str(e) 
     437                                        call = None 
     438 
     439                                if call: 
     440                                        if not uri in self.members: 
     441                                                m = Member(self, uri) 
     442                                                self.members[m.uri] = m 
     443                                        else: 
     444                                                m = self.members[uri] 
     445                                        msg = "Adding " + m.uri + " to voice conference.." 
     446                                        m.join_call(call) 
     447                elif args[1]=="dc" or args[1]=="hold" or args[1]=="update" or args[1]=="reinvite": 
     448                        if len(args)!=3: 
     449                                msg = "Usage: " + args[1] + " <URI>" 
     450                        else: 
     451                                uri = args[2] 
     452                                if not uri in self.members: 
     453                                        msg = "Member not found/URI doesn't match (note: case matters!)" 
     454                                else: 
     455                                        m = self.members[uri] 
     456                                        if m.call: 
     457                                                if args[1]=="dc": 
     458                                                        msg = "Disconnecting.." 
     459                                                        m.call.hangup(603, "You're disconnected by admin") 
     460                                                elif args[1]=="hold": 
     461                                                        msg = "Holding the call" 
     462                                                        m.call.hold() 
     463                                                elif args[1]=="update": 
     464                                                        msg = "Sending UPDATE" 
     465                                                        m.call.update() 
     466                                                elif args[1]=="reinvite": 
     467                                                        msg = "Sending re-INVITE" 
     468                                                        m.call.reinvite() 
     469                                        else: 
     470                                                msg = "He is not in call" 
     471                else: 
     472                        msg = "Unknown admin command " + body 
     473 
     474                #print "msg is '%(msg)s'" % {'msg': msg} 
     475 
     476                if True: 
     477                        if member: 
     478                                member.send_pager(msg) 
     479                        else: 
     480                                print msg 
     481 
    366482        def handle_cmd(self, member, from_uri, body): 
    367483                body = body.strip(" \t\r\n") 
    368484                msg = "" 
    369485                handled = True 
    370                 if body=="--list" or body=="--l": 
     486                if body=="--l" or body=="--list": 
    371487                        msg = self.listmembers() 
    372488                        if msg=="": 
    373489                                msg = "Nobody is here" 
    374                 elif body=="--show" or body=="--s": 
     490                elif body[0:3]=="--s": 
    375491                        msg = self.showsettings() 
    376                 elif body=="--help" or body=="--h": 
     492                elif body[0:6]=="--html" and member: 
     493                        if body[8:11]=="off": 
     494                                member.html = False 
     495                        else: 
     496                                member.html = True 
     497                elif body=="--h" or body=="--help": 
    377498                        msg = self.helpstring() 
    378499                elif body=="--leave": 
     
    381502                        else: 
    382503                                member.buddy.unsubscribe() 
    383                 elif body=="--join" or body=="--j": 
     504                elif body[0:3]=="--j": 
    384505                        if not from_uri in self.members: 
    385506                                m = Member(self, from_uri) 
     
    391512                                self.DEBUG("Adding " + m.uri + " to chatroom\n") 
    392513                                m.join_chat() 
     514                elif body[0:3]=="--a": 
     515                        self.handle_admin_cmd(member, body) 
     516                        handled = True 
    393517                else: 
    394518                        handled = False 
     
    423547                self.DEBUG("Registration state: %(code)d/%(reason)s\n" % \ 
    424548                                        {'code': ai.reg_status, 'reason': ai.reg_reason}, INFO) 
    425                 pass 
     549                if ai.reg_status/100==2 and ai.reg_expires > 0: 
     550                        self.acc.set_basic_status(True) 
    426551 
    427552        def on_pager(self, from_uri, contact, mime_type, body): 
     
    437562 
    438563 
     564 
     565 
     566############################################################################## 
     567# 
    439568# 
    440569# main() 
     570# 
    441571# 
    442572if __name__ == "__main__": 
  • pjproject/trunk/pjsip-apps/src/confbot/config.py

    r2911 r2912  
    55import pjsua as pj 
    66 
     7# Set of admins. If empty then everyone is admin! 
     8admins = set([]) 
     9 
    710# acc_cfg holds the account config (set it to None to disable account) 
     11acc_cfg = None 
    812acc_cfg = pj.AccountConfig() 
    9 acc_cfg.id = "sip:102@pjsip.org" 
    10 acc_cfg.reg_uri = "sip:pjsip.org" 
    11 acc_cfg.proxy = [ "sip:pjsip.org;lr;transport=tcp" ] 
    12 acc_cfg.auth_cred = [ pj.AuthCred("*", "102", "pw102") ] 
    13 acc_cfg.publish_enabled = True 
    14 acc_cfg.require_timer = True 
     13if acc_cfg: 
     14        acc_cfg.id = "sip:bot@pjsip.org" 
     15        acc_cfg.reg_uri = "sip:pjsip.org" 
     16        acc_cfg.proxy = [ "sip:pjsip.org;lr;transport=tcp" ] 
     17        acc_cfg.auth_cred = [ pj.AuthCred("*", "bot", "secretpass") ] 
     18        acc_cfg.publish_enabled = True 
     19        #acc_cfg.require_timer = True 
    1520 
    1621# Transport configs (set them to None to disable the transport) 
Note: See TracChangeset for help on using the changeset viewer.