release: public alpha 0.6.0 baseline

This commit is contained in:
JWeBot Contributors
2026-10-15 03:58:31 +08:00
commit d4242ae07c
238 changed files with 37724 additions and 0 deletions
+6
View File
@@ -0,0 +1,6 @@
# jwebot
Reviewed local extensions maintained by the JWeBot project. Each independently understandable function is packaged separately; dice and dice challenge intentionally remain one complete feature collection.
Every child directory is generated from the authoritative local extension
ownership inventory.
+17
View File
@@ -0,0 +1,17 @@
# coin
Author: `jwebot`
抛一枚硬币
Help:
- `/翻硬币`
Registered commands:
- `/翻硬币`
The adapter has no direct Ledger, GUI, environment, shell, or network access.
It delegates to the reviewed `coin` Kernel service profile
and returns a structured `ReplyPlan`.
+14
View File
@@ -0,0 +1,14 @@
id = "coin"
author = "jwebot"
description = "抛一枚硬币"
help = ["/翻硬币"]
version = "1.0.0"
api_version = "1"
entrypoint = "coin:plugin"
type = "command"
[capabilities]
commands = ["/翻硬币"]
storage = false
network_profiles = []
service_profiles = ["coin"]
+37
View File
@@ -0,0 +1,37 @@
"""Generated reviewed adapter for coin."""
from jwebot_sdk import Event, ExtensionResult, ReplyPlan, SingleGroupContext
PROFILE = 'coin'
AUTHOR = 'jwebot'
DESCRIPTION = '抛一枚硬币'
HELP_ENTRIES = ('/翻硬币',)
COMMANDS = ('/翻硬币',)
def _handler(context: SingleGroupContext, command: str):
def handle(event: Event, arguments: str) -> ExtensionResult:
response = context.services.call(
PROFILE,
operation="execute",
payload={
"command": command,
"arguments": arguments,
"event": event.to_mapping(),
},
)
text = response.get("text")
if not isinstance(text, str) or not text.strip():
raise ValueError("local service returned invalid text")
return ExtensionResult(
reply=ReplyPlan.text(text),
metadata={"local_extension": PROFILE, "author": AUTHOR},
)
return handle
def plugin(context: SingleGroupContext) -> None:
for command in COMMANDS:
context.commands.register(command, _handler(context, command))
@@ -0,0 +1,29 @@
import sys
import unittest
from pathlib import Path
from unittest import mock
SOURCE = Path(__file__).resolve().parents[1] / "src"
sys.path.insert(0, str(SOURCE))
from coin import AUTHOR, DESCRIPTION, HELP_ENTRIES, plugin
class PluginTests(unittest.TestCase):
def test_registers_declared_commands_and_author(self):
context = mock.Mock()
plugin(context)
registered = [
call.args[0]
for call in context.commands.register.call_args_list
]
self.assertEqual(AUTHOR, 'jwebot')
self.assertEqual(DESCRIPTION, '抛一枚硬币')
self.assertEqual(HELP_ENTRIES, ('/翻硬币',))
self.assertIn('/翻硬币', registered)
self.assertEqual(len(registered), 1)
if __name__ == "__main__":
unittest.main()
+17
View File
@@ -0,0 +1,17 @@
# daily-fortune
Author: `jwebot`
生成当天稳定一致的运势
Help:
- `/今日运势`
Registered commands:
- `/今日运势`
The adapter has no direct Ledger, GUI, environment, shell, or network access.
It delegates to the reviewed `daily-fortune` Kernel service profile
and returns a structured `ReplyPlan`.
@@ -0,0 +1,14 @@
id = "daily-fortune"
author = "jwebot"
description = "生成当天稳定一致的运势"
help = ["/今日运势"]
version = "1.0.0"
api_version = "1"
entrypoint = "daily_fortune:plugin"
type = "command"
[capabilities]
commands = ["/今日运势"]
storage = false
network_profiles = []
service_profiles = ["daily-fortune"]
@@ -0,0 +1,37 @@
"""Generated reviewed adapter for daily-fortune."""
from jwebot_sdk import Event, ExtensionResult, ReplyPlan, SingleGroupContext
PROFILE = 'daily-fortune'
AUTHOR = 'jwebot'
DESCRIPTION = '生成当天稳定一致的运势'
HELP_ENTRIES = ('/今日运势',)
COMMANDS = ('/今日运势',)
def _handler(context: SingleGroupContext, command: str):
def handle(event: Event, arguments: str) -> ExtensionResult:
response = context.services.call(
PROFILE,
operation="execute",
payload={
"command": command,
"arguments": arguments,
"event": event.to_mapping(),
},
)
text = response.get("text")
if not isinstance(text, str) or not text.strip():
raise ValueError("local service returned invalid text")
return ExtensionResult(
reply=ReplyPlan.text(text),
metadata={"local_extension": PROFILE, "author": AUTHOR},
)
return handle
def plugin(context: SingleGroupContext) -> None:
for command in COMMANDS:
context.commands.register(command, _handler(context, command))
@@ -0,0 +1,29 @@
import sys
import unittest
from pathlib import Path
from unittest import mock
SOURCE = Path(__file__).resolve().parents[1] / "src"
sys.path.insert(0, str(SOURCE))
from daily_fortune import AUTHOR, DESCRIPTION, HELP_ENTRIES, plugin
class PluginTests(unittest.TestCase):
def test_registers_declared_commands_and_author(self):
context = mock.Mock()
plugin(context)
registered = [
call.args[0]
for call in context.commands.register.call_args_list
]
self.assertEqual(AUTHOR, 'jwebot')
self.assertEqual(DESCRIPTION, '生成当天稳定一致的运势')
self.assertEqual(HELP_ENTRIES, ('/今日运势',))
self.assertIn('/今日运势', registered)
self.assertEqual(len(registered), 1)
if __name__ == "__main__":
unittest.main()
+21
View File
@@ -0,0 +1,21 @@
# dice
Author: `jwebot`
骰子和多人骰子挑战
Help:
- `/丢骰子 [NdM]`
- `/丢骰子挑战 [5d6|5d20|状态|结算|战绩|结束]`
Registered commands:
- `/丢骰子`
- `/骰子`
- `/丢骰子挑战`
- `/骰子挑战`
The adapter has no direct Ledger, GUI, environment, shell, or network access.
It delegates to the reviewed `dice` Kernel service profile
and returns a structured `ReplyPlan`.
+14
View File
@@ -0,0 +1,14 @@
id = "dice"
author = "jwebot"
description = "骰子和多人骰子挑战"
help = ["/丢骰子 [NdM]", "/丢骰子挑战 [5d6|5d20|状态|结算|战绩|结束]"]
version = "1.0.0"
api_version = "1"
entrypoint = "dice:plugin"
type = "command"
[capabilities]
commands = ["/丢骰子", "/骰子", "/丢骰子挑战", "/骰子挑战"]
storage = false
network_profiles = []
service_profiles = ["dice"]
+37
View File
@@ -0,0 +1,37 @@
"""Generated reviewed adapter for dice."""
from jwebot_sdk import Event, ExtensionResult, ReplyPlan, SingleGroupContext
PROFILE = 'dice'
AUTHOR = 'jwebot'
DESCRIPTION = '骰子和多人骰子挑战'
HELP_ENTRIES = ('/丢骰子 [NdM]', '/丢骰子挑战 [5d6|5d20|状态|结算|战绩|结束]')
COMMANDS = ('/丢骰子', '/骰子', '/丢骰子挑战', '/骰子挑战')
def _handler(context: SingleGroupContext, command: str):
def handle(event: Event, arguments: str) -> ExtensionResult:
response = context.services.call(
PROFILE,
operation="execute",
payload={
"command": command,
"arguments": arguments,
"event": event.to_mapping(),
},
)
text = response.get("text")
if not isinstance(text, str) or not text.strip():
raise ValueError("local service returned invalid text")
return ExtensionResult(
reply=ReplyPlan.text(text),
metadata={"local_extension": PROFILE, "author": AUTHOR},
)
return handle
def plugin(context: SingleGroupContext) -> None:
for command in COMMANDS:
context.commands.register(command, _handler(context, command))
@@ -0,0 +1,29 @@
import sys
import unittest
from pathlib import Path
from unittest import mock
SOURCE = Path(__file__).resolve().parents[1] / "src"
sys.path.insert(0, str(SOURCE))
from dice import AUTHOR, DESCRIPTION, HELP_ENTRIES, plugin
class PluginTests(unittest.TestCase):
def test_registers_declared_commands_and_author(self):
context = mock.Mock()
plugin(context)
registered = [
call.args[0]
for call in context.commands.register.call_args_list
]
self.assertEqual(AUTHOR, 'jwebot')
self.assertEqual(DESCRIPTION, '骰子和多人骰子挑战')
self.assertEqual(HELP_ENTRIES, ('/丢骰子 [NdM]', '/丢骰子挑战 [5d6|5d20|状态|结算|战绩|结束]'))
self.assertIn('/丢骰子', registered)
self.assertEqual(len(registered), 4)
if __name__ == "__main__":
unittest.main()
+17
View File
@@ -0,0 +1,17 @@
# draw-lot
Author: `jwebot`
抽取一条本地签文
Help:
- `/抽签`
Registered commands:
- `/抽签`
The adapter has no direct Ledger, GUI, environment, shell, or network access.
It delegates to the reviewed `draw-lot` Kernel service profile
and returns a structured `ReplyPlan`.
+14
View File
@@ -0,0 +1,14 @@
id = "draw-lot"
author = "jwebot"
description = "抽取一条本地签文"
help = ["/抽签"]
version = "1.0.0"
api_version = "1"
entrypoint = "draw_lot:plugin"
type = "command"
[capabilities]
commands = ["/抽签"]
storage = false
network_profiles = []
service_profiles = ["draw-lot"]
@@ -0,0 +1,37 @@
"""Generated reviewed adapter for draw-lot."""
from jwebot_sdk import Event, ExtensionResult, ReplyPlan, SingleGroupContext
PROFILE = 'draw-lot'
AUTHOR = 'jwebot'
DESCRIPTION = '抽取一条本地签文'
HELP_ENTRIES = ('/抽签',)
COMMANDS = ('/抽签',)
def _handler(context: SingleGroupContext, command: str):
def handle(event: Event, arguments: str) -> ExtensionResult:
response = context.services.call(
PROFILE,
operation="execute",
payload={
"command": command,
"arguments": arguments,
"event": event.to_mapping(),
},
)
text = response.get("text")
if not isinstance(text, str) or not text.strip():
raise ValueError("local service returned invalid text")
return ExtensionResult(
reply=ReplyPlan.text(text),
metadata={"local_extension": PROFILE, "author": AUTHOR},
)
return handle
def plugin(context: SingleGroupContext) -> None:
for command in COMMANDS:
context.commands.register(command, _handler(context, command))
@@ -0,0 +1,29 @@
import sys
import unittest
from pathlib import Path
from unittest import mock
SOURCE = Path(__file__).resolve().parents[1] / "src"
sys.path.insert(0, str(SOURCE))
from draw_lot import AUTHOR, DESCRIPTION, HELP_ENTRIES, plugin
class PluginTests(unittest.TestCase):
def test_registers_declared_commands_and_author(self):
context = mock.Mock()
plugin(context)
registered = [
call.args[0]
for call in context.commands.register.call_args_list
]
self.assertEqual(AUTHOR, 'jwebot')
self.assertEqual(DESCRIPTION, '抽取一条本地签文')
self.assertEqual(HELP_ENTRIES, ('/抽签',))
self.assertIn('/抽签', registered)
self.assertEqual(len(registered), 1)
if __name__ == "__main__":
unittest.main()
+18
View File
@@ -0,0 +1,18 @@
# guess-number
Author: `jwebot`
群内持久化猜数字游戏
Help:
- `/猜数字 开始 [上限];/猜 数字;/猜数字 [状态|结束]`
Registered commands:
- `/猜数字`
- `/猜`
The adapter has no direct Ledger, GUI, environment, shell, or network access.
It delegates to the reviewed `guess-number` Kernel service profile
and returns a structured `ReplyPlan`.
@@ -0,0 +1,14 @@
id = "guess-number"
author = "jwebot"
description = "群内持久化猜数字游戏"
help = ["/猜数字 开始 [上限];/猜 数字;/猜数字 [状态|结束]"]
version = "1.0.0"
api_version = "1"
entrypoint = "guess_number:plugin"
type = "command"
[capabilities]
commands = ["/猜数字", "/猜"]
storage = false
network_profiles = []
service_profiles = ["guess-number"]
@@ -0,0 +1,37 @@
"""Generated reviewed adapter for guess-number."""
from jwebot_sdk import Event, ExtensionResult, ReplyPlan, SingleGroupContext
PROFILE = 'guess-number'
AUTHOR = 'jwebot'
DESCRIPTION = '群内持久化猜数字游戏'
HELP_ENTRIES = ('/猜数字 开始 [上限];/猜 数字;/猜数字 [状态|结束]',)
COMMANDS = ('/猜数字', '/猜')
def _handler(context: SingleGroupContext, command: str):
def handle(event: Event, arguments: str) -> ExtensionResult:
response = context.services.call(
PROFILE,
operation="execute",
payload={
"command": command,
"arguments": arguments,
"event": event.to_mapping(),
},
)
text = response.get("text")
if not isinstance(text, str) or not text.strip():
raise ValueError("local service returned invalid text")
return ExtensionResult(
reply=ReplyPlan.text(text),
metadata={"local_extension": PROFILE, "author": AUTHOR},
)
return handle
def plugin(context: SingleGroupContext) -> None:
for command in COMMANDS:
context.commands.register(command, _handler(context, command))
@@ -0,0 +1,29 @@
import sys
import unittest
from pathlib import Path
from unittest import mock
SOURCE = Path(__file__).resolve().parents[1] / "src"
sys.path.insert(0, str(SOURCE))
from guess_number import AUTHOR, DESCRIPTION, HELP_ENTRIES, plugin
class PluginTests(unittest.TestCase):
def test_registers_declared_commands_and_author(self):
context = mock.Mock()
plugin(context)
registered = [
call.args[0]
for call in context.commands.register.call_args_list
]
self.assertEqual(AUTHOR, 'jwebot')
self.assertEqual(DESCRIPTION, '群内持久化猜数字游戏')
self.assertEqual(HELP_ENTRIES, ('/猜数字 开始 [上限];/猜 数字;/猜数字 [状态|结束]',))
self.assertIn('/猜数字', registered)
self.assertEqual(len(registered), 2)
if __name__ == "__main__":
unittest.main()
@@ -0,0 +1,18 @@
# history-search
Author: `jwebot`
搜索本地群聊文字记录
Help:
- `/查记录 关键词`
Registered commands:
- `/查记录`
- `/历史搜索`
The adapter has no direct Ledger, GUI, environment, shell, or network access.
It delegates to the reviewed `history-search` Kernel service profile
and returns a structured `ReplyPlan`.
@@ -0,0 +1,14 @@
id = "history-search"
author = "jwebot"
description = "搜索本地群聊文字记录"
help = ["/查记录 关键词"]
version = "1.0.0"
api_version = "1"
entrypoint = "history_search:plugin"
type = "command"
[capabilities]
commands = ["/查记录", "/历史搜索"]
storage = false
network_profiles = []
service_profiles = ["history-search"]
@@ -0,0 +1,37 @@
"""Generated reviewed adapter for history-search."""
from jwebot_sdk import Event, ExtensionResult, ReplyPlan, SingleGroupContext
PROFILE = 'history-search'
AUTHOR = 'jwebot'
DESCRIPTION = '搜索本地群聊文字记录'
HELP_ENTRIES = ('/查记录 关键词',)
COMMANDS = ('/查记录', '/历史搜索')
def _handler(context: SingleGroupContext, command: str):
def handle(event: Event, arguments: str) -> ExtensionResult:
response = context.services.call(
PROFILE,
operation="execute",
payload={
"command": command,
"arguments": arguments,
"event": event.to_mapping(),
},
)
text = response.get("text")
if not isinstance(text, str) or not text.strip():
raise ValueError("local service returned invalid text")
return ExtensionResult(
reply=ReplyPlan.text(text),
metadata={"local_extension": PROFILE, "author": AUTHOR},
)
return handle
def plugin(context: SingleGroupContext) -> None:
for command in COMMANDS:
context.commands.register(command, _handler(context, command))
@@ -0,0 +1,29 @@
import sys
import unittest
from pathlib import Path
from unittest import mock
SOURCE = Path(__file__).resolve().parents[1] / "src"
sys.path.insert(0, str(SOURCE))
from history_search import AUTHOR, DESCRIPTION, HELP_ENTRIES, plugin
class PluginTests(unittest.TestCase):
def test_registers_declared_commands_and_author(self):
context = mock.Mock()
plugin(context)
registered = [
call.args[0]
for call in context.commands.register.call_args_list
]
self.assertEqual(AUTHOR, 'jwebot')
self.assertEqual(DESCRIPTION, '搜索本地群聊文字记录')
self.assertEqual(HELP_ENTRIES, ('/查记录 关键词',))
self.assertIn('/查记录', registered)
self.assertEqual(len(registered), 2)
if __name__ == "__main__":
unittest.main()
+17
View File
@@ -0,0 +1,17 @@
# random-number
Author: `jwebot`
在指定整数范围内取随机数
Help:
- `/随机数 最小值 最大值`
Registered commands:
- `/随机数`
The adapter has no direct Ledger, GUI, environment, shell, or network access.
It delegates to the reviewed `random-number` Kernel service profile
and returns a structured `ReplyPlan`.
@@ -0,0 +1,14 @@
id = "random-number"
author = "jwebot"
description = "在指定整数范围内取随机数"
help = ["/随机数 最小值 最大值"]
version = "1.0.0"
api_version = "1"
entrypoint = "random_number:plugin"
type = "command"
[capabilities]
commands = ["/随机数"]
storage = false
network_profiles = []
service_profiles = ["random-number"]
@@ -0,0 +1,37 @@
"""Generated reviewed adapter for random-number."""
from jwebot_sdk import Event, ExtensionResult, ReplyPlan, SingleGroupContext
PROFILE = 'random-number'
AUTHOR = 'jwebot'
DESCRIPTION = '在指定整数范围内取随机数'
HELP_ENTRIES = ('/随机数 最小值 最大值',)
COMMANDS = ('/随机数',)
def _handler(context: SingleGroupContext, command: str):
def handle(event: Event, arguments: str) -> ExtensionResult:
response = context.services.call(
PROFILE,
operation="execute",
payload={
"command": command,
"arguments": arguments,
"event": event.to_mapping(),
},
)
text = response.get("text")
if not isinstance(text, str) or not text.strip():
raise ValueError("local service returned invalid text")
return ExtensionResult(
reply=ReplyPlan.text(text),
metadata={"local_extension": PROFILE, "author": AUTHOR},
)
return handle
def plugin(context: SingleGroupContext) -> None:
for command in COMMANDS:
context.commands.register(command, _handler(context, command))
@@ -0,0 +1,29 @@
import sys
import unittest
from pathlib import Path
from unittest import mock
SOURCE = Path(__file__).resolve().parents[1] / "src"
sys.path.insert(0, str(SOURCE))
from random_number import AUTHOR, DESCRIPTION, HELP_ENTRIES, plugin
class PluginTests(unittest.TestCase):
def test_registers_declared_commands_and_author(self):
context = mock.Mock()
plugin(context)
registered = [
call.args[0]
for call in context.commands.register.call_args_list
]
self.assertEqual(AUTHOR, 'jwebot')
self.assertEqual(DESCRIPTION, '在指定整数范围内取随机数')
self.assertEqual(HELP_ENTRIES, ('/随机数 最小值 最大值',))
self.assertIn('/随机数', registered)
self.assertEqual(len(registered), 1)
if __name__ == "__main__":
unittest.main()
@@ -0,0 +1,18 @@
# repeat-ranking
Author: `jwebot`
查看北京时间今日复读排行
Help:
- `/复读榜`
Registered commands:
- `/复读榜`
- `/复读`
The adapter has no direct Ledger, GUI, environment, shell, or network access.
It delegates to the reviewed `repeat-ranking` Kernel service profile
and returns a structured `ReplyPlan`.
@@ -0,0 +1,14 @@
id = "repeat-ranking"
author = "jwebot"
description = "查看北京时间今日复读排行"
help = ["/复读榜"]
version = "1.0.0"
api_version = "1"
entrypoint = "repeat_ranking:plugin"
type = "command"
[capabilities]
commands = ["/复读榜", "/复读"]
storage = false
network_profiles = []
service_profiles = ["repeat-ranking"]
@@ -0,0 +1,37 @@
"""Generated reviewed adapter for repeat-ranking."""
from jwebot_sdk import Event, ExtensionResult, ReplyPlan, SingleGroupContext
PROFILE = 'repeat-ranking'
AUTHOR = 'jwebot'
DESCRIPTION = '查看北京时间今日复读排行'
HELP_ENTRIES = ('/复读榜',)
COMMANDS = ('/复读榜', '/复读')
def _handler(context: SingleGroupContext, command: str):
def handle(event: Event, arguments: str) -> ExtensionResult:
response = context.services.call(
PROFILE,
operation="execute",
payload={
"command": command,
"arguments": arguments,
"event": event.to_mapping(),
},
)
text = response.get("text")
if not isinstance(text, str) or not text.strip():
raise ValueError("local service returned invalid text")
return ExtensionResult(
reply=ReplyPlan.text(text),
metadata={"local_extension": PROFILE, "author": AUTHOR},
)
return handle
def plugin(context: SingleGroupContext) -> None:
for command in COMMANDS:
context.commands.register(command, _handler(context, command))
@@ -0,0 +1,29 @@
import sys
import unittest
from pathlib import Path
from unittest import mock
SOURCE = Path(__file__).resolve().parents[1] / "src"
sys.path.insert(0, str(SOURCE))
from repeat_ranking import AUTHOR, DESCRIPTION, HELP_ENTRIES, plugin
class PluginTests(unittest.TestCase):
def test_registers_declared_commands_and_author(self):
context = mock.Mock()
plugin(context)
registered = [
call.args[0]
for call in context.commands.register.call_args_list
]
self.assertEqual(AUTHOR, 'jwebot')
self.assertEqual(DESCRIPTION, '查看北京时间今日复读排行')
self.assertEqual(HELP_ENTRIES, ('/复读榜',))
self.assertIn('/复读榜', registered)
self.assertEqual(len(registered), 2)
if __name__ == "__main__":
unittest.main()
@@ -0,0 +1,17 @@
# rock-paper-scissors
Author: `jwebot`
多人石头剪刀布游戏
Help:
- `/石头剪刀布 [开始|加入|出 选择|状态|结算|结束]`
Registered commands:
- `/石头剪刀布`
The adapter has no direct Ledger, GUI, environment, shell, or network access.
It delegates to the reviewed `rock-paper-scissors` Kernel service profile
and returns a structured `ReplyPlan`.
@@ -0,0 +1,14 @@
id = "rock-paper-scissors"
author = "jwebot"
description = "多人石头剪刀布游戏"
help = ["/石头剪刀布 [开始|加入|出 选择|状态|结算|结束]"]
version = "1.0.0"
api_version = "1"
entrypoint = "rock_paper_scissors:plugin"
type = "command"
[capabilities]
commands = ["/石头剪刀布"]
storage = false
network_profiles = []
service_profiles = ["rock-paper-scissors"]
@@ -0,0 +1,37 @@
"""Generated reviewed adapter for rock-paper-scissors."""
from jwebot_sdk import Event, ExtensionResult, ReplyPlan, SingleGroupContext
PROFILE = 'rock-paper-scissors'
AUTHOR = 'jwebot'
DESCRIPTION = '多人石头剪刀布游戏'
HELP_ENTRIES = ('/石头剪刀布 [开始|加入|出 选择|状态|结算|结束]',)
COMMANDS = ('/石头剪刀布',)
def _handler(context: SingleGroupContext, command: str):
def handle(event: Event, arguments: str) -> ExtensionResult:
response = context.services.call(
PROFILE,
operation="execute",
payload={
"command": command,
"arguments": arguments,
"event": event.to_mapping(),
},
)
text = response.get("text")
if not isinstance(text, str) or not text.strip():
raise ValueError("local service returned invalid text")
return ExtensionResult(
reply=ReplyPlan.text(text),
metadata={"local_extension": PROFILE, "author": AUTHOR},
)
return handle
def plugin(context: SingleGroupContext) -> None:
for command in COMMANDS:
context.commands.register(command, _handler(context, command))
@@ -0,0 +1,29 @@
import sys
import unittest
from pathlib import Path
from unittest import mock
SOURCE = Path(__file__).resolve().parents[1] / "src"
sys.path.insert(0, str(SOURCE))
from rock_paper_scissors import AUTHOR, DESCRIPTION, HELP_ENTRIES, plugin
class PluginTests(unittest.TestCase):
def test_registers_declared_commands_and_author(self):
context = mock.Mock()
plugin(context)
registered = [
call.args[0]
for call in context.commands.register.call_args_list
]
self.assertEqual(AUTHOR, 'jwebot')
self.assertEqual(DESCRIPTION, '多人石头剪刀布游戏')
self.assertEqual(HELP_ENTRIES, ('/石头剪刀布 [开始|加入|出 选择|状态|结算|结束]',))
self.assertIn('/石头剪刀布', registered)
self.assertEqual(len(registered), 1)
if __name__ == "__main__":
unittest.main()
+19
View File
@@ -0,0 +1,19 @@
# scan-ranking
Author: `jwebot`
查看北京时间今日扫码排行
Help:
- `/扫码排行`
Registered commands:
- `/扫码排行`
- `/扫码榜`
- `/今日扫码`
The adapter has no direct Ledger, GUI, environment, shell, or network access.
It delegates to the reviewed `scan-ranking` Kernel service profile
and returns a structured `ReplyPlan`.
@@ -0,0 +1,14 @@
id = "scan-ranking"
author = "jwebot"
description = "查看北京时间今日扫码排行"
help = ["/扫码排行"]
version = "1.0.0"
api_version = "1"
entrypoint = "scan_ranking:plugin"
type = "command"
[capabilities]
commands = ["/扫码排行", "/扫码榜", "/今日扫码"]
storage = false
network_profiles = []
service_profiles = ["scan-ranking"]
@@ -0,0 +1,37 @@
"""Generated reviewed adapter for scan-ranking."""
from jwebot_sdk import Event, ExtensionResult, ReplyPlan, SingleGroupContext
PROFILE = 'scan-ranking'
AUTHOR = 'jwebot'
DESCRIPTION = '查看北京时间今日扫码排行'
HELP_ENTRIES = ('/扫码排行',)
COMMANDS = ('/扫码排行', '/扫码榜', '/今日扫码')
def _handler(context: SingleGroupContext, command: str):
def handle(event: Event, arguments: str) -> ExtensionResult:
response = context.services.call(
PROFILE,
operation="execute",
payload={
"command": command,
"arguments": arguments,
"event": event.to_mapping(),
},
)
text = response.get("text")
if not isinstance(text, str) or not text.strip():
raise ValueError("local service returned invalid text")
return ExtensionResult(
reply=ReplyPlan.text(text),
metadata={"local_extension": PROFILE, "author": AUTHOR},
)
return handle
def plugin(context: SingleGroupContext) -> None:
for command in COMMANDS:
context.commands.register(command, _handler(context, command))
@@ -0,0 +1,29 @@
import sys
import unittest
from pathlib import Path
from unittest import mock
SOURCE = Path(__file__).resolve().parents[1] / "src"
sys.path.insert(0, str(SOURCE))
from scan_ranking import AUTHOR, DESCRIPTION, HELP_ENTRIES, plugin
class PluginTests(unittest.TestCase):
def test_registers_declared_commands_and_author(self):
context = mock.Mock()
plugin(context)
registered = [
call.args[0]
for call in context.commands.register.call_args_list
]
self.assertEqual(AUTHOR, 'jwebot')
self.assertEqual(DESCRIPTION, '查看北京时间今日扫码排行')
self.assertEqual(HELP_ENTRIES, ('/扫码排行',))
self.assertIn('/扫码排行', registered)
self.assertEqual(len(registered), 3)
if __name__ == "__main__":
unittest.main()
@@ -0,0 +1,17 @@
# steam-presence
Author: `jwebot`
Steam 状态与时长
Help:
- `/steam;/steam时长 游戏[、玩家]`
Registered commands:
- `/steam`
The adapter has no direct Ledger, GUI, environment, shell, or network access.
It delegates to the reviewed `steam-presence` Kernel service profile
and returns a structured `ReplyPlan`.
@@ -0,0 +1,14 @@
id = "steam-presence"
author = "jwebot"
description = "Steam 状态与时长"
help = ["/steam;/steam时长 游戏[、玩家]"]
version = "1.0.0"
api_version = "1"
entrypoint = "steam_presence:plugin"
type = "command"
[capabilities]
commands = ["/steam"]
storage = false
network_profiles = []
service_profiles = ["steam-presence"]
@@ -0,0 +1,37 @@
"""Generated reviewed adapter for steam-presence."""
from jwebot_sdk import Event, ExtensionResult, ReplyPlan, SingleGroupContext
PROFILE = 'steam-presence'
AUTHOR = 'jwebot'
DESCRIPTION = 'Steam 状态与时长'
HELP_ENTRIES = ('/steam;/steam时长 游戏[、玩家]',)
COMMANDS = ('/steam',)
def _handler(context: SingleGroupContext, command: str):
def handle(event: Event, arguments: str) -> ExtensionResult:
response = context.services.call(
PROFILE,
operation="execute",
payload={
"command": command,
"arguments": arguments,
"event": event.to_mapping(),
},
)
text = response.get("text")
if not isinstance(text, str) or not text.strip():
raise ValueError("local service returned invalid text")
return ExtensionResult(
reply=ReplyPlan.text(text),
metadata={"local_extension": PROFILE, "author": AUTHOR},
)
return handle
def plugin(context: SingleGroupContext) -> None:
for command in COMMANDS:
context.commands.register(command, _handler(context, command))
@@ -0,0 +1,29 @@
import sys
import unittest
from pathlib import Path
from unittest import mock
SOURCE = Path(__file__).resolve().parents[1] / "src"
sys.path.insert(0, str(SOURCE))
from steam_presence import AUTHOR, DESCRIPTION, HELP_ENTRIES, plugin
class PluginTests(unittest.TestCase):
def test_registers_declared_commands_and_author(self):
context = mock.Mock()
plugin(context)
registered = [
call.args[0]
for call in context.commands.register.call_args_list
]
self.assertEqual(AUTHOR, 'jwebot')
self.assertEqual(DESCRIPTION, 'Steam 状态与时长')
self.assertEqual(HELP_ENTRIES, ('/steam;/steam时长 游戏[、玩家]',))
self.assertIn('/steam', registered)
self.assertEqual(len(registered), 1)
if __name__ == "__main__":
unittest.main()