mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-09-26 03:16:44 +08:00
feat: switch command entities to sdk
This commit is contained in:
@@ -3,10 +3,11 @@ from __future__ import annotations
|
|||||||
import typing
|
import typing
|
||||||
|
|
||||||
from ..core import app
|
from ..core import app
|
||||||
from . import entities, operator, errors
|
from . import operator
|
||||||
from ..utils import importutil
|
from ..utils import importutil
|
||||||
import langbot_plugin.api.entities.builtin.provider.session as provider_session
|
import langbot_plugin.api.entities.builtin.provider.session as provider_session
|
||||||
import langbot_plugin.api.entities.builtin.pipeline.query as pipeline_query
|
import langbot_plugin.api.entities.builtin.pipeline.query as pipeline_query
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context, errors as command_errors
|
||||||
|
|
||||||
# 引入所有算子以便注册
|
# 引入所有算子以便注册
|
||||||
from . import operators
|
from . import operators
|
||||||
@@ -57,10 +58,10 @@ class CommandManager:
|
|||||||
|
|
||||||
async def _execute(
|
async def _execute(
|
||||||
self,
|
self,
|
||||||
context: entities.ExecuteContext,
|
context: command_context.ExecuteContext,
|
||||||
operator_list: list[operator.CommandOperator],
|
operator_list: list[operator.CommandOperator],
|
||||||
operator: operator.CommandOperator = None,
|
operator: operator.CommandOperator = None,
|
||||||
) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
"""执行命令"""
|
"""执行命令"""
|
||||||
|
|
||||||
found = False
|
found = False
|
||||||
@@ -80,10 +81,10 @@ class CommandManager:
|
|||||||
|
|
||||||
if not found: # 如果下一个参数未在此节点的子节点中找到,则执行此节点或者报错
|
if not found: # 如果下一个参数未在此节点的子节点中找到,则执行此节点或者报错
|
||||||
if operator is None:
|
if operator is None:
|
||||||
yield entities.CommandReturn(error=errors.CommandNotFoundError(context.crt_params[0]))
|
yield command_context.CommandReturn(error=command_errors.CommandNotFoundError(context.crt_params[0]))
|
||||||
else:
|
else:
|
||||||
if operator.lowest_privilege > context.privilege:
|
if operator.lowest_privilege > context.privilege:
|
||||||
yield entities.CommandReturn(error=errors.CommandPrivilegeError(operator.name))
|
yield command_context.CommandReturn(error=command_errors.CommandPrivilegeError(operator.name))
|
||||||
else:
|
else:
|
||||||
async for ret in operator.execute(context):
|
async for ret in operator.execute(context):
|
||||||
yield ret
|
yield ret
|
||||||
@@ -93,7 +94,7 @@ class CommandManager:
|
|||||||
command_text: str,
|
command_text: str,
|
||||||
query: pipeline_query.Query,
|
query: pipeline_query.Query,
|
||||||
session: provider_session.Session,
|
session: provider_session.Session,
|
||||||
) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
"""执行命令"""
|
"""执行命令"""
|
||||||
|
|
||||||
privilege = 1
|
privilege = 1
|
||||||
@@ -101,7 +102,7 @@ class CommandManager:
|
|||||||
if f'{query.launcher_type.value}_{query.launcher_id}' in self.ap.instance_config.data['admins']:
|
if f'{query.launcher_type.value}_{query.launcher_id}' in self.ap.instance_config.data['admins']:
|
||||||
privilege = 2
|
privilege = 2
|
||||||
|
|
||||||
ctx = entities.ExecuteContext(
|
ctx = command_context.ExecuteContext(
|
||||||
query=query,
|
query=query,
|
||||||
session=session,
|
session=session,
|
||||||
command_text=command_text,
|
command_text=command_text,
|
||||||
|
|||||||
@@ -1,75 +0,0 @@
|
|||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
import typing
|
|
||||||
|
|
||||||
import pydantic
|
|
||||||
|
|
||||||
import langbot_plugin.api.entities.builtin.provider.session as provider_session
|
|
||||||
from . import errors
|
|
||||||
import langbot_plugin.api.entities.builtin.platform.message as platform_message
|
|
||||||
import langbot_plugin.api.entities.builtin.pipeline.query as pipeline_query
|
|
||||||
|
|
||||||
|
|
||||||
class CommandReturn(pydantic.BaseModel):
|
|
||||||
"""命令返回值"""
|
|
||||||
|
|
||||||
text: typing.Optional[str] = None
|
|
||||||
"""文本
|
|
||||||
"""
|
|
||||||
|
|
||||||
image: typing.Optional[platform_message.Image] = None
|
|
||||||
"""弃用"""
|
|
||||||
|
|
||||||
image_url: typing.Optional[str] = None
|
|
||||||
"""图片链接
|
|
||||||
"""
|
|
||||||
|
|
||||||
error: typing.Optional[errors.CommandError] = None
|
|
||||||
"""错误
|
|
||||||
"""
|
|
||||||
|
|
||||||
class Config:
|
|
||||||
arbitrary_types_allowed = True
|
|
||||||
|
|
||||||
|
|
||||||
class ExecuteContext(pydantic.BaseModel):
|
|
||||||
"""单次命令执行上下文"""
|
|
||||||
|
|
||||||
query: pipeline_query.Query
|
|
||||||
"""本次消息的请求对象"""
|
|
||||||
|
|
||||||
session: provider_session.Session
|
|
||||||
"""本次消息所属的会话对象"""
|
|
||||||
|
|
||||||
command_text: str
|
|
||||||
"""命令完整文本"""
|
|
||||||
|
|
||||||
command: str
|
|
||||||
"""命令名称"""
|
|
||||||
|
|
||||||
crt_command: str
|
|
||||||
"""当前命令
|
|
||||||
|
|
||||||
多级命令中crt_command为当前命令,command为根命令。
|
|
||||||
例如:!plugin on Webwlkr
|
|
||||||
处理到plugin时,command为plugin,crt_command为plugin
|
|
||||||
处理到on时,command为plugin,crt_command为on
|
|
||||||
"""
|
|
||||||
|
|
||||||
params: list[str]
|
|
||||||
"""命令参数
|
|
||||||
|
|
||||||
整个命令以空格分割后的参数列表
|
|
||||||
"""
|
|
||||||
|
|
||||||
crt_params: list[str]
|
|
||||||
"""当前命令参数
|
|
||||||
|
|
||||||
多级命令中crt_params为当前命令参数,params为根命令参数。
|
|
||||||
例如:!plugin on Webwlkr
|
|
||||||
处理到plugin时,params为['on', 'Webwlkr'],crt_params为['on', 'Webwlkr']
|
|
||||||
处理到on时,params为['on', 'Webwlkr'],crt_params为['Webwlkr']
|
|
||||||
"""
|
|
||||||
|
|
||||||
privilege: int
|
|
||||||
"""发起人权限"""
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
class CommandError(Exception):
|
|
||||||
def __init__(self, message: str = None):
|
|
||||||
self.message = message
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.message
|
|
||||||
|
|
||||||
|
|
||||||
class CommandNotFoundError(CommandError):
|
|
||||||
def __init__(self, message: str = None):
|
|
||||||
super().__init__('未知命令: ' + message)
|
|
||||||
|
|
||||||
|
|
||||||
class CommandPrivilegeError(CommandError):
|
|
||||||
def __init__(self, message: str = None):
|
|
||||||
super().__init__('权限不足: ' + message)
|
|
||||||
|
|
||||||
|
|
||||||
class ParamNotEnoughError(CommandError):
|
|
||||||
def __init__(self, message: str = None):
|
|
||||||
super().__init__('参数不足: ' + message)
|
|
||||||
|
|
||||||
|
|
||||||
class CommandOperationError(CommandError):
|
|
||||||
def __init__(self, message: str = None):
|
|
||||||
super().__init__('操作失败: ' + message)
|
|
||||||
@@ -4,7 +4,7 @@ import typing
|
|||||||
import abc
|
import abc
|
||||||
|
|
||||||
from ..core import app
|
from ..core import app
|
||||||
from . import entities
|
from langbot_plugin.api.entities.builtin.command import context as command_context
|
||||||
|
|
||||||
|
|
||||||
preregistered_operators: list[typing.Type[CommandOperator]] = []
|
preregistered_operators: list[typing.Type[CommandOperator]] = []
|
||||||
@@ -95,16 +95,18 @@ class CommandOperator(metaclass=abc.ABCMeta):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
"""实现此方法以执行命令
|
"""实现此方法以执行命令
|
||||||
|
|
||||||
支持多次yield以返回多个结果。
|
支持多次yield以返回多个结果。
|
||||||
例如:一个安装插件的命令,可能会有下载、解压、安装等多个步骤,每个步骤都可以返回一个结果。
|
例如:一个安装插件的命令,可能会有下载、解压、安装等多个步骤,每个步骤都可以返回一个结果。
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
context (entities.ExecuteContext): 命令执行上下文
|
context (command_context.ExecuteContext): 命令执行上下文
|
||||||
|
|
||||||
Yields:
|
Yields:
|
||||||
entities.CommandReturn: 命令返回封装
|
command_context.CommandReturn: 命令返回封装
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -2,14 +2,17 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from .. import operator, entities, errors
|
from .. import operator
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context, errors as command_errors
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='cmd', help='显示命令列表', usage='!cmd\n!cmd <命令名称>')
|
@operator.operator_class(name='cmd', help='显示命令列表', usage='!cmd\n!cmd <命令名称>')
|
||||||
class CmdOperator(operator.CommandOperator):
|
class CmdOperator(operator.CommandOperator):
|
||||||
"""命令列表"""
|
"""命令列表"""
|
||||||
|
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
"""执行"""
|
"""执行"""
|
||||||
if len(context.crt_params) == 0:
|
if len(context.crt_params) == 0:
|
||||||
reply_str = '当前所有命令: \n\n'
|
reply_str = '当前所有命令: \n\n'
|
||||||
@@ -20,7 +23,7 @@ class CmdOperator(operator.CommandOperator):
|
|||||||
|
|
||||||
reply_str += '\n使用 !cmd <命令名称> 查看命令的详细帮助'
|
reply_str += '\n使用 !cmd <命令名称> 查看命令的详细帮助'
|
||||||
|
|
||||||
yield entities.CommandReturn(text=reply_str.strip())
|
yield command_context.CommandReturn(text=reply_str.strip())
|
||||||
|
|
||||||
else:
|
else:
|
||||||
cmd_name = context.crt_params[0]
|
cmd_name = context.crt_params[0]
|
||||||
@@ -33,9 +36,9 @@ class CmdOperator(operator.CommandOperator):
|
|||||||
break
|
break
|
||||||
|
|
||||||
if cmd is None:
|
if cmd is None:
|
||||||
yield entities.CommandReturn(error=errors.CommandNotFoundError(cmd_name))
|
yield command_context.CommandReturn(error=command_errors.CommandNotFoundError(cmd_name))
|
||||||
else:
|
else:
|
||||||
reply_str = f'{cmd.name}: {cmd.help}\n\n'
|
reply_str = f'{cmd.name}: {cmd.help}\n\n'
|
||||||
reply_str += f'使用方法: \n{cmd.usage}'
|
reply_str += f'使用方法: \n{cmd.usage}'
|
||||||
|
|
||||||
yield entities.CommandReturn(text=reply_str.strip())
|
yield command_context.CommandReturn(text=reply_str.strip())
|
||||||
|
|||||||
@@ -2,23 +2,26 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from .. import operator, entities, errors
|
from .. import operator
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context, errors as command_errors
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='del', help='删除当前会话的历史记录', usage='!del <序号>\n!del all')
|
@operator.operator_class(name='del', help='删除当前会话的历史记录', usage='!del <序号>\n!del all')
|
||||||
class DelOperator(operator.CommandOperator):
|
class DelOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
if context.session.conversations:
|
if context.session.conversations:
|
||||||
delete_index = 0
|
delete_index = 0
|
||||||
if len(context.crt_params) > 0:
|
if len(context.crt_params) > 0:
|
||||||
try:
|
try:
|
||||||
delete_index = int(context.crt_params[0])
|
delete_index = int(context.crt_params[0])
|
||||||
except Exception:
|
except Exception:
|
||||||
yield entities.CommandReturn(error=errors.CommandOperationError('索引必须是整数'))
|
yield command_context.CommandReturn(error=command_errors.CommandOperationError('索引必须是整数'))
|
||||||
return
|
return
|
||||||
|
|
||||||
if delete_index < 0 or delete_index >= len(context.session.conversations):
|
if delete_index < 0 or delete_index >= len(context.session.conversations):
|
||||||
yield entities.CommandReturn(error=errors.CommandOperationError('索引超出范围'))
|
yield command_context.CommandReturn(error=command_errors.CommandOperationError('索引超出范围'))
|
||||||
return
|
return
|
||||||
|
|
||||||
# 倒序
|
# 倒序
|
||||||
@@ -29,15 +32,17 @@ class DelOperator(operator.CommandOperator):
|
|||||||
|
|
||||||
del context.session.conversations[to_delete_index]
|
del context.session.conversations[to_delete_index]
|
||||||
|
|
||||||
yield entities.CommandReturn(text=f'已删除对话: {delete_index}')
|
yield command_context.CommandReturn(text=f'已删除对话: {delete_index}')
|
||||||
else:
|
else:
|
||||||
yield entities.CommandReturn(error=errors.CommandOperationError('当前没有对话'))
|
yield command_context.CommandReturn(error=command_errors.CommandOperationError('当前没有对话'))
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='all', help='删除此会话的所有历史记录', parent_class=DelOperator)
|
@operator.operator_class(name='all', help='删除此会话的所有历史记录', parent_class=DelOperator)
|
||||||
class DelAllOperator(operator.CommandOperator):
|
class DelAllOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
context.session.conversations = []
|
context.session.conversations = []
|
||||||
context.session.using_conversation = None
|
context.session.using_conversation = None
|
||||||
|
|
||||||
yield entities.CommandReturn(text='已删除所有对话')
|
yield command_context.CommandReturn(text='已删除所有对话')
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
from typing import AsyncGenerator
|
from typing import AsyncGenerator
|
||||||
|
|
||||||
from .. import operator, entities
|
from .. import operator
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='func', help='查看所有已注册的内容函数', usage='!func')
|
@operator.operator_class(name='func', help='查看所有已注册的内容函数', usage='!func')
|
||||||
class FuncOperator(operator.CommandOperator):
|
class FuncOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
reply_str = '当前已启用的内容函数: \n\n'
|
reply_str = '当前已启用的内容函数: \n\n'
|
||||||
|
|
||||||
index = 1
|
index = 1
|
||||||
@@ -21,4 +24,4 @@ class FuncOperator(operator.CommandOperator):
|
|||||||
)
|
)
|
||||||
index += 1
|
index += 1
|
||||||
|
|
||||||
yield entities.CommandReturn(text=reply_str)
|
yield command_context.CommandReturn(text=reply_str)
|
||||||
|
|||||||
@@ -2,14 +2,17 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from .. import operator, entities
|
from .. import operator
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='help', help='显示帮助', usage='!help\n!help <命令名称>')
|
@operator.operator_class(name='help', help='显示帮助', usage='!help\n!help <命令名称>')
|
||||||
class HelpOperator(operator.CommandOperator):
|
class HelpOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
help = 'LangBot - 大语言模型原生即时通信机器人平台\n链接:https://langbot.app'
|
help = 'LangBot - 大语言模型原生即时通信机器人平台\n链接:https://langbot.app'
|
||||||
|
|
||||||
help += '\n发送命令 !cmd 可查看命令列表'
|
help += '\n发送命令 !cmd 可查看命令列表'
|
||||||
|
|
||||||
yield entities.CommandReturn(text=help)
|
yield command_context.CommandReturn(text=help)
|
||||||
|
|||||||
@@ -3,26 +3,31 @@ from __future__ import annotations
|
|||||||
import typing
|
import typing
|
||||||
|
|
||||||
|
|
||||||
from .. import operator, entities, errors
|
from .. import operator
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context, errors as command_errors
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='last', help='切换到前一个对话', usage='!last')
|
@operator.operator_class(name='last', help='切换到前一个对话', usage='!last')
|
||||||
class LastOperator(operator.CommandOperator):
|
class LastOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
if context.session.conversations:
|
if context.session.conversations:
|
||||||
# 找到当前会话的上一个会话
|
# 找到当前会话的上一个会话
|
||||||
for index in range(len(context.session.conversations) - 1, -1, -1):
|
for index in range(len(context.session.conversations) - 1, -1, -1):
|
||||||
if context.session.conversations[index] == context.session.using_conversation:
|
if context.session.conversations[index] == context.session.using_conversation:
|
||||||
if index == 0:
|
if index == 0:
|
||||||
yield entities.CommandReturn(error=errors.CommandOperationError('已经是第一个对话了'))
|
yield command_context.CommandReturn(
|
||||||
|
error=command_errors.CommandOperationError('已经是第一个对话了')
|
||||||
|
)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
context.session.using_conversation = context.session.conversations[index - 1]
|
context.session.using_conversation = context.session.conversations[index - 1]
|
||||||
time_str = context.session.using_conversation.create_time.strftime('%Y-%m-%d %H:%M:%S')
|
time_str = context.session.using_conversation.create_time.strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
yield entities.CommandReturn(
|
yield command_context.CommandReturn(
|
||||||
text=f'已切换到上一个对话: {index} {time_str}: {context.session.using_conversation.messages[0].readable_str()}'
|
text=f'已切换到上一个对话: {index} {time_str}: {context.session.using_conversation.messages[0].readable_str()}'
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
yield entities.CommandReturn(error=errors.CommandOperationError('当前没有对话'))
|
yield command_context.CommandReturn(error=command_errors.CommandOperationError('当前没有对话'))
|
||||||
|
|||||||
@@ -2,19 +2,22 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from .. import operator, entities, errors
|
from .. import operator
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context, errors as command_errors
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='list', help='列出此会话中的所有历史对话', usage='!list\n!list <页码>')
|
@operator.operator_class(name='list', help='列出此会话中的所有历史对话', usage='!list\n!list <页码>')
|
||||||
class ListOperator(operator.CommandOperator):
|
class ListOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
page = 0
|
page = 0
|
||||||
|
|
||||||
if len(context.crt_params) > 0:
|
if len(context.crt_params) > 0:
|
||||||
try:
|
try:
|
||||||
page = int(context.crt_params[0] - 1)
|
page = int(context.crt_params[0] - 1)
|
||||||
except Exception:
|
except Exception:
|
||||||
yield entities.CommandReturn(error=errors.CommandOperationError('页码应为整数'))
|
yield command_context.CommandReturn(error=command_errors.CommandOperationError('页码应为整数'))
|
||||||
return
|
return
|
||||||
|
|
||||||
record_per_page = 10
|
record_per_page = 10
|
||||||
@@ -45,4 +48,4 @@ class ListOperator(operator.CommandOperator):
|
|||||||
else:
|
else:
|
||||||
content += f'\n当前会话: {using_conv_index} {context.session.using_conversation.create_time.strftime("%Y-%m-%d %H:%M:%S")}: {context.session.using_conversation.messages[0].readable_str() if len(context.session.using_conversation.messages) > 0 else "无内容"}'
|
content += f'\n当前会话: {using_conv_index} {context.session.using_conversation.create_time.strftime("%Y-%m-%d %H:%M:%S")}: {context.session.using_conversation.messages[0].readable_str() if len(context.session.using_conversation.messages) > 0 else "无内容"}'
|
||||||
|
|
||||||
yield entities.CommandReturn(text=f'第 {page + 1} 页 (时间倒序):\n{content}')
|
yield command_context.CommandReturn(text=f'第 {page + 1} 页 (时间倒序):\n{content}')
|
||||||
|
|||||||
@@ -2,26 +2,31 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from .. import operator, entities, errors
|
from .. import operator
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context, errors as command_errors
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='next', help='切换到后一个对话', usage='!next')
|
@operator.operator_class(name='next', help='切换到后一个对话', usage='!next')
|
||||||
class NextOperator(operator.CommandOperator):
|
class NextOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
if context.session.conversations:
|
if context.session.conversations:
|
||||||
# 找到当前会话的下一个会话
|
# 找到当前会话的下一个会话
|
||||||
for index in range(len(context.session.conversations)):
|
for index in range(len(context.session.conversations)):
|
||||||
if context.session.conversations[index] == context.session.using_conversation:
|
if context.session.conversations[index] == context.session.using_conversation:
|
||||||
if index == len(context.session.conversations) - 1:
|
if index == len(context.session.conversations) - 1:
|
||||||
yield entities.CommandReturn(error=errors.CommandOperationError('已经是最后一个对话了'))
|
yield command_context.CommandReturn(
|
||||||
|
error=command_errors.CommandOperationError('已经是最后一个对话了')
|
||||||
|
)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
context.session.using_conversation = context.session.conversations[index + 1]
|
context.session.using_conversation = context.session.conversations[index + 1]
|
||||||
time_str = context.session.using_conversation.create_time.strftime('%Y-%m-%d %H:%M:%S')
|
time_str = context.session.using_conversation.create_time.strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
yield entities.CommandReturn(
|
yield command_context.CommandReturn(
|
||||||
text=f'已切换到后一个对话: {index} {time_str}: {context.session.using_conversation.messages[0].content}'
|
text=f'已切换到后一个对话: {index} {time_str}: {context.session.using_conversation.messages[0].content}'
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
yield entities.CommandReturn(error=errors.CommandOperationError('当前没有对话'))
|
yield command_context.CommandReturn(error=command_errors.CommandOperationError('当前没有对话'))
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ from __future__ import annotations
|
|||||||
import typing
|
import typing
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
from .. import operator, entities, errors
|
from .. import operator
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context, errors as command_errors
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(
|
@operator.operator_class(
|
||||||
@@ -11,7 +12,9 @@ from .. import operator, entities, errors
|
|||||||
usage='!plugin\n!plugin get <插件仓库地址>\n!plugin update\n!plugin del <插件名>\n!plugin on <插件名>\n!plugin off <插件名>',
|
usage='!plugin\n!plugin get <插件仓库地址>\n!plugin update\n!plugin del <插件名>\n!plugin on <插件名>\n!plugin off <插件名>',
|
||||||
)
|
)
|
||||||
class PluginOperator(operator.CommandOperator):
|
class PluginOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
plugin_list = self.ap.plugin_mgr.plugins()
|
plugin_list = self.ap.plugin_mgr.plugins()
|
||||||
reply_str = '所有插件({}):\n'.format(len(plugin_list))
|
reply_str = '所有插件({}):\n'.format(len(plugin_list))
|
||||||
idx = 0
|
idx = 0
|
||||||
@@ -27,32 +30,36 @@ class PluginOperator(operator.CommandOperator):
|
|||||||
|
|
||||||
idx += 1
|
idx += 1
|
||||||
|
|
||||||
yield entities.CommandReturn(text=reply_str)
|
yield command_context.CommandReturn(text=reply_str)
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='get', help='安装插件', privilege=2, parent_class=PluginOperator)
|
@operator.operator_class(name='get', help='安装插件', privilege=2, parent_class=PluginOperator)
|
||||||
class PluginGetOperator(operator.CommandOperator):
|
class PluginGetOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
if len(context.crt_params) == 0:
|
if len(context.crt_params) == 0:
|
||||||
yield entities.CommandReturn(error=errors.ParamNotEnoughError('请提供插件仓库地址'))
|
yield command_context.CommandReturn(error=command_errors.ParamNotEnoughError('请提供插件仓库地址'))
|
||||||
else:
|
else:
|
||||||
repo = context.crt_params[0]
|
repo = context.crt_params[0]
|
||||||
|
|
||||||
yield entities.CommandReturn(text='正在安装插件...')
|
yield command_context.CommandReturn(text='正在安装插件...')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await self.ap.plugin_mgr.install_plugin(repo)
|
await self.ap.plugin_mgr.install_plugin(repo)
|
||||||
yield entities.CommandReturn(text='插件安装成功,请重启程序以加载插件')
|
yield command_context.CommandReturn(text='插件安装成功,请重启程序以加载插件')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
yield entities.CommandReturn(error=errors.CommandError('插件安装失败: ' + str(e)))
|
yield command_context.CommandReturn(error=command_errors.CommandError('插件安装失败: ' + str(e)))
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='update', help='更新插件', privilege=2, parent_class=PluginOperator)
|
@operator.operator_class(name='update', help='更新插件', privilege=2, parent_class=PluginOperator)
|
||||||
class PluginUpdateOperator(operator.CommandOperator):
|
class PluginUpdateOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
if len(context.crt_params) == 0:
|
if len(context.crt_params) == 0:
|
||||||
yield entities.CommandReturn(error=errors.ParamNotEnoughError('请提供插件名称'))
|
yield command_context.CommandReturn(error=command_errors.ParamNotEnoughError('请提供插件名称'))
|
||||||
else:
|
else:
|
||||||
plugin_name = context.crt_params[0]
|
plugin_name = context.crt_params[0]
|
||||||
|
|
||||||
@@ -60,24 +67,26 @@ class PluginUpdateOperator(operator.CommandOperator):
|
|||||||
plugin_container = self.ap.plugin_mgr.get_plugin_by_name(plugin_name)
|
plugin_container = self.ap.plugin_mgr.get_plugin_by_name(plugin_name)
|
||||||
|
|
||||||
if plugin_container is not None:
|
if plugin_container is not None:
|
||||||
yield entities.CommandReturn(text='正在更新插件...')
|
yield command_context.CommandReturn(text='正在更新插件...')
|
||||||
await self.ap.plugin_mgr.update_plugin(plugin_name)
|
await self.ap.plugin_mgr.update_plugin(plugin_name)
|
||||||
yield entities.CommandReturn(text='插件更新成功,请重启程序以加载插件')
|
yield command_context.CommandReturn(text='插件更新成功,请重启程序以加载插件')
|
||||||
else:
|
else:
|
||||||
yield entities.CommandReturn(error=errors.CommandError('插件更新失败: 未找到插件'))
|
yield command_context.CommandReturn(error=command_errors.CommandError('插件更新失败: 未找到插件'))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
yield entities.CommandReturn(error=errors.CommandError('插件更新失败: ' + str(e)))
|
yield command_context.CommandReturn(error=command_errors.CommandError('插件更新失败: ' + str(e)))
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='all', help='更新所有插件', privilege=2, parent_class=PluginUpdateOperator)
|
@operator.operator_class(name='all', help='更新所有插件', privilege=2, parent_class=PluginUpdateOperator)
|
||||||
class PluginUpdateAllOperator(operator.CommandOperator):
|
class PluginUpdateAllOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
try:
|
try:
|
||||||
plugins = [p.plugin_name for p in self.ap.plugin_mgr.plugins()]
|
plugins = [p.plugin_name for p in self.ap.plugin_mgr.plugins()]
|
||||||
|
|
||||||
if plugins:
|
if plugins:
|
||||||
yield entities.CommandReturn(text='正在更新插件...')
|
yield command_context.CommandReturn(text='正在更新插件...')
|
||||||
updated = []
|
updated = []
|
||||||
try:
|
try:
|
||||||
for plugin_name in plugins:
|
for plugin_name in plugins:
|
||||||
@@ -85,20 +94,22 @@ class PluginUpdateAllOperator(operator.CommandOperator):
|
|||||||
updated.append(plugin_name)
|
updated.append(plugin_name)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
yield entities.CommandReturn(error=errors.CommandError('插件更新失败: ' + str(e)))
|
yield command_context.CommandReturn(error=command_errors.CommandError('插件更新失败: ' + str(e)))
|
||||||
yield entities.CommandReturn(text='已更新插件: {}'.format(', '.join(updated)))
|
yield command_context.CommandReturn(text='已更新插件: {}'.format(', '.join(updated)))
|
||||||
else:
|
else:
|
||||||
yield entities.CommandReturn(text='没有可更新的插件')
|
yield command_context.CommandReturn(text='没有可更新的插件')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
yield entities.CommandReturn(error=errors.CommandError('插件更新失败: ' + str(e)))
|
yield command_context.CommandReturn(error=command_errors.CommandError('插件更新失败: ' + str(e)))
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='del', help='删除插件', privilege=2, parent_class=PluginOperator)
|
@operator.operator_class(name='del', help='删除插件', privilege=2, parent_class=PluginOperator)
|
||||||
class PluginDelOperator(operator.CommandOperator):
|
class PluginDelOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
if len(context.crt_params) == 0:
|
if len(context.crt_params) == 0:
|
||||||
yield entities.CommandReturn(error=errors.ParamNotEnoughError('请提供插件名称'))
|
yield command_context.CommandReturn(error=command_errors.ParamNotEnoughError('请提供插件名称'))
|
||||||
else:
|
else:
|
||||||
plugin_name = context.crt_params[0]
|
plugin_name = context.crt_params[0]
|
||||||
|
|
||||||
@@ -106,51 +117,55 @@ class PluginDelOperator(operator.CommandOperator):
|
|||||||
plugin_container = self.ap.plugin_mgr.get_plugin_by_name(plugin_name)
|
plugin_container = self.ap.plugin_mgr.get_plugin_by_name(plugin_name)
|
||||||
|
|
||||||
if plugin_container is not None:
|
if plugin_container is not None:
|
||||||
yield entities.CommandReturn(text='正在删除插件...')
|
yield command_context.CommandReturn(text='正在删除插件...')
|
||||||
await self.ap.plugin_mgr.uninstall_plugin(plugin_name)
|
await self.ap.plugin_mgr.uninstall_plugin(plugin_name)
|
||||||
yield entities.CommandReturn(text='插件删除成功,请重启程序以加载插件')
|
yield command_context.CommandReturn(text='插件删除成功,请重启程序以加载插件')
|
||||||
else:
|
else:
|
||||||
yield entities.CommandReturn(error=errors.CommandError('插件删除失败: 未找到插件'))
|
yield command_context.CommandReturn(error=command_errors.CommandError('插件删除失败: 未找到插件'))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
yield entities.CommandReturn(error=errors.CommandError('插件删除失败: ' + str(e)))
|
yield command_context.CommandReturn(error=command_errors.CommandError('插件删除失败: ' + str(e)))
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='on', help='启用插件', privilege=2, parent_class=PluginOperator)
|
@operator.operator_class(name='on', help='启用插件', privilege=2, parent_class=PluginOperator)
|
||||||
class PluginEnableOperator(operator.CommandOperator):
|
class PluginEnableOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
if len(context.crt_params) == 0:
|
if len(context.crt_params) == 0:
|
||||||
yield entities.CommandReturn(error=errors.ParamNotEnoughError('请提供插件名称'))
|
yield command_context.CommandReturn(error=command_errors.ParamNotEnoughError('请提供插件名称'))
|
||||||
else:
|
else:
|
||||||
plugin_name = context.crt_params[0]
|
plugin_name = context.crt_params[0]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if await self.ap.plugin_mgr.update_plugin_switch(plugin_name, True):
|
if await self.ap.plugin_mgr.update_plugin_switch(plugin_name, True):
|
||||||
yield entities.CommandReturn(text='已启用插件: {}'.format(plugin_name))
|
yield command_context.CommandReturn(text='已启用插件: {}'.format(plugin_name))
|
||||||
else:
|
else:
|
||||||
yield entities.CommandReturn(
|
yield command_context.CommandReturn(
|
||||||
error=errors.CommandError('插件状态修改失败: 未找到插件 {}'.format(plugin_name))
|
error=command_errors.CommandError('插件状态修改失败: 未找到插件 {}'.format(plugin_name))
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
yield entities.CommandReturn(error=errors.CommandError('插件状态修改失败: ' + str(e)))
|
yield command_context.CommandReturn(error=command_errors.CommandError('插件状态修改失败: ' + str(e)))
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='off', help='禁用插件', privilege=2, parent_class=PluginOperator)
|
@operator.operator_class(name='off', help='禁用插件', privilege=2, parent_class=PluginOperator)
|
||||||
class PluginDisableOperator(operator.CommandOperator):
|
class PluginDisableOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
if len(context.crt_params) == 0:
|
if len(context.crt_params) == 0:
|
||||||
yield entities.CommandReturn(error=errors.ParamNotEnoughError('请提供插件名称'))
|
yield command_context.CommandReturn(error=command_errors.ParamNotEnoughError('请提供插件名称'))
|
||||||
else:
|
else:
|
||||||
plugin_name = context.crt_params[0]
|
plugin_name = context.crt_params[0]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if await self.ap.plugin_mgr.update_plugin_switch(plugin_name, False):
|
if await self.ap.plugin_mgr.update_plugin_switch(plugin_name, False):
|
||||||
yield entities.CommandReturn(text='已禁用插件: {}'.format(plugin_name))
|
yield command_context.CommandReturn(text='已禁用插件: {}'.format(plugin_name))
|
||||||
else:
|
else:
|
||||||
yield entities.CommandReturn(
|
yield command_context.CommandReturn(
|
||||||
error=errors.CommandError('插件状态修改失败: 未找到插件 {}'.format(plugin_name))
|
error=command_errors.CommandError('插件状态修改失败: 未找到插件 {}'.format(plugin_name))
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
yield entities.CommandReturn(error=errors.CommandError('插件状态修改失败: ' + str(e)))
|
yield command_context.CommandReturn(error=command_errors.CommandError('插件状态修改失败: ' + str(e)))
|
||||||
|
|||||||
@@ -2,19 +2,22 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from .. import operator, entities, errors
|
from .. import operator
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context, errors as command_errors
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='prompt', help='查看当前对话的前文', usage='!prompt')
|
@operator.operator_class(name='prompt', help='查看当前对话的前文', usage='!prompt')
|
||||||
class PromptOperator(operator.CommandOperator):
|
class PromptOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
"""执行"""
|
"""执行"""
|
||||||
if context.session.using_conversation is None:
|
if context.session.using_conversation is None:
|
||||||
yield entities.CommandReturn(error=errors.CommandOperationError('当前没有对话'))
|
yield command_context.CommandReturn(error=command_errors.CommandOperationError('当前没有对话'))
|
||||||
else:
|
else:
|
||||||
reply_str = '当前对话所有内容:\n\n'
|
reply_str = '当前对话所有内容:\n\n'
|
||||||
|
|
||||||
for msg in context.session.using_conversation.messages:
|
for msg in context.session.using_conversation.messages:
|
||||||
reply_str += f'{msg.role}: {msg.content}\n'
|
reply_str += f'{msg.role}: {msg.content}\n'
|
||||||
|
|
||||||
yield entities.CommandReturn(text=reply_str)
|
yield command_context.CommandReturn(text=reply_str)
|
||||||
|
|||||||
@@ -2,15 +2,18 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from .. import operator, entities, errors
|
from .. import operator
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context, errors as command_errors
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='resend', help='重发当前会话的最后一条消息', usage='!resend')
|
@operator.operator_class(name='resend', help='重发当前会话的最后一条消息', usage='!resend')
|
||||||
class ResendOperator(operator.CommandOperator):
|
class ResendOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
# 回滚到最后一条用户message前
|
# 回滚到最后一条用户message前
|
||||||
if context.session.using_conversation is None:
|
if context.session.using_conversation is None:
|
||||||
yield entities.CommandReturn(error=errors.CommandError('当前没有对话'))
|
yield command_context.CommandReturn(error=command_errors.CommandError('当前没有对话'))
|
||||||
else:
|
else:
|
||||||
conv_msg = context.session.using_conversation.messages
|
conv_msg = context.session.using_conversation.messages
|
||||||
|
|
||||||
@@ -23,4 +26,4 @@ class ResendOperator(operator.CommandOperator):
|
|||||||
conv_msg.pop()
|
conv_msg.pop()
|
||||||
|
|
||||||
# 不重发了,提示用户已删除就行了
|
# 不重发了,提示用户已删除就行了
|
||||||
yield entities.CommandReturn(text='已删除最后一次请求记录')
|
yield command_context.CommandReturn(text='已删除最后一次请求记录')
|
||||||
|
|||||||
@@ -2,13 +2,16 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from .. import operator, entities
|
from .. import operator
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='reset', help='重置当前会话', usage='!reset')
|
@operator.operator_class(name='reset', help='重置当前会话', usage='!reset')
|
||||||
class ResetOperator(operator.CommandOperator):
|
class ResetOperator(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
"""执行"""
|
"""执行"""
|
||||||
context.session.using_conversation = None
|
context.session.using_conversation = None
|
||||||
|
|
||||||
yield entities.CommandReturn(text='已重置当前会话')
|
yield command_context.CommandReturn(text='已重置当前会话')
|
||||||
|
|||||||
@@ -2,10 +2,13 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from .. import operator, entities
|
from .. import operator
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='update', help='更新程序', usage='!update', privilege=2)
|
@operator.operator_class(name='update', help='更新程序', usage='!update', privilege=2)
|
||||||
class UpdateCommand(operator.CommandOperator):
|
class UpdateCommand(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
yield entities.CommandReturn(text='不再支持通过命令更新,请查看 LangBot 文档。')
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
|
yield command_context.CommandReturn(text='不再支持通过命令更新,请查看 LangBot 文档。')
|
||||||
|
|||||||
@@ -2,12 +2,15 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from .. import operator, entities
|
from .. import operator
|
||||||
|
from langbot_plugin.api.entities.builtin.command import context as command_context
|
||||||
|
|
||||||
|
|
||||||
@operator.operator_class(name='version', help='显示版本信息', usage='!version')
|
@operator.operator_class(name='version', help='显示版本信息', usage='!version')
|
||||||
class VersionCommand(operator.CommandOperator):
|
class VersionCommand(operator.CommandOperator):
|
||||||
async def execute(self, context: entities.ExecuteContext) -> typing.AsyncGenerator[entities.CommandReturn, None]:
|
async def execute(
|
||||||
|
self, context: command_context.ExecuteContext
|
||||||
|
) -> typing.AsyncGenerator[command_context.CommandReturn, None]:
|
||||||
reply_str = f'当前版本: \n{self.ap.ver_mgr.get_current_version()}'
|
reply_str = f'当前版本: \n{self.ap.ver_mgr.get_current_version()}'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -16,4 +19,4 @@ class VersionCommand(operator.CommandOperator):
|
|||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
yield entities.CommandReturn(text=reply_str.strip())
|
yield command_context.CommandReturn(text=reply_str.strip())
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ from libs.official_account_api.api import OAClientForLongerResponse
|
|||||||
import langbot_plugin.api.entities.builtin.platform.entities as platform_entities
|
import langbot_plugin.api.entities.builtin.platform.entities as platform_entities
|
||||||
import langbot_plugin.api.entities.builtin.platform.message as platform_message
|
import langbot_plugin.api.entities.builtin.platform.message as platform_message
|
||||||
import langbot_plugin.api.entities.builtin.platform.events as platform_events
|
import langbot_plugin.api.entities.builtin.platform.events as platform_events
|
||||||
from ...command.errors import ParamNotEnoughError
|
from langbot_plugin.api.entities.builtin.command import errors as command_errors
|
||||||
from ..logger import EventLogger
|
from ..logger import EventLogger
|
||||||
|
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ class OfficialAccountAdapter(abstract_platform_adapter.AbstractMessagePlatformAd
|
|||||||
]
|
]
|
||||||
missing_keys = [key for key in required_keys if key not in config]
|
missing_keys = [key for key in required_keys if key not in config]
|
||||||
if missing_keys:
|
if missing_keys:
|
||||||
raise ParamNotEnoughError('微信公众号缺少相关配置项,请查看文档或联系管理员')
|
raise command_errors.ParamNotEnoughError('微信公众号缺少相关配置项,请查看文档或联系管理员')
|
||||||
|
|
||||||
if self.config['Mode'] == 'drop':
|
if self.config['Mode'] == 'drop':
|
||||||
self.bot = OAClient(
|
self.bot = OAClient(
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import langbot_plugin.api.definition.abstract.platform.adapter as abstract_platf
|
|||||||
import langbot_plugin.api.entities.builtin.platform.message as platform_message
|
import langbot_plugin.api.entities.builtin.platform.message as platform_message
|
||||||
import langbot_plugin.api.entities.builtin.platform.events as platform_events
|
import langbot_plugin.api.entities.builtin.platform.events as platform_events
|
||||||
import langbot_plugin.api.entities.builtin.platform.entities as platform_entities
|
import langbot_plugin.api.entities.builtin.platform.entities as platform_entities
|
||||||
from ...command.errors import ParamNotEnoughError
|
from langbot_plugin.api.entities.builtin.command import errors as command_errors
|
||||||
from libs.qq_official_api.api import QQOfficialClient
|
from libs.qq_official_api.api import QQOfficialClient
|
||||||
from libs.qq_official_api.qqofficialevent import QQOfficialEvent
|
from libs.qq_official_api.qqofficialevent import QQOfficialEvent
|
||||||
from ...utils import image
|
from ...utils import image
|
||||||
@@ -148,7 +148,7 @@ class QQOfficialAdapter(abstract_platform_adapter.AbstractMessagePlatformAdapter
|
|||||||
]
|
]
|
||||||
missing_keys = [key for key in required_keys if key not in config]
|
missing_keys = [key for key in required_keys if key not in config]
|
||||||
if missing_keys:
|
if missing_keys:
|
||||||
raise ParamNotEnoughError('QQ官方机器人缺少相关配置项,请查看文档或联系管理员')
|
raise command_errors.ParamNotEnoughError('QQ官方机器人缺少相关配置项,请查看文档或联系管理员')
|
||||||
|
|
||||||
self.bot = QQOfficialClient(
|
self.bot = QQOfficialClient(
|
||||||
app_id=config['appid'], secret=config['secret'], token=config['token'], logger=self.logger
|
app_id=config['appid'], secret=config['secret'], token=config['token'], logger=self.logger
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ from libs.slack_api.slackevent import SlackEvent
|
|||||||
import langbot_plugin.api.entities.builtin.platform.events as platform_events
|
import langbot_plugin.api.entities.builtin.platform.events as platform_events
|
||||||
import langbot_plugin.api.entities.builtin.platform.message as platform_message
|
import langbot_plugin.api.entities.builtin.platform.message as platform_message
|
||||||
import langbot_plugin.api.entities.builtin.platform.entities as platform_entities
|
import langbot_plugin.api.entities.builtin.platform.entities as platform_entities
|
||||||
from ...command.errors import ParamNotEnoughError
|
from langbot_plugin.api.entities.builtin.command import errors as command_errors
|
||||||
from ...utils import image
|
from ...utils import image
|
||||||
from ..logger import EventLogger
|
from ..logger import EventLogger
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ class SlackAdapter(abstract_platform_adapter.AbstractMessagePlatformAdapter):
|
|||||||
]
|
]
|
||||||
missing_keys = [key for key in required_keys if key not in config]
|
missing_keys = [key for key in required_keys if key not in config]
|
||||||
if missing_keys:
|
if missing_keys:
|
||||||
raise ParamNotEnoughError('Slack机器人缺少相关配置项,请查看文档或联系管理员')
|
raise command_errors.ParamNotEnoughError('Slack机器人缺少相关配置项,请查看文档或联系管理员')
|
||||||
|
|
||||||
self.bot = SlackClient(
|
self.bot = SlackClient(
|
||||||
bot_token=self.config['bot_token'], signing_secret=self.config['signing_secret'], logger=self.logger
|
bot_token=self.config['bot_token'], signing_secret=self.config['signing_secret'], logger=self.logger
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import datetime
|
|||||||
from libs.wecom_api.api import WecomClient
|
from libs.wecom_api.api import WecomClient
|
||||||
import langbot_plugin.api.definition.abstract.platform.adapter as abstract_platform_adapter
|
import langbot_plugin.api.definition.abstract.platform.adapter as abstract_platform_adapter
|
||||||
from libs.wecom_api.wecomevent import WecomEvent
|
from libs.wecom_api.wecomevent import WecomEvent
|
||||||
from ...command.errors import ParamNotEnoughError
|
from langbot_plugin.api.entities.builtin.command import errors as command_errors
|
||||||
from ...utils import image
|
from ...utils import image
|
||||||
from ..logger import EventLogger
|
from ..logger import EventLogger
|
||||||
import langbot_plugin.api.entities.builtin.platform.message as platform_message
|
import langbot_plugin.api.entities.builtin.platform.message as platform_message
|
||||||
@@ -146,7 +146,7 @@ class WecomAdapter(abstract_platform_adapter.AbstractMessagePlatformAdapter):
|
|||||||
]
|
]
|
||||||
missing_keys = [key for key in required_keys if key not in config]
|
missing_keys = [key for key in required_keys if key not in config]
|
||||||
if missing_keys:
|
if missing_keys:
|
||||||
raise ParamNotEnoughError('企业微信缺少相关配置项,请查看文档或联系管理员')
|
raise command_errors.ParamNotEnoughError('企业微信缺少相关配置项,请查看文档或联系管理员')
|
||||||
|
|
||||||
self.bot = WecomClient(
|
self.bot = WecomClient(
|
||||||
corpid=config['corpid'],
|
corpid=config['corpid'],
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ from libs.wecom_customer_service_api.wecomcsevent import WecomCSEvent
|
|||||||
import langbot_plugin.api.entities.builtin.platform.entities as platform_entities
|
import langbot_plugin.api.entities.builtin.platform.entities as platform_entities
|
||||||
import langbot_plugin.api.entities.builtin.platform.message as platform_message
|
import langbot_plugin.api.entities.builtin.platform.message as platform_message
|
||||||
import langbot_plugin.api.entities.builtin.platform.events as platform_events
|
import langbot_plugin.api.entities.builtin.platform.events as platform_events
|
||||||
from ...command.errors import ParamNotEnoughError
|
from langbot_plugin.api.entities.builtin.command import errors as command_errors
|
||||||
import langbot_plugin.api.definition.abstract.platform.event_logger as abstract_platform_logger
|
import langbot_plugin.api.definition.abstract.platform.event_logger as abstract_platform_logger
|
||||||
|
|
||||||
|
|
||||||
@@ -131,7 +131,7 @@ class WecomCSAdapter(abstract_platform_adapter.AbstractMessagePlatformAdapter):
|
|||||||
]
|
]
|
||||||
missing_keys = [key for key in required_keys if key not in config]
|
missing_keys = [key for key in required_keys if key not in config]
|
||||||
if missing_keys:
|
if missing_keys:
|
||||||
raise ParamNotEnoughError('企业微信客服缺少相关配置项,请查看文档或联系管理员')
|
raise command_errors.ParamNotEnoughError('企业微信客服缺少相关配置项,请查看文档或联系管理员')
|
||||||
|
|
||||||
bot = WecomCSClient(
|
bot = WecomCSClient(
|
||||||
corpid=config['corpid'],
|
corpid=config['corpid'],
|
||||||
|
|||||||
Reference in New Issue
Block a user