koishi-plugin-jrys-prpr
Version:
[<ruby>**jrys-prpr**<rp>(</rp><rt>点我查看预览图</rt><rp>)</rp></ruby>](https://i0.hdslb.com/bfs/article/ae33f1b2e9dbc3fe89363a40fbf040703493298333289018.png)😽QQ官方json按钮支持,20个群即可发按钮!支持 monetary!很好看的字体! 支持自动清理记录内容。
166 lines (151 loc) • 5.19 kB
text/typescript
import fs from 'node:fs'
import type { Context } from 'koishi'
import type { Config } from '../types'
/**
* 记录用户签到时间
*/
export async function recordSignIn(ctx: Context, userId: string, channelId: string): Promise<void> {
const currentTime = new Date()
const dateString = currentTime.toISOString().split('T')[0] // 获取当前日期字符串
const [record] = await ctx.database.get('jrysprprdata', { userid: userId, channelId })
if (record) {
// 更新用户签到时间
await ctx.database.set('jrysprprdata', { userid: userId, channelId }, { lastSignIn: dateString })
} else {
// 创建新的签到记录
await ctx.database.create('jrysprprdata', { userid: userId, channelId, lastSignIn: dateString })
}
}
/**
* 检查用户是否已签到
*/
export async function alreadySignedInToday(ctx: Context, userId: string, channelId: string, config: Config): Promise<boolean> {
const currentTime = new Date()
const dateString = currentTime.toISOString().split('T')[0] // 获取当前日期字符串
if (!config.Repeated_signin_for_different_groups) {
// 如果不允许从不同群组签到,检查所有群组
const records = await ctx.database.get('jrysprprdata', { userid: userId })
// 检查是否有任何记录的签到日期是今天
return records.some(record => record.lastSignIn === dateString)
} else {
// 仅检查当前群组
const [record] = await ctx.database.get('jrysprprdata', { userid: userId, channelId })
if (record) {
// 检查最后签到日期是否是今天
return record.lastSignIn === dateString
}
}
// 如果没有记录,表示未签到
return false
}
/**
* 更新用户货币
*/
export async function updateUserCurrency(
ctx: Context,
uid: string,
amount: number,
currency: string,
logInfo: (...args: any[]) => void
): Promise<string> {
try {
const numericUserId = Number(uid) // 将 userId 转换为数字类型
// 通过 ctx.monetary.gain 为用户增加货币,
// 或者使用相应的 ctx.monetary.cost 来减少货币
if (amount > 0) {
await ctx.monetary.gain(numericUserId, amount, currency)
logInfo(`为用户 ${uid} 增加了 ${amount} ${currency}`)
} else if (amount < 0) {
await ctx.monetary.cost(numericUserId, -amount, currency)
logInfo(`为用户 ${uid} 减少了 ${-amount} ${currency}`)
}
return `用户 ${uid} 成功更新了 ${Math.abs(amount)} ${currency}`
} catch (error) {
ctx.logger.error(`更新用户 ${uid} 的货币时出错: ${error}`)
return `更新用户 ${uid} 的货币时出现问题。`
}
}
/**
* 获取用户货币
*/
export async function getUserCurrency(ctx: Context, uid: string, currency: string): Promise<number> {
try {
const numericUserId = Number(uid)
const [data] = await ctx.database.get('monetary', {
uid: numericUserId,
currency,
}, ['value'])
return data ? data.value : 0
} catch (error) {
ctx.logger.error(`获取用户 ${uid} 的货币时出错: ${error}`)
return 0
}
}
/**
* 获取原图 URL
*/
export async function getOriginalImageURL(ctx: Context, jsonFilePath: string, messageIdOrTime: string): Promise<string | null> {
try {
const data = await fs.promises.readFile(jsonFilePath, { encoding: 'utf-8' })
const images = JSON.parse(data)
// 确保输入参数为字符串
const input = messageIdOrTime.toString()
// 检查输入参数是消息ID还是时间戳
const isTimestamp = /^\d{15,}$/.test(input)
// 定义变量来存储匹配结果
let matchedImage = null
// 查找对应的背景图URL
for (const image of images) {
if (isTimestamp) {
// 匹配时间戳
if (image.messageTime === input) {
matchedImage = image
break
}
} else {
// 匹配消息ID
if (Array.isArray(image.messageId) && image.messageId.includes(input)) {
matchedImage = image
break
}
// 处理 messageId 是空字符串的情况
if (image.messageId.length === 0 && image.messageTime === input) {
matchedImage = image
break
}
}
}
// 返回匹配的背景图URL
if (matchedImage) {
return matchedImage.backgroundURL
} else {
// 如果未找到对应的URL,返回null
return null
}
} catch (error) {
ctx.logger.error('读取或解析JSON文件时出错: ', error)
throw error
}
}
/**
* 删除图片记录
*/
export async function deleteImageRecord(
ctx: Context,
jsonFilePath: string,
messageId: string,
imageURL: string,
logInfo: (...args: any[]) => void
): Promise<void> {
try {
const data = JSON.parse(fs.readFileSync(jsonFilePath, 'utf-8'))
const index = data.findIndex(record => record.messageId.includes(messageId) && record.backgroundURL === imageURL)
if (index !== -1) {
data.splice(index, 1)
fs.writeFileSync(jsonFilePath, JSON.stringify(data, null, 2), 'utf-8')
logInfo(`已删除消息ID ${messageId} 的记录`)
}
} catch (error) {
ctx.logger.error("删除记录时出错: ", error)
}
}