Skip to content

获取消息

getChatMessages

获取聊天消息。

酒馆虽然提供了 /messages 命令,但是它获取的是一整个字符串,并且不能获取楼层当前没在使用的消息 (点击箭头切换的那个 swipe 消息,在酒馆助手中我们称之为 "消息页"), 酒馆助手为此提供了一个函数获取更便于处理的消息。

typescript
function getChatMessages(
  range: string | number,
  option: GetChatMessagesOption = {}
): ChatMessage[] | ChatMessageSwiped[];
typescript
interface GetChatMessagesOption {
  role?: "all" | "system" | "assistant" | "user";
  hide_state?: "all" | "hidden" | "unhidden";
  include_swipes?: boolean;
}
typescript
interface ChatMessage {
  message_id: number;
  name: string;
  role: "system" | "assistant" | "user";
  is_hidden: boolean;
  message: string;
  data: Record<string, any>;
  extra: Record<string, any>;
}
typescript
interface ChatMessageSwiped {
  message_id: number;
  name: string;
  role: "system" | "assistant" | "user";
  is_hidden: boolean;
  swipe_id: number;
  swipes: string[];
  swipes_data: Record<string, any>[];
  swipes_info: Record<string, any>[];
}

参数

range

  • 类型: number | string
  • 描述: 要获取的消息楼层号或楼层范围,与 /messages 相同

role?

  • 类型: 'system' | 'assistant' | 'user'
  • 描述: 按 role 筛选消息;默认为 'all'

hide_state?

  • 类型: 'all' | 'hidden' | 'unhidden'
  • 描述: 按是否被隐藏筛选消息;默认为 'all'

include_swipes?

  • 类型: boolean
  • 描述: 是否包含未被 ai 使用的消息页信息,如没选择的开局、通过点击箭头重 roll 的楼层。如果为 false 则返回 ChatMessage 类型,如果为 true 则返回 ChatMessageSwiped 类型;默认为 false

返回值

如果 include_swipesfalse(默认情况):

  • 返回 ChatMessage[],每条消息只包含被 AI 使用的消息页
  • 按 message_id 从低到高排序

如果 include_swipestrue:

  • 返回 ChatMessageSwiped[],每条消息包含所有消息页
  • 按 message_id 从低到高排序

示例

typescript
const messages = await getChatMessages(10);
const messages = await getChatMessages("10");
const messages = await getChatMessages("10", { include_swipes: false });
typescript
const message = getChatMessages(-1)[0]; // 或 getChatMessages('{{lastMessageId}}')[0]
typescript
const messages = await getChatMessages("0-{{lastMessageId}}", { include_swipes: true });

formatAsDisplayedMessage

将字符串处理为酒馆用于显示的 html 格式。

  1. 替换字符串中的酒馆宏
  2. 对字符串应用对应的酒馆正则
  3. 将字符串调整为 html 格式
typescript
function formatAsDisplayedMessage(
  text: string,
  option: FormatAsDisplayedMessageOption = {}
): string;
typescript
interface FormatAsDisplayedMessageOption {
  message_id?: "last" | "last_user" | "last_char" | number; // 消息所在的楼层,要求该楼层已经存在,即在 `[0, await getLastMessageId()]` 范围内; 默认为 'last'
}

参数

text

  • 类型: string
  • 描述: 要处理的字符串

message_id?

  • 类型: 'last' | 'last_user' | 'last_char' | number
  • 描述: 消息所在的楼层,要求该楼层已经存在,即在 [0, await getLastMessageId()] 范围内; 默认为 'last'

返回值

  • 处理结果: string

示例

typescript
const text = formatAsDisplayedMessage(
  "{{char}} speaks in {{lastMessageId}}"
);
text == "<p>少女歌剧 speaks in 5</p>";

retrieveDisplayedMessage

获取消息楼层号对应的消息内容 JQuery。

相比于一个实用函数,这更像是一个告诉你可以这样用 JQuery 的示例。

typescript
function retrieveDisplayedMessage(message_id: number): JQuery<HTMLDivElement> {
  return $(`div.mes[mesid = "${message_id}"]`, window.parent.document).find(
    `div.mes_text`
  );
}

参数

message_id

  • 类型: number
  • 描述: 要获取的消息楼层号,必须要酒馆页面显示了该消息楼层才能获取到

返回值

  • 对应的JQuery: 如果能获取到该消息楼层的 html, 则返回对应的 JQuery; 否则返回空 JQuery

示例

typescript
const text = retrieveDisplayedMessage(0).text();
typescript
// 这样的修改只会影响本次显示,不会保存到消息文件中,因此重新加载消息或刷新网页等操作后就会回到原样;
// 如果需要实际修改消息文件,请使用 `setChatMessages`
retrieveDisplayedMessage(0).text("new text");
retrieveDisplayedMessage(0).append("<pre>new text</pre>");
retrieveDisplayedMessage(0).append(
  formatAsDisplayedMessage("{{char}} speaks in {{lastMessageId}}")
);

作者:KAKAA, 青空莉想做舞台少女的狗