koishi-plugin-adapter-iirose
Version:
[IIROSE-蔷薇花园](https://iirose.com/)适配器
148 lines (131 loc) • 3.1 kB
text/typescript
import { decode } from '../../utils/entities';
import { parseAvatar } from '../../utils/utils';
export interface replyMessage
{
message: string;
username: string;
time: number;
}
interface data
{
type?: string;
timestamp: number;
avatar: string;
username: string;
message?: string;
color: string;
uid: string;
title: string;
messageId?: number;
replyMessage?: replyMessage[] | null;
}
export interface MusicMessage
{
type?: string;
timestamp: number;
avatar: string;
username: string;
message?: string;
color: string;
uid: string;
title: string;
messageId?: number;
musicName: string;
musicSinger: string;
musicPic: string;
musicColor: string;
}
/**
* 解析消息中的回复部分
* @param msg 消息字符串
* @returns {replyMessage[] | null}
*/
const replyMsg = (msg: string): replyMessage[] | null =>
{
if (msg.includes(' (_hr) '))
{
const replies: replyMessage[] = [];
msg.split(' (hr_) ').forEach(e =>
{
if (e.includes(' (_hr) '))
{
const tmp = e.split(' (_hr) ');
const user = tmp[1].split('_');
replies.unshift({
message: decode(tmp[0]),
username: decode(user[0]),
time: Number(user[1]),
});
replies.sort((a, b) =>
{
return (a.time - b.time);
});
} else
{
// @ts-ignore
replies.unshift(e);
}
});
return replies;
}
return null;
};
/**
* 从解析后的数据中分析出音乐消息
* @param input 解析后的数据
* @returns {MusicMessage}
*/
export const musicMessageAnalyze = (input: data): MusicMessage =>
{
const { timestamp, avatar, username, message, color, uid, title, messageId } = input;
// 不要移除空格,因为歌曲或歌手名中可能包含空格
const musicData = message.split('>');
return {
timestamp,
avatar,
username,
color,
uid,
title,
messageId,
// 对音乐名称和歌手进行解码
musicName: decode(musicData[1]),
musicSinger: decode(musicData[2]),
musicPic: musicData[3],
musicColor: musicData[4],
};
};
/**
* 解析音乐卡片消息
* @param input 消息
* @returns {MusicMessage | null}
*/
export const musicMessage = (input: string) =>
{
if (input.substring(0, 1) !== '"') return null;
const message: string = input.substring(1);
if (message.indexOf('<') === -1)
{
const tmp = message.split('>');
if (tmp.length === 11)
{
if (/^\d+$/.test(tmp[0]))
{
const reply = replyMsg(tmp[3]);
const message = reply ? String(reply.shift()) : tmp[3];
const msg = {
timestamp: Number(tmp[0]),
avatar: parseAvatar(tmp[1]),
username: decode(tmp[2]),
message: decode(message),
color: tmp[5],
uid: tmp[8],
title: tmp[9] === "'108" ? '花瓣' : tmp[9],
messageId: Number(tmp[10]),
replyMessage: reply,
};
if (message.startsWith('m__4@')) { return musicMessageAnalyze(msg); }
}
}
}
};