|
@@ -0,0 +1,76 @@ |
|
|
|
|
|
# encoding:utf-8 |
|
|
|
|
|
|
|
|
|
|
|
from bridge.bridge import Bridge |
|
|
|
|
|
from bridge.context import ContextType |
|
|
|
|
|
from bridge.reply import Reply, ReplyType |
|
|
|
|
|
import plugins |
|
|
|
|
|
from plugins import * |
|
|
|
|
|
from common.log import logger |
|
|
|
|
|
|
|
|
|
|
|
# https://github.com/bupticybee/ChineseAiDungeonChatGPT |
|
|
|
|
|
class StoryTeller(): |
|
|
|
|
|
def __init__(self, bot, sessionid, story): |
|
|
|
|
|
self.bot = bot |
|
|
|
|
|
self.sessionid = sessionid |
|
|
|
|
|
bot.sessions.clear_session(sessionid) |
|
|
|
|
|
self.first_interact = True |
|
|
|
|
|
self.story = story |
|
|
|
|
|
|
|
|
|
|
|
def reset(self): |
|
|
|
|
|
self.bot.sessions.clear_session(self.sessionid) |
|
|
|
|
|
self.first_interact = True |
|
|
|
|
|
|
|
|
|
|
|
def action(self, user_action): |
|
|
|
|
|
if user_action[-1] != "。": |
|
|
|
|
|
user_action = user_action + "。" |
|
|
|
|
|
if self.first_interact: |
|
|
|
|
|
prompt = """现在来充当一个冒险文字游戏,描述时候注意节奏,不要太快,仔细描述各个人物的心情和周边环境。一次只需写四到六句话。 |
|
|
|
|
|
开头是,""" + self.story + " " + user_action |
|
|
|
|
|
self.first_interact = False |
|
|
|
|
|
else: |
|
|
|
|
|
prompt = """继续,一次只需要续写四到六句话,总共就只讲5分钟内发生的事情。""" + user_action |
|
|
|
|
|
return prompt |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@plugins.register(name="Dungeon", desc="A plugin to play dungeon game", version="1.0", author="lanvent", desire_priority= 0) |
|
|
|
|
|
class Dungeon(Plugin): |
|
|
|
|
|
def __init__(self): |
|
|
|
|
|
super().__init__() |
|
|
|
|
|
self.handlers[Event.ON_HANDLE_CONTEXT] = self.on_handle_context |
|
|
|
|
|
logger.info("[Dungeon] inited") |
|
|
|
|
|
self.games = {} |
|
|
|
|
|
|
|
|
|
|
|
def on_handle_context(self, e_context: EventContext): |
|
|
|
|
|
|
|
|
|
|
|
if e_context['context'].type != ContextType.TEXT: |
|
|
|
|
|
return |
|
|
|
|
|
bottype = Bridge().get_bot_type("chat") |
|
|
|
|
|
if bottype != "chatGPT": |
|
|
|
|
|
return |
|
|
|
|
|
bot = Bridge().get_bot("chat") |
|
|
|
|
|
content = e_context['context'].content[:] |
|
|
|
|
|
clist = e_context['context'].content.split(maxsplit=1) |
|
|
|
|
|
sessionid = e_context['context']['session_id'] |
|
|
|
|
|
logger.debug("[Dungeon] on_handle_context. content: %s" % clist) |
|
|
|
|
|
if clist[0] == "$停止冒险": |
|
|
|
|
|
if sessionid in self.games: |
|
|
|
|
|
self.games[sessionid].reset() |
|
|
|
|
|
del self.games[sessionid] |
|
|
|
|
|
reply = Reply(ReplyType.INFO, "冒险结束!") |
|
|
|
|
|
e_context['reply'] = reply |
|
|
|
|
|
e_context.action = EventAction.BREAK_PASS |
|
|
|
|
|
elif clist[0] == "$开始冒险" or sessionid in self.games: |
|
|
|
|
|
if sessionid not in self.games or clist[0] == "$开始冒险": |
|
|
|
|
|
if len(clist)>1 : |
|
|
|
|
|
story = clist[1] |
|
|
|
|
|
else: |
|
|
|
|
|
story = "你在树林里冒险,指不定会从哪里蹦出来一些奇怪的东西,你握紧手上的手枪,希望这次冒险能够找到一些值钱的东西,你往树林深处走去。" |
|
|
|
|
|
self.games[sessionid] = StoryTeller(bot, sessionid, story) |
|
|
|
|
|
reply = Reply(ReplyType.INFO, "冒险开始,你可以输入任意内容,让故事继续下去。故事背景是:" + story) |
|
|
|
|
|
e_context['reply'] = reply |
|
|
|
|
|
e_context.action = EventAction.BREAK_PASS # 事件结束,并跳过处理context的默认逻辑 |
|
|
|
|
|
else: |
|
|
|
|
|
prompt = self.games[sessionid].action(content) |
|
|
|
|
|
e_context['context'].type = ContextType.TEXT |
|
|
|
|
|
e_context['context'].content = prompt |
|
|
|
|
|
e_context.action = EventAction.CONTINUE |