【问题标题】:Python IRC bot only adminPython IRC bot 仅管理员
【发布时间】:2012-12-26 00:33:56
【问题描述】:

我想问一下如何让我的python irc bot运行仅由指定nick给出的命令?

我的机器人有 Skybot - Python IRC 机器人核心,它基于它。

这是在每个命令中导入的模块

import inspect
import re


def _hook_add(func, add, name=''):
if not hasattr(func, '_hook'):
    func._hook = []
func._hook.append(add)

if not hasattr(func, '_filename'):
    func._filename = func.func_code.co_filename

if not hasattr(func, '_args'):
    argspec = inspect.getargspec(func)
    if name:
        n_args = len(argspec.args)
        if argspec.defaults:
            n_args -= len(argspec.defaults)
        if argspec.keywords:
            n_args -= 1
        if argspec.varargs:
            n_args -= 1
        if n_args != 1:
            err = '%ss must take 1 non-keyword argument (%s)' % (name,
                        func.__name__)
            raise ValueError(err)

    args = []
    if argspec.defaults:
        end = bool(argspec.keywords) + bool(argspec.varargs)
        args.extend(argspec.args[-len(argspec.defaults):
                    end if end else None])
    if argspec.keywords:
        args.append(0)  # means kwargs present
    func._args = args

if not hasattr(func, '_thread'):  # does function run in its own thread?
    func._thread = False


def sieve(func):
    if func.func_code.co_argcount != 5:
        raise ValueError(
                'sieves must take 5 arguments: (bot, input, func, type, args)')
    _hook_add(func, ['sieve', (func,)])
    return func

def command(arg=None, **kwargs):
    args = {}

def command_wrapper(func):
    args.setdefault('name', func.func_name)
    _hook_add(func, ['command', (func, args)], 'command')
    return func

if kwargs or not inspect.isfunction(arg):
    if arg is not None:
        args['name'] = arg
    args.update(kwargs)
    return command_wrapper
else:
    return command_wrapper(arg)


def event(arg=None, **kwargs):
    args = kwargs

def event_wrapper(func):
    args['name'] = func.func_name
    args.setdefault('events', ['*'])
    _hook_add(func, ['event', (func, args)], 'event')
    return func

if inspect.isfunction(arg):
    return event_wrapper(arg, kwargs)
else:
    if arg is not None:
        args['events'] = arg.split()
    return event_wrapper


def singlethread(func):
    func._thread = True
    return func


def regex(regex, flags=0, **kwargs):
    args = kwargs

def regex_wrapper(func):
    args['name'] = func.func_name
    args['regex'] = regex
    args['re'] = re.compile(regex, flags)
    _hook_add(func, ['regex', (func, args)], 'regex')
    return func

if inspect.isfunction(regex):
    raise ValueError("regex decorators require a regex to match against")
else:
    return regex_wrapper

这就是一个简单命令的工作原理:

from util import hook, http

@hook.command
def calc(inp):
    '''.calc <term> google calc result'''

    h = http.get_html('http://www.google.com/search', q=inp)

    m = h.xpath('//h2[@class="r"]/text()')

    if not m:
        return "Could not calculate " + inp

    res = ' '.join(m[0].split())

    return res

另外,我想让它有 2 个管理员,就像只有 2 个人能够指挥它一样。我自己会这样做,但是看着代码我不知道该怎么做 :?

谢谢!

【问题讨论】:

    标签: python bots irc


    【解决方案1】:

    在您的函数中添加 nick 关键字参数,然后对照允许执行管理员命令的昵称列表检查该参数:

    administrators = ('nick1', 'nick2')
    
    @hook.command
    def someadmincommand(inp, nick=''):
        if nick not in administratiors:
            return 'I don't think so, {0}'.format(nick)
    
        # `nick` is an administrator, do your worst
    

    【讨论】:

    • 我会尝试并发布。谢谢。
    • 这就是我写的,我得到这个错误:> Traceback(最近一次调用最后一次):文件“core\reload.py”,第 89 行,> 在重新加载中 > eval(代码,命名空间)文件“plugins\ping.py”,第 5 行,在 > def ping(nick="",say=None):文件“plugins\util\hook.py”,第 63 行,在 command > return command_wrapper( arg) 文件 "plugins\util\hook.py", 第 54 行, 在 command_wrapper > _hook_add(func, ['command', (func, args)], 'command') 文件 "plugins\util\hook.py",第 26 行,在 _hook_add > raise ValueError(err) ValueError: commands must take 1 non-keyword argument (ping)
    • 这里是代码: from util import hook @hook.command("p") @hook.command def ping(nick="",say=None): administrators = ('tom', 'john') 如果 nick 不在管理员中:返回“no” 如果 nick 在管理员中:返回“成功”
    • @TomJenkins:你忘记了 inp 参数,你不能放弃它。
    • 好的,我也添加了 inp。它仍然给我一个错误。from util import hook @hook.command("p") @hook.command def ping(inp,nick="",say=None): administrators = ('tom', 'john' ) 如果 nick 不在管理员中:返回“no” 如果 nick 在管理员中:返回“succes” 这是错误:文件“core\main.py”,第 66 行,在用完 = func(input.inp, **kw )文件“plugins\ping.py”,第 7 行,如果 nick 不在管理员中,则在 ping 中:NameError:未定义全局名称“管理员”
    猜你喜欢
    • 2012-10-15
    • 1970-01-01
    • 2011-11-23
    • 2018-12-11
    • 1970-01-01
    • 2018-08-29
    • 2012-06-05
    • 2014-09-09
    • 2023-03-25
    相关资源
    最近更新 更多