]>
jfr.im git - erebus.git/blob - modules/control.py
aac0257b06907af5ba2e0b1e154aa3fc8b39f6cf
1 # Erebus IRC bot - Author: Erebus Team
2 # vim: fileencoding=utf-8
3 # Various highly recommended "control" commands.
4 # This file is released into the public domain; see http://unlicense.org/
8 'author' : 'Erebus Team' ,
9 'license' : 'public domain' ,
17 lib
= modlib
. modlib ( __name__
)
18 modstart
= lib
. modstart
24 from collections
import deque
27 @lib.hook (( 'die' , 'restart' ), needchan
= False , glevel
= lib
. MANAGER
)
28 @lib.help ( None , "stops the bot" )
29 def die ( bot
, user
, chan
, realtarget
, * args
):
30 quitmsg
= ' ' . join ( args
)
31 for botitem
in bot
. parent
. bots
. values ():
32 bot
. conn
. send ( "QUIT :Restarting. %s " % ( quitmsg
))
36 @lib.hook ( needchan
= False , glevel
= lib
. MANAGER
)
37 @lib.help ( "<mod>" , "loads a module" )
39 def modload ( bot
, user
, chan
, realtarget
, * args
):
40 okay
= ctlmod
. load ( bot
. parent
, args
[ 0 ])
42 bot
. msg ( user
, "Loaded %s " % ( args
[ 0 ]))
44 bot
. msg ( user
, "Error loading %s : %r " % ( args
[ 0 ], okay
))
46 @lib.hook ( needchan
= False , glevel
= lib
. MANAGER
)
47 @lib.help ( "<mod> [FORCE]" , "unloads a module" , "will refuse to unload a module which is depended on by others" , "unless you specify FORCE." )
49 def modunload ( bot
, user
, chan
, realtarget
, * args
):
50 if not ctlmod
. isloaded ( args
[ 0 ]):
51 bot
. msg ( user
, " %s is not loaded" % ( args
[ 0 ]))
53 if len ( ctlmod
. dependents
[ args
[ 0 ]]) > 0 :
54 if len ( args
) == 1 or args
[ 1 ]. lower () != "force" :
55 bot
. msg ( user
, "That module has dependents! Say MODUNLOAD %s FORCE to unload it and any dependents." % ( args
[ 0 ]))
58 okay
= ctlmod
. unload ( bot
. parent
, args
[ 0 ])
60 bot
. msg ( user
, "Unloaded %s " % ( args
[ 0 ]))
62 bot
. msg ( user
, "Error unloading %s : %r " % ( args
[ 0 ], okay
))
64 @lib.hook ( needchan
= False , glevel
= lib
. MANAGER
)
65 @lib.help ( "<mod>" , "reloads a module" )
67 def modreload ( bot
, user
, chan
, realtarget
, * args
):
68 if not ctlmod
. isloaded ( args
[ 0 ]):
69 bot
. msg ( user
, " %s is not loaded" % ( args
[ 0 ]))
72 okay
= ctlmod
. reloadmod ( bot
. parent
, args
[ 0 ])
74 bot
. msg ( user
, "Reloaded %s " % ( args
[ 0 ]))
76 bot
. msg ( user
, "Error occurred: %r " % ( okay
))
78 @lib.hook ( needchan
= False , glevel
= lib
. STAFF
)
79 @lib.help ( None , "list loaded modules" )
81 def modlist ( bot
, user
, chan
, realtarget
, * args
):
83 for modname
, mod
in mods
. items ():
84 bot
. msg ( user
, "- %s ( %s ) [ %s ]" % (( modname
, mod
.__ file
__ , ', ' . join ( ctlmod
. dependents
[ modname
]))))
85 bot
. msg ( user
, "Done." )
87 def _whois ( user
, chan
, showglevel
= True , showclevel
= True ):
88 if not user
. isauthed ():
91 fillers
= {'auth': user.auth}
94 if showglevel
and user
. glevel
>= 1 :
95 fillers
[ 'glevel' ] = user
. glevel
96 fmt
+= " (global access: %(glevel)s )"
97 elif user
. glevel
>= 1 :
100 fmt
+= " (not staff)"
102 if showclevel
and chan
is not None :
103 clev
= chan
. levelof ( user
. auth
)
105 fillers
[ 'clevel' ] = ( lib
. clevs
[ clev
] if clev
< len ( lib
. clevs
) else clev
)
106 fmt
+= " (channel access: %(clevel)s )"
108 fmt
+= " (not a channel user)"
111 @lib.hook ( needchan
= False , wantchan
= True )
112 @lib.help ( "<user|#auth>" , "shows who someone is" )
114 def whois ( bot
, user
, chan
, realtarget
, * args
):
116 if name
. startswith ( "#" ):
117 target
= bot
. parent
. User ( name
, name
[ 1 :])
119 target
= bot
. parent
. user ( name
, create
= False )
121 return "I don't know %s ." % ( args
[ 0 ])
123 return " %s is %s " % ( args
[ 0 ], _whois ( target
, chan
, ( user
. glevel
>= 1 ), ( chan
is not None and chan
. levelof ( user
. auth
) >= 1 )))
125 @lib.hook ( needchan
= False , wantchan
= True )
126 @lib.help ( None , "shows who you are" )
127 def whoami ( bot
, user
, chan
, realtarget
, * args
):
128 return "You are %s " % ( _whois ( user
, chan
))
130 @lib.hook ( needchan
= False )
131 @lib.help ( None , "tries to read your auth and access level again" )
132 def auth ( bot
, user
, chan
, realtarget
, * args
):
133 bot
. msg ( user
, "Okay, give me a second." )
134 bot
. conn
. send ( "WHO %s n %% ant,2" % ( user
))
136 @lib.hook ( needchan
= False , glevel
= 1 )
137 @lib.help ( None , "displays length of each msgqueue" )
138 def qstat ( bot
, user
, chan
, realtarget
, * args
):
139 bot
. fastmsg ( user
, "Regular: %d -- Slow: %d " % ( len ( bot
. msgqueue
), len ( bot
. slowmsgqueue
)))
141 @lib.hook (( 'qclear' , 'cq' , 'clearq' , 'clearqueue' ), needchan
= False , glevel
= lib
. ADMIN
)
142 @lib.help ( "[regular|slow]" , "clears both or a specific msgqueue" )
143 def qclear ( bot
, user
, chan
, realtarget
, * args
):
145 bot
. msgqueue
= deque ()
146 bot
. slowmsgqueue
= deque ()
147 bot
. fastmsg ( user
, "Cleared both msgqueues." )
149 if args
[ 0 ] == 'regular' :
150 bot
. msgqueue
= deque ()
151 elif args
[ 0 ] == 'slow' :
152 bot
. slowmsgqueue
= deque ()
154 bot
. fastmsg ( user
, "Syntax: QCLEAR [regular|slow]" )
155 return #short-circuit
156 bot
. fastmsg ( user
, "Cleared that msgqueue." )
158 @lib.hook ( needchan
= False , wantchan
= True , glevel
= lib
. ADMIN
)
159 @lib.help ( "<nick> <message>" , "inject a line as though it came from <nick>" , "note that this injects lines, not commands" , "ex: INJECT DimeCadmium !WHOAMI" )
160 def inject ( bot
, user
, chan
, realtarget
, * args
):
161 targetuser
= bot
. parent
. user ( args
[ 0 ], create
= False )
162 if targetuser
is None :
163 bot
. msg ( user
, "User is unknown." )
165 if targetuser
. glevel
> user
. glevel
:
166 bot
. msg ( user
, "That user has a higher access level than you." )
170 bot
. parsemsg ( bot
. parent
. user ( args
[ 0 ], create
= False ), str ( chan
), ' ' . join ( args
[ 1 :]))
172 bot
. parsemsg ( bot
. parent
. user ( args
[ 0 ], create
= False ), str ( bot
), ' ' . join ( args
[ 1 :]))