Skip to content

Commit

Permalink
refine for publishing
Browse files Browse the repository at this point in the history
  • Loading branch information
DGCK81LNN committed Jan 9, 2024
1 parent 1038976 commit 843fe70
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 48 deletions.
21 changes: 17 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,20 +1,33 @@
{
"name": "@dgck81lnn/koishi-plugin-derpi",
"description": "",
"version": "0.0.1",
"description": "Random Derpibooru images for koishi",
"version": "0.1.0",
"main": "lib/index.js",
"typings": "lib/index.d.ts",
"files": [
"lib",
"dist"
],
"license": "MIT",
"scripts": {},
"homepage": "https://github.com/DGCK81LNN/koishi-plugin-derpi",
"repository": {
"type": "git",
"url": "git+https://github.com/DGCK81LNN/koishi-plugin-derpi.git"
},
"keywords": [
"chatbot",
"koishi",
"plugin"
"derpibooru"
],
"koishi": {
"description": {
"en": "Get random images from Derpibooru",
"zh": "随机 Derpibooru 图片"
},
"locales": [
"zh"
]
},
"peerDependencies": {
"koishi": "^4.16.1"
},
Expand Down
58 changes: 55 additions & 3 deletions readme.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,57 @@
# @dgck81lnn/koishi-plugin-lnnbot-derpi
# @dgck81lnn/koishi-plugin-derpi

[![npm](https://img.shields.io/npm/v/@dgck81lnn/koishi-plugin-lnnbot-derpi?style=flat-square)](https://www.npmjs.com/package/@dgck81lnn/koishi-plugin-lnnbot-derpi)
[![npm](https://img.shields.io/npm/v/@dgck81lnn/koishi-plugin-derpi?style=flat-square)](https://www.npmjs.com/package/@dgck81lnn/koishi-plugin-derpi)

undefined
随机 Derpibooru 图片

## 用法

### `derpi`

```
指令:derpi <id>
获取呆站图片
```

例:`derpi 1335306`

### `derpi.random`

```
指令:derpi random [query]
随机获取呆站图片
输入 derpi.random,后加一个 Derpibooru 搜索串,用于筛选图片。若搜索串中有空格,需给整个搜索串加引号。
省略搜索串或输入“再来一张”(或“再来”)可重复最近一次请求。
也可以直接使用以下快捷方式来调用预设的搜索串和选项:
随机小马图
随机暮暮/紫悦/TS图
随机萍琪/碧琪/PP图
随机阿杰/嘉儿/AJ图
随机柔柔/小蝶/FS图
随机云宝/戴茜/黛茜/黛西/RD图
随机瑞瑞/珍奇/RY图
```

例:`derpi.random "pony, sunset shimmer"`

该指令有几个隐藏选项:

* `--r34 <level>` 指定最高允许的 R34 分级:`--r34 1``-s` 表示 `suggestive``--r34 2``-q` 表示 `questionable``--r34 3``-e` 表示 `explicit`

* `--dark <level>` 指定最高允许的黑暗内容分级:`--dark 1``-S` 表示 `semi-grimdark``--dark 2``-g` 表示 `grimdark`

* `--grotesq`, `-G` 若指定,则允许血腥或恶心(`grotesque`)的图片

不指定上述任何选项的情况下,默认只显示 `safe` 分级的图片。

## 主要配置项

* `booruUrl`:图站网址。默认为 [Derpibooru](https://derpibooru.org) `https://derpibooru.org`。若机器人网络无法访问 Derpibooru,可将此项设为其另一域名 `https://trixiebooru.org`。也可以设置为其他基于 [Philomena](https://github.com/philomena-dev/philomena) 的图站,如 [Ponybooru](https://ponybooru.org) `https://ponybooru.org`[Furbooru](https://furbooru.org) `https://furbooru.org`[Ponerpics](https://ponerpics.org) `https://ponerpics.org`[Manebooru](https://manebooru.art) `https://manebooru.art`

* `filterId`:获取随机图片时使用的过滤器编号。默认为 [191275](https://derpibooru.org/filters/191275)。被该过滤器隐藏的图片不会出现在随机图结果中。若使用 Derpibooru 以外的图站,需要到相应图站上创建或选择合适的过滤器,然后将此项设置成过滤器详情页的网址中“`/filters/`”后的数字。设置为 -1 时使用图站的默认过滤器。

* `restrictions`:随机图片必须满足的搜索词。会自动添加到所有搜索词中。默认为 `wilson_score.gte:0.93`(威尔逊得分不低于 0.93)。

* `randomShortcuts`:定义随机图片的预设搜索词快捷方式。默认为“随机**小马**图” = `derpi.random pony`、“随机**暮暮**/**紫悦**/**TS**图” = `derpi.random ts,pony,solo` 等 7 个。

关于其余配置项,请到 Koishi 控制台安装并应用本插件后查看。
63 changes: 22 additions & 41 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Context, Schema, Session, Time, escapeRegExp, segment } from "koishi"
import type {} from "@koishijs/plugin-help" // used to define hidden options
import { getRandomImage, LoadedImage, loadImage, setBooruUrl } from "./api"
import ErrorWrapper from "./error-wrapper"
import { toFileURL } from "./utils"
Expand All @@ -9,6 +10,8 @@ export interface Config {
booruUrl: string
/** 获取图片时使用的过滤器编号 */
filterId: number
/** 随机图片必须满足的条件 */
restrictions: string
/** 收到请求后,延迟多长时间发送“请稍候” */
holdOnTime: number
/** 在指定时间内,同一频道内如果已经请求过图片,则不再发送“请稍候” */
Expand Down Expand Up @@ -43,6 +46,9 @@ export interface Config {
export const Config: Schema<Config> = Schema.object({
booruUrl: Schema.string().description("图站网址。").default("https://derpibooru.org"),
filterId: Schema.number().description("获取图片时使用的过滤器编号。").default(191275),
restrictions: Schema.string()
.description("随机图片必须满足的条件。会自动添加到所有搜索词中。")
.default("wilson_score.gte:0.93"),
holdOnTime: Schema.number()
.description("收到请求后,延迟多长时间发送“请稍候”。(毫秒)")
.default(5 * Time.second),
Expand Down Expand Up @@ -131,9 +137,8 @@ export const Config: Schema<Config> = Schema.object({
]),
})

export function apply(ctx: Context, config: Partial<Config> = {}) {
const logger = ctx.logger("lnnbot-derpi")
config = Config(config as Config)
export function apply(ctx: Context, config: Config) {
const logger = ctx.logger("derpi")
setBooruUrl(config.booruUrl)

/**
Expand Down Expand Up @@ -191,24 +196,25 @@ export function apply(ctx: Context, config: Partial<Config> = {}) {
const cmdDerpiRandom = ctx
.command("derpi.random [query:string]", {
//checkArgCount: true,
//checkUnknown: true,
checkUnknown: true,
showWarning: true,
})
.option("r34", "<level:number>", { fallback: 0 })
.option("r34", "<level:number>", { fallback: 0, hidden: true })
.option("r34", "-s", { value: 1 })
.option("r34", "-q", { value: 2 })
.option("r34", "-e", { value: 3 })
.option("dark", "<level:number>", { fallback: 0 })
.option("dark", "<level:number>", { fallback: 0, hidden: true })
.option("dark", "-S", { value: 1 })
.option("dark", "-g", { value: 2 })
.option("grotesq", "<level:boolean>", { fallback: false })
.option("grotesq", "-G", { value: true })
.option("grotesq", "-G", { fallback: false, hidden: true })
.shortcut(/^(?:再来|再来一张)$/)
.shortcut(/^随机(?:马)图$/i, { args: ["pony"] })

const randomShortcutsUsage = config.randomShortcuts.map(({ name, query, options }) => {
const nameArr: string[] = typeof name === "string" ? [name] : name
const namesRe = nameArr.map(n => escapeRegExp(n)).join("|")
const regExp = new RegExp(`^随机(?:${namesRe})图$`, "i")
//console.dir(regExp)
cmdDerpiRandom.shortcut(regExp, { args: [query], options })

return `随机${nameArr.join("/")}图`
Expand All @@ -227,7 +233,7 @@ export function apply(ctx: Context, config: Partial<Config> = {}) {
.action(({ session, options: { r34, dark, grotesq } }, query) => {
let q: string
if (query) {
const restrictions = ["wilson_score.gte:0.93"]
const restrictions = [`(${config.restrictions})`]
if (r34 || dark || grotesq) {
switch (r34) {
case 0:
Expand All @@ -250,43 +256,18 @@ export function apply(ctx: Context, config: Partial<Config> = {}) {
q = `(${query}),${restrictions.join(",")}`
lastQueryMap.set(session.cid, q)
} else {
if (r34 || dark || grotesq) return session.text(".require-query")
const elapsedTime = Date.now() - (lastInvokeTimeMap.get(session.cid) ?? -Infinity)
if (elapsedTime > config.anotherTimeout || !lastQueryMap.has(session.cid))
return session.text(".require-query")
q = lastQueryMap.get(session.cid)
}
return sendImage(session, getRandomImage({ filter_id: config.filterId, q }))
const opt = Object.assign(
{ q },
config.filterId >= 0 ? { filter_id: config.filterId } : null
)
return sendImage(session, getRandomImage(opt))
})

ctx.i18n.define("zh", "commands.derpi", {
description: "获取呆站图片",
messages: {
"metadata-error": "加载图片信息失败。",
"image-error": "加载图片失败。",
"is-removed": "该图片已被删除。",
"is-video": "不支持获取视频。",
"too-fast": "操作过于频繁,请等待上一张图片请求完成后再试。",
"hold-on": "请稍候,正在获取……",
},
})
ctx.i18n.define("zh", "commands.derpi.random", {
description: "随机获取呆站图片",
options: {
r34: "指定最高可能出现的 R34 分级:--r34 1 或 -s 表示性暗示,--r34 2 或 -q 表示强烈性暗示,--r34 3 或 -e 表示露骨性描写",
dark: "指定最高可能出现的黑暗内容分级:--dark 1 或 -S 表示轻度黑暗,--dark 2 或 -g 表示重度黑暗",
grotesq: "若指定,则可能出现血腥或恶心的图片",
},
messages: {
"usage":
"输入 derpi.random,后加一个 Derpibooru 搜索串,用于筛选图片。若搜索串中有空格,需给整个搜索串加引号。",
"usage-another": "省略搜索串或输入“再来一张”(或“再来”)可重复最近一次请求。",
"usage-shortcuts": "也可以直接使用以下快捷方式来调用预设的搜索串和选项:",
"require-query": "请指定筛选图片的搜索串。",
"metadata-error": "搜索图片失败。",
"image-error": "加载图片失败。",
"no-result": "没有找到符合条件的图片。",
"too-fast": "操作过于频繁,请等待上一张图片请求完成后再试。",
"hold-on": "请稍候,正在获取……",
},
})
ctx.i18n.define("zh", require("./locales/zh"))
}
26 changes: 26 additions & 0 deletions src/locales/zh.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
commands:
derpi:
description: 获取呆站图片
messages:
metadata-error: 加载图片信息失败。
image-error: 加载图片失败。
is-removed: 该图片已被删除。
is-video: 不支持获取视频。
too-fast: 操作过于频繁,请等待上一张图片请求完成后再试。
hold-on: 请稍候,正在获取……
random:
description: 随机获取呆站图片
options:
r34: 指定最高可能出现的 R34 分级:--r34 1 或 -s 表示性暗示,--r34 2 或 -q 表示强烈性暗示,--r34 3 或 -e 表示露骨性描写
dark: 指定最高可能出现的黑暗内容分级:--dark 1 或 -S 表示轻度黑暗,--dark 2 或 -g 表示重度黑暗
grotesq: 若指定,则可能出现血腥或恶心的图片
messages:
usage: 输入 derpi.random,后加一个 Derpibooru 搜索串,用于筛选图片。若搜索串中有空格,需给整个搜索串加引号。
usage-another: 省略搜索串或输入“再来一张”(或“再来”)可重复最近一次请求。
usage-shortcuts: 也可以直接使用以下快捷方式来调用预设的搜索串和选项:
require-query: 请指定筛选图片的搜索串。
metadata-error: 搜索图片失败。
image-error: 加载图片失败。
no-result: 没有找到符合条件的图片。
too-fast: 操作过于频繁,请等待上一张图片请求完成后再试。
hold-on: 请稍候,正在获取……

0 comments on commit 843fe70

Please sign in to comment.