]>
jfr.im git - erebus.git/blob - modules/control.py
884b82b8840d6cc5dac8f8f1a618760b39420e89
1 # Erebus IRC bot - Author: Erebus Team
2 # Various highly recommended "control" commands.
3 # This file is released into the public domain; see http://unlicense.org/
7 'author' : 'Erebus Team' ,
8 'license' : 'public domain' ,
16 lib
= modlib
. modlib ( __name__
)
17 modstart
= lib
. modstart
23 from collections
import deque
26 @lib.hook (( 'die' , 'restart' ), needchan
= False , glevel
= lib
. MANAGER
)
27 @lib.help ( None , "stops the bot" )
28 def die ( bot
, user
, chan
, realtarget
, * args
):
29 quitmsg
= ' ' . join ( args
)
30 for botitem
in bot
. parent
. bots
. itervalues ():
31 bot
. conn
. send ( "QUIT :Restarting. %s " % ( quitmsg
))
35 @lib.hook ( needchan
= False , glevel
= lib
. MANAGER
)
36 @lib.help ( "<mod>" , "loads a module" )
38 def modload ( bot
, user
, chan
, realtarget
, * args
):
39 okay
= ctlmod
. load ( bot
. parent
, args
[ 0 ])
41 bot
. msg ( user
, "Loaded %s " % ( args
[ 0 ]))
43 bot
. msg ( user
, "Error loading %s : %r " % ( args
[ 0 ], okay
))
45 @lib.hook ( needchan
= False , glevel
= lib
. MANAGER
)
46 @lib.help ( "<mod> [FORCE]" , "unloads a module" , "will refuse to unload a module which is depended on by others" , "unless you specify FORCE." )
48 def modunload ( bot
, user
, chan
, realtarget
, * args
):
49 if len ( ctlmod
. dependents
[ args
[ 0 ]]) > 0 :
50 if len ( args
) == 1 or args
[ 1 ]. lower () != "force" :
51 bot
. msg ( user
, "That module has dependents! Say MODUNLOAD %s FORCE to unload it and any dependents." % ( args
[ 0 ]))
53 okay
= ctlmod
. unload ( bot
. parent
, args
[ 0 ])
55 bot
. msg ( user
, "Unloaded %s " % ( args
[ 0 ]))
57 bot
. msg ( user
, "Error unloading %s : %r " % ( args
[ 0 ], okay
))
59 @lib.hook ( needchan
= False , glevel
= lib
. MANAGER
)
60 @lib.help ( "<mod>" , "reloads a module" )
62 def modreload ( bot
, user
, chan
, realtarget
, * args
):
63 okay
= ctlmod
. reloadmod ( bot
. parent
, args
[ 0 ])
65 bot
. msg ( user
, "Reloaded %s " % ( args
[ 0 ]))
67 bot
. msg ( user
, "Error occurred: %r " % ( okay
))
69 @lib.hook ( needchan
= False , glevel
= lib
. STAFF
)
70 @lib.help ( None , "list loaded modules" )
72 def modlist ( bot
, user
, chan
, realtarget
, * args
):
74 for modname
, mod
in mods
. iteritems ():
75 bot
. msg ( user
, "- %s ( %s ) [ %s ]" % (( modname
, mod
.__ file
__ , ', ' . join ( ctlmod
. dependents
[ modname
]))))
76 bot
. msg ( user
, "Done." )
78 def _whois ( user
, chan
, showglevel
= True , showclevel
= True ):
79 if not user
. isauthed ():
82 fillers
= {'auth': user.auth}
85 if showglevel
and user
. glevel
>= 1 :
86 fillers
[ 'glevel' ] = user
. glevel
87 fmt
+= " (global access: %(glevel)s )"
88 elif user
. glevel
>= 1 :
93 if showclevel
and chan
is not None :
94 if chan
. levelof ( user
. auth
) >= 1 :
95 fillers
[ 'clevel' ] = chan
. levelof ( user
. auth
)
96 fmt
+= " (channel access: %(clevel)s )"
98 fmt
+= " (not a channel user)"
101 @lib.hook ( needchan
= False , wantchan
= True )
102 @lib.help ( "<user|#auth>" , "shows who someone is" )
104 def whois ( bot
, user
, chan
, realtarget
, * args
):
106 if name
. startswith ( "#" ):
107 target
= bot
. parent
. User ( name
, name
[ 1 :])
109 target
= bot
. parent
. user ( name
, create
= False )
111 bot
. msg ( user
, "I don't know %s ." % ( args
[ 0 ]))
113 bot
. msg ( user
, " %s is %s " % ( args
[ 0 ], _whois ( target
, chan
, ( user
. glevel
>= 1 ), ( chan
is not None and chan
. levelof ( user
. auth
) >= 1 ))))
115 @lib.hook ( needchan
= False , wantchan
= True )
116 @lib.help ( None , "shows who you are" )
117 def whoami ( bot
, user
, chan
, realtarget
, * args
):
118 bot
. msg ( user
, "You are %s " % ( _whois ( user
, chan
)))
120 @lib.hook ( needchan
= False )
121 @lib.help ( None , "tries to read your auth and access level again" )
122 def auth ( bot
, user
, chan
, realtarget
, * args
):
123 bot
. msg ( user
, "Okay, give me a second." )
124 bot
. conn
. send ( "WHO %s n %% ant,2" % ( user
))
126 @lib.hook ( needchan
= False , glevel
= 1 )
127 @lib.help ( None , "displays length of each msgqueue" )
128 def qstat ( bot
, user
, chan
, realtarget
, * args
):
129 bot
. fastmsg ( user
, "Regular: %d -- Slow: %d " % ( len ( bot
. msgqueue
), len ( bot
. slowmsgqueue
)))
131 @lib.hook (( 'qclear' , 'clearq' , 'clearqueue' ), needchan
= False , glevel
= lib
. ADMIN
)
132 @lib.help ( "[regular|slow]" , "clears both or a specific msgqueue" )
133 def qclear ( bot
, user
, chan
, realtarget
, * args
):
135 bot
. msgqueue
= deque ()
136 bot
. slowmsgqueue
= deque ()
137 bot
. fastmsg ( user
, "Cleared both msgqueues." )
139 if args
[ 0 ] == 'regular' :
140 bot
. msgqueue
= deque ()
141 elif args
[ 0 ] == 'slow' :
142 bot
. slowmsgqueue
= deque ()
144 bot
. fastmsg ( user
, "Syntax: QCLEAR [regular|slow]" )
145 return #short-circuit
146 bot
. fastmsg ( user
, "Cleared that msgqueue." )
148 @lib.hook ( needchan
= False , wantchan
= True , glevel
= lib
. ADMIN
)
149 @lib.help ( "<nick> <message>" , "inject a line as though it came from <nick>" , "note that this injects lines, not commands" , "ex: INJECT DimeCadmium !WHOAMI" )
150 def inject ( bot
, user
, chan
, realtarget
, * args
):
151 targetuser
= bot
. parent
. user ( args
[ 0 ], create
= False )
152 if targetuser
is None :
153 bot
. msg ( user
, "User is unknown." )
155 if targetuser
. glevel
> user
. glevel
:
156 bot
. msg ( user
, "That user has a higher access level than you." )
160 bot
. parsemsg ( bot
. parent
. user ( args
[ 0 ], create
= False ), str ( chan
), ' ' . join ( args
[ 1 :]))
162 bot
. parsemsg ( bot
. parent
. user ( args
[ 0 ], create
= False ), str ( bot
), ' ' . join ( args
[ 1 :]))