feat: backup plugins

Signed-off-by: MiaoWoo <admin@yumc.pw>
MiaoWoo 2020-10-02 18:54:10 +08:00
parent f111b9891c
commit 41d3923d94
3 changed files with 771 additions and 732 deletions

View File

@ -42,15 +42,21 @@
### 基础准备工作
- QQ搜索小程序 `圈云盒子` 并登录
- 申请内测服务器账号 个人中心 => 配置面板 => 圈云盒子客服群 加群申请
- 申请内测服务器账号
- 个人中心 => 配置面板 => 圈云盒子客服群
- 打开群详情 加群
### 接下来就是赚钱的操作
### 服务器准备工作
- 先安装 `MiaoScript` [站内地址]()
- 打开 [圈云盒子管理后台](https://reward.yumc.pw)
- 先安装 `MiaoScript` [站内地址](https://www.mcbbs.net/thread-774401-1-1.html)
- 可以通过 Yum 快速安装 `/yum install MiaoScript`
- 等待 MiaoScript 引擎启动完成(首次启动可能需要10-20秒 依赖于您的网络环境)
- 执行 `/mspm install MiaoReward`
### 绑定服务器
- 由于当前框架存在BUG 请先执行 `/mspm reload MiaoReward` 生成配置文件
- 执行 `/mrd bind server`
- 使用QQ扫码
- 选择需要绑定的服务器
@ -59,7 +65,11 @@
- 执行 `/mrd ratio 0.001` (最低为 1:0.0001)
- 执行兑换比例确认指令
- 执行 `/mrd server` 查看服务器信息
- 如需绑定多台 可以直接复制绑定之后的 `MiaoScript/plugins/MiaoReward/config.yml` 文件到多台服务器上 然后 `/mrd reload` 重载插件
- 如果群组服需要绑定多台服务器(前提是每个服务器都有玩家在)
- 执行 `/gmspm install MiaoReward` 批量安装
- 可以直接复制绑定之后的 `MiaoScript/plugins/MiaoReward/config.yml`
- 黏贴配置文件到所有需要绑定的服务器上
- 然后 `/gmspm reload MiaoReward` 批量重载插件
### QQ群配置
- 打开小程序
@ -72,6 +82,7 @@
- 执行 `/mrd bind`
- 使用QQ扫码
- 完成绑定
- 执行 `/mrd query` 查询信息
## 使用说明
- 玩家可以通过下列方式获取喵币
@ -82,13 +93,21 @@
- 腐竹可以在平台将喵币兑换成RMB(兑换比例请加群联系客服详谈)
- 登录小程序后 个人中心 => 配置面板 => 圈云盒子客服群
## PAPI兼容
- 目前已经兼容 PAPI 变量
- `%mrd_balance%` 玩家喵币
- `%mrd_sign%` 玩家签到(*/1)
- `%mrd_video%` 玩家视频观看次数(*/300)
- `%mrd_box%` 玩家盒子观看次数(*/300)
- 如果玩家变量没有及时更新 执行 `/mrd query``重新登录游戏` 即可
## 配置文件
``` yaml
```yml
# 服务器ID
serverId: '16'
serverId: 16
# 服务器Token
serverToken: d50d3f6e-2a59-460a-2b29-82b66c4bbf52
serverToken: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
# 兑换指令
drawCommand: 'p give %player_name% %amount%'
# 冷却时间
@ -97,6 +116,10 @@ drawCooldown: 300
prefix: '§6[§b广告系统§6]§r'
```
## 插件源码
- [MiaoScript包管理中心](http://ms.yumc.pw/api/plugin/download/name/MiaoReward)
## Roadmap
- 绑定服务器(已完成)
- 绑定玩家(已完成)

View File

@ -1,5 +1,5 @@
import { constants, task, server, channel, chat, proxy } from "@ccms/api"
import { JSPlugin, interfaces, Cmd, Tab, Listener, Config } from "@ccms/plugin"
import { JSPlugin, interfaces, Cmd, Tab, Listener, Config, PluginConfig } from "@ccms/plugin"
import { QRCode, QRErrorCorrectLevel } from '@ccms/common/dist/qrcode'
@ -62,7 +62,7 @@ interface UserInfo {
box: string
}
@JSPlugin({ prefix: 'MRD', version: '1.3.2', author: 'MiaoWoo', servers: [constants.ServerType.Bukkit], source: __filename })
@JSPlugin({ prefix: 'MRD', version: '1.3.3', author: 'MiaoWoo', servers: [constants.ServerType.Bukkit], source: __filename })
export class MiaoReward extends interfaces.Plugin {
private serverInfo: any
private cacheBindUuid = ''
@ -90,7 +90,7 @@ export class MiaoReward extends interfaces.Plugin {
private bungee: proxy.BungeeCord
@Config()
private config = {
private config: PluginConfig = {
prefix: '§6[§b广告系统§6]§r',
serverId: '',
serverToken: '',
@ -114,7 +114,7 @@ export class MiaoReward extends interfaces.Plugin {
this.logger.prefix = this.config.prefix
this.downgrade = Bukkit.getServer().class.name.split('.')[3] == "v1_7_R4"
this.updateServerInfo()
this.updatePlayerInfo()
this.updateOnlinePlayersInfo()
}
private updateServerInfo(player?: any) {
@ -132,15 +132,12 @@ export class MiaoReward extends interfaces.Plugin {
}).async().submit()
}
private updatePlayerInfo(player?: any) {
this.taskManager.create(() => {
Java.from(this.server.getOnlinePlayers()).forEach(p => {
let info = this.queryUser(p)
if (info.code == 200) {
this.playerInfoCache.set(p.getName(), info.data)
private updateOnlinePlayersInfo() {
Java.from(this.server.getOnlinePlayers()).forEach(player => this.updatePlayerInfo(player))
}
})
}).async().submit()
private updatePlayerInfo(player: org.bukkit.entity.Player) {
this.taskManager.create(() => this.queryUser(player)).async().submit()
}
@JSClass('com.google.common.io.ByteStreams')
@ -190,20 +187,15 @@ export class MiaoReward extends interfaces.Plugin {
} else {
this.PlaceholderAPI.registerPlaceholderHook("mrd", new this.PlaceholderHook({
onPlaceholderRequest: (player: any, s: string) => {
if (!this.playerInfoCache.has(player.getName())) {
return '用户未绑定'
}
if (!this.playerInfoCache.has(player.getName())) { return '用户未绑定' }
let data = this.playerInfoCache.get(player.getName())
switch (s.toLowerCase()) {
case "balance":
return data.balance
case "sign":
return data.sign
case "box":
return data.box
default:
case "balance": return data.balance
case "sign": return data.sign
case "video": return data.video
case "box": return data.box
default: return "未知的参数: " + s
}
return "未知的参数: " + s
}
}))
}
@ -326,6 +318,7 @@ export class MiaoReward extends interfaces.Plugin {
cmddraw(sender: org.bukkit.entity.Player, amount: number) {
if (!sender.getItemInHand) { return this.logger.sender(sender, '§c手持物品检测异常 请检查是否在客户端执行命令!') }
if (!this.playerInfoCache.has(sender.getName())) { return this.logger.sender(sender, '§c当前用户尚未绑定服务器玩家账号 请先执行 /mrd bind 绑定账号!') }
amount = Number(amount)
if (!Number.isInteger(amount)) {
return this.logger.sender(sender, '§4金额必须是数字!')
@ -419,12 +412,13 @@ export class MiaoReward extends interfaces.Plugin {
if (result.code !== 200) {
return this.logger.sender(sender, `§4操作异常 §6服务器返回: §c${result.msg}`)
}
let data = result.data
this.logger.sender(sender, [
`§6====== ${this.config.prefix} §a服务器信息 §6======`,
`§6服务器: §a${result.data.name}`,
`§6喵币余额: §b${result.data.score} §6喵币`,
`§6喵币比例: §b${result.data.ratio}`,
`§6今日收入: §b${result.data.today} §6喵币`,
`§6服务器: §a${data.name}`,
`§6喵币余额: §b${data.score} §6喵币`,
`§6喵币比例: §b${data.ratio}`,
`§6今日收入: §b${data.today} §6喵币`,
`§6====== ${this.config.prefix} §a服务器信息 §6======`,
])
}
@ -469,6 +463,10 @@ export class MiaoReward extends interfaces.Plugin {
})
}
cmdreload() {
this.config.reload()
}
private ratio2string(ratio) {
ratio = parseFloat(ratio)
if (ratio > 1) {
@ -499,9 +497,10 @@ export class MiaoReward extends interfaces.Plugin {
if (check.code == 200) {
this.config.serverId = check.data.serverId
this.config.serverToken = check.data.serverToken
this.config['save']()
this.config.save()
this.logger.sender(sender, '§a已成功绑定服务器: §b' + check.data.serverName)
this.updateServerInfo()
this.updateServerInfo(sender)
this.updateOnlinePlayersInfo()
}
sync.scaned = true
}).async().submit()
@ -590,13 +589,17 @@ export class MiaoReward extends interfaces.Plugin {
private queryUser(sender: org.bukkit.entity.Player, sync = false) {
if (!this.config.serverId || !this.config.serverToken) { return this.logger.sender(sender, '§4当前服务器尚未配置绑定ID 请联系腐竹进行配置!') }
return this.httpPost(`https://reward.yumc.pw/server/queryUser`, {
let result = this.httpPost(`https://reward.yumc.pw/server/queryUser`, {
id: this.config.serverId,
token: this.config.serverToken,
uuid: sender.getUniqueId().toString(),
username: sender.getName(),
sync
})
if (result?.code == 200) {
this.playerInfoCache.set(sender.getName(), result.data)
}
return result
}
cmdquery(sender: org.bukkit.entity.Player) {
@ -687,10 +690,7 @@ CAST TIME : ${Date.now() - startTime}`)
PlayerJoinEvent(event: org.bukkit.event.player.PlayerJoinEvent) {
const player = event.getPlayer()
this.bungeeCordDetect(player)
let info = this.queryUser(player)
if (info.code == 200) {
this.playerInfoCache.set(player.getName(), info.data)
}
this.updatePlayerInfo(player)
}
@Listener()
@ -750,7 +750,7 @@ CAST TIME : ${Date.now() - startTime}`)
}
private isQrCodeItem(item: org.bukkit.inventory.ItemStack): boolean {
if (!item) { return false }
if (!item || item.getType() == Material.AIR) { return false }
if ((item.getType() == Material.MAP || item.getType() == Material.FILLED_MAP) && item.hasItemMeta()) {
return Java.from(item.getItemMeta().getLore()).indexOf('QRCODE') != -1
}

View File

@ -47,6 +47,7 @@ let langMap = {
'download.start': '§6开始下载插件: §b{name} §6版本 §3{version}',
'download.url': '§6插件下载地址: §b{url}',
'download.finish': '§6插件 §b{name} §6版本 §3{version} §a下载完毕 开始加载 ...',
'install.already': '§6插件 §b{name} §6版本 §3{version} §c已安装在服务器 §3更新请用 update 命令!',
'install.finish': '§6插件 §b{name} §6版本 §3{version} §a安装成功!',
'update.finish': '§6插件 §b{name} §6版本 §3{version} §a更新成功!',
'upgrade.confirm': '§6您正在尝试更新 §bMiaoScript §c核心 §6请执行 §b/mpm §aupgrade §cconfirm §6确认执行!',
@ -177,7 +178,7 @@ export class MiaoScriptPackageManager extends interfaces.Plugin {
let message = JSON.parse(input.readUTF())
let fakeSender = this.getProxySender(message.sender)
this.taskManager.create(() => this.main(fakeSender, message.command, message.args)).async().submit()
this.logger.sender(fakeSender, `§6命令 §b/mpm ${message.args?.join?.(' ')} §a执行成功!`)
this.logger.sender(fakeSender, `§6命令 §b/mspm ${message.args?.join?.(' ')} §a执行成功!`)
}
private getProxySender(name: string) {
@ -224,7 +225,7 @@ export class MiaoScriptPackageManager extends interfaces.Plugin {
if (!this.isBungeeCord) return this.logger.sender(sender, '§c当前服务器尚未检测到 BungeeCord 链接...')
this.taskManager.create(() => this.main(sender, command, args)).async().submit()
this.bungeeCordForward(sender, { sender: sender.getName(), command, args })
this.logger.sender(sender, `§6[§3BPM§6][§a${this.serverName}§6] §6命令 §b/mpm ${args.join?.(' ')} §a发布成功!`)
this.logger.sender(sender, `§6[§3BPM§6][§a${this.serverName}§6] §6命令 §b/mspm ${args.join?.(' ')} §a发布成功!`)
}
@Cmd({ servers: [constants.ServerType.Bungee] })
@ -264,6 +265,18 @@ export class MiaoScriptPackageManager extends interfaces.Plugin {
])
}
cmdsudo(sender: any, name: string, ...args: string[]) {
this.taskManager.create(() => {
let player = this.server.getPlayer(name)
if (!player) {
return this.logger.sender(sender, `§4玩家 ${player.getName()} 不在线或不存在!`)
}
let command = args.join(' ')
this.server.dispatchCommand(player, command)
this.logger.sender(sender, `§6玩家 §a${player.getName()} §6命令 §b${command} §a执行完成!`)
}).submit()
}
cmdload(sender: any, name: string) {
let pluginFile = fs.concat(__dirname + '', name)
if (!fs.exists(pluginFile)) {
@ -290,7 +303,7 @@ export class MiaoScriptPackageManager extends interfaces.Plugin {
cmdinstall(sender: any, name: string) {
if (!name) { return this.i18n(sender, 'plugin.name.empty') }
if (this.pluginManager.getPlugins().has(name)) {
this.i18n(sender, 'install.already', { name, version: this.pluginManager.getPlugins().get(name).description.version })
return
}
this.download(sender, name, false, () => {
@ -402,7 +415,7 @@ export class MiaoScriptPackageManager extends interfaces.Plugin {
this.i18n(sender, 'prun.script', { name })
this.i18n(sender, 'run.script', { script })
let result = this.runCode(script, sender, this.pluginManager.getPlugins().get(name))
this.i18n(sender, 'run.result', { result: result == undefined ? this.translate.translate('run.noresult') : result + '' })
this.i18n(sender, 'run.result', { result: result == undefined ? this.translate.translate('run.noresult') : typeof result == "string" ? result : JSON.stringify(result) })
} catch (ex) {
this.logger.sender(sender, this.logger.stack(ex))
}
@ -429,8 +442,8 @@ if (this.serverType == "spring") {
var db = dbm.getMainDatabase()
var df = base.getInstance().getAutowireCapableBeanFactory()
}
return ''+ eval(${JSON.stringify(code)});`)
return tfunc.apply(_this, params) + ''
return eval(${JSON.stringify(code)});`)
return tfunc.apply(_this, params)
}
cmddeploy(sender: any, name: any) {
@ -460,7 +473,7 @@ return ''+ eval(${JSON.stringify(code)});`)
@Tab({ alias: ['gmspm', 'bungeemspm'] })
tabmspm(_sender: any, _command: any, args: string | any[]) {
if (args.length === 1) { return ['list', 'install', 'update', 'upgrade', 'reload', 'restart', 'run', 'prun', 'help', 'create', 'deploy'] }
if (args.length === 1) { return ['list', 'install', 'update', 'upgrade', 'reload', 'restart', 'run', 'prun', 'sudo', 'help', 'create', 'deploy'] }
if (args.length > 1) {
switch (args[0]) {
case "list":
@ -474,6 +487,9 @@ return ''+ eval(${JSON.stringify(code)});`)
case "prun":
if (args.length == 2) return [...this.pluginManager.getPlugins().keys()]
return []
case "sudo":
if (args.length == 2) return Java.from(this.server.getOnlinePlayers()).map(p => p.getName())
return []
case "update":
case "load":
case "unload":