├── .github └── workflows │ └── windows-exe-build.yml ├── .gitignore ├── LICENSE ├── Origin ├── libs │ ├── axios@0.19.2 │ │ └── dist │ │ │ └── axios.min.js │ ├── canvas-nest.js@1.0.1 │ │ └── dist │ │ │ └── canvas-nest.min.js │ ├── echarts@4.7.0 │ │ └── dist │ │ │ └── echarts.min.js │ ├── element-ui@2.13.0 │ │ └── lib │ │ │ ├── index.js │ │ │ └── theme-chalk │ │ │ ├── fonts │ │ │ ├── element-icons.ttf │ │ │ └── element-icons.woff │ │ │ └── index.css │ ├── github-buttons@2.7.0 │ │ └── dist │ │ │ └── buttons.min.js │ ├── github-markdown-css@3.0.1 │ │ └── github-markdown.css │ ├── vue@2.6.11 │ │ └── dist │ │ │ └── vue.min.js │ └── yocool@final │ │ └── origin │ │ ├── style.css │ │ └── yocool.js ├── static │ ├── .gitignore │ ├── README.md │ ├── admin │ │ ├── groups.js │ │ ├── pool-setting.js │ │ ├── setting.js │ │ └── users.js │ ├── chara_marks.png │ ├── clan │ │ ├── panel.js │ │ ├── progress.js │ │ ├── setting.js │ │ ├── statistics.js │ │ ├── statistics │ │ │ ├── deviation.png │ │ │ ├── many.png │ │ │ ├── order.png │ │ │ ├── pie.png │ │ │ └── statistics2.js │ │ ├── subscribers.js │ │ └── user.js │ ├── gacha.js │ ├── gongan.png │ ├── marionette.js │ ├── password.js │ └── small.ico └── template │ ├── 404.html │ ├── about.html │ ├── admin │ ├── groups.html │ ├── pool-setting.html │ ├── setting.html │ └── users.html │ ├── clan │ ├── panel.html │ ├── progress.html │ ├── setting.html │ ├── statistics.html │ ├── statistics │ │ ├── statistics1.html │ │ └── statistics2.html │ ├── subscribers.html │ ├── unauthorized.html │ └── user.html │ ├── help.html │ ├── homepage.html │ ├── login-code.html │ ├── login.html │ ├── manual.html │ ├── marionette.html │ ├── password.html │ ├── unauthorized.html │ ├── user-info.html │ └── user.html ├── PrincessAdventure ├── README.md ├── libs │ ├── axios@0.19.2 │ │ └── dist │ │ │ └── axios.min.js │ ├── canvas-nest.js@1.0.1 │ │ └── dist │ │ │ └── canvas-nest.min.js │ ├── echarts@4.7.0 │ │ └── dist │ │ │ └── echarts.min.js │ ├── element-ui@2.13.0 │ │ └── lib │ │ │ ├── index.js │ │ │ └── theme-chalk │ │ │ ├── fonts │ │ │ ├── element-icons.ttf │ │ │ └── element-icons.woff │ │ │ └── index.css │ ├── github-buttons@2.7.0 │ │ └── dist │ │ │ └── buttons.min.js │ ├── github-markdown-css@3.0.1 │ │ └── github-markdown.css │ ├── jquery@2.1.1 │ │ └── jquery.min.js │ ├── vue@2.6.11 │ │ └── dist │ │ │ └── vue.min.js │ └── yocool@final │ │ └── princessadventure │ │ ├── banner.png │ │ ├── box-gift.png │ │ ├── clanbg.png │ │ ├── error.png │ │ ├── flag.png │ │ ├── icon-loading.png │ │ ├── jquery.sliderBar.js │ │ ├── karin_q.png │ │ ├── karyl_q.png │ │ ├── kokkoro_q.png │ │ ├── logo.png │ │ ├── pecorine_q.png │ │ ├── scheme-01.css │ │ ├── scheme-02.css │ │ ├── scheme-03.css │ │ ├── sprite01.png │ │ ├── sprite02.png │ │ ├── sprite03.png │ │ ├── style.css │ │ ├── text-loading.png │ │ ├── yocool.js │ │ └── yui_q.png ├── static │ ├── .gitignore │ ├── README.md │ ├── admin │ │ ├── groups.js │ │ ├── pool-setting.js │ │ ├── setting.js │ │ └── users.js │ ├── chara_marks.png │ ├── clan │ │ ├── panel.js │ │ ├── progress.js │ │ ├── setting.js │ │ ├── statistics.js │ │ ├── subscribers.js │ │ └── user.js │ ├── gacha.js │ ├── gongan.png │ ├── marionette.js │ ├── password.js │ └── small.ico └── template │ ├── 404.html │ ├── about.html │ ├── admin │ ├── groups.html │ ├── pool-setting.html │ ├── setting.html │ └── users.html │ ├── clan │ ├── panel.html │ ├── progress.html │ ├── setting.html │ ├── statistics.html │ ├── statistics │ │ ├── statistics1.html │ │ └── statistics2.html │ ├── subscribers.html │ ├── unauthorized.html │ └── user.html │ ├── collection.html │ ├── gacha.html │ ├── help.html │ ├── homepage.html │ ├── jjc-solution.html │ ├── login-code.html │ ├── login.html │ ├── manual.html │ ├── marionette.html │ ├── password.html │ ├── unauthorized.html │ ├── user-info.html │ └── user.html └── README.md /.github/workflows/windows-exe-build.yml: -------------------------------------------------------------------------------- 1 | name: windows-exe-build 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | release_name: 7 | description: "发布版本名称" 8 | required: false 9 | default: v0.0.0 10 | yobot_version: 11 | description: "使用的 yobot 版本/分支" 12 | required: false 13 | default: master 14 | 15 | jobs: 16 | build: 17 | runs-on: windows-2019 18 | name: auto build windows binary 19 | 20 | steps: 21 | - name: Checkout yobot 22 | uses: actions/checkout@v2 23 | with: 24 | repository: pcrbot/yobot 25 | ref: ${{ github.event.inputs.yobot_version }} 26 | path: yobot 27 | 28 | - name: Checkout yocool 29 | uses: actions/checkout@v2 30 | with: 31 | path: yocool 32 | 33 | - name: Overwrite yobot public files 34 | shell: bash 35 | run: | 36 | cp -R yocool/PrincessAdventure/* yobot/src/client/public/ 37 | 38 | - name: Build exe binary and archive 39 | shell: cmd 40 | run: | 41 | cd .\yobot\src\client 42 | pip install pyinstaller 43 | pip install -r requirements.txt 44 | pyinstaller main.spec 45 | cd .\dist 46 | 7z a yocool-windows64.zip yobot.exe 47 | 48 | - name: Create Release 49 | id: create_release 50 | uses: actions/create-release@v1 51 | env: 52 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 53 | with: 54 | tag_name: ${{ github.event.inputs.release_name }} 55 | release_name: YoCool-${{ github.event.inputs.release_name }} 56 | draft: false 57 | prerelease: false 58 | 59 | - name: Upload Release Asset 60 | uses: actions/upload-release-asset@v1 61 | env: 62 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 63 | with: 64 | upload_url: ${{ steps.create_release.outputs.upload_url }} 65 | asset_path: ./yobot/src/client/dist/yocool-windows64.zip 66 | asset_name: YoCool-${{ github.event.inputs.release_name }}-PrincessAdventure-exe.zip 67 | asset_content_type: application/zip 68 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Develop 2 | CoolLite/ -------------------------------------------------------------------------------- /Origin/libs/canvas-nest.js@1.0.1/dist/canvas-nest.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2016 hustcc 3 | * License: MIT 4 | * Version: v1.0.1 5 | * GitHub: https://github.com/hustcc/canvas-nest.js 6 | **/ 7 | !function(){function n(n,e,t){return n.getAttribute(e)||t}function e(n){return document.getElementsByTagName(n)}function t(){var t=e("script"),o=t.length,i=t[o-1];return{l:o,z:n(i,"zIndex",-1),o:n(i,"opacity",.5),c:n(i,"color","0,0,0"),n:n(i,"count",99)}}function o(){a=m.width=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,c=m.height=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}function i(){r.clearRect(0,0,a,c);var n,e,t,o,m,l;s.forEach(function(i,x){for(i.x+=i.xa,i.y+=i.ya,i.xa*=i.x>a||i.x<0?-1:1,i.ya*=i.y>c||i.y<0?-1:1,r.fillRect(i.x-.5,i.y-.5,1,1),e=x+1;e=n.max/2&&(i.x-=.03*o,i.y-=.03*m),t=(n.max-l)/n.max,r.beginPath(),r.lineWidth=t/2,r.strokeStyle="rgba("+d.c+","+(t+.2)+")",r.moveTo(i.x,i.y),r.lineTo(n.x,n.y),r.stroke()))}),x(i)}var a,c,u,m=document.createElement("canvas"),d=t(),l="c_n"+d.l,r=m.getContext("2d"),x=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(n){window.setTimeout(n,1e3/45)},w=Math.random,y={x:null,y:null,max:2e4};m.id=l,m.style.cssText="position:fixed;top:0;left:0;z-index:"+d.z+";opacity:"+d.o,e("body")[0].appendChild(m),o(),window.onresize=o,window.onmousemove=function(n){n=n||window.event,y.x=n.clientX,y.y=n.clientY},window.onmouseout=function(){y.x=null,y.y=null};for(var s=[],f=0;d.n>f;f++){var h=w()*a,g=w()*c,v=2*w()-1,p=2*w()-1;s.push({x:h,y:g,xa:v,ya:p,max:6e3})}u=s.concat([y]),setTimeout(function(){i()},100)}(); -------------------------------------------------------------------------------- /Origin/libs/element-ui@2.13.0/lib/theme-chalk/fonts/element-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/Origin/libs/element-ui@2.13.0/lib/theme-chalk/fonts/element-icons.ttf -------------------------------------------------------------------------------- /Origin/libs/element-ui@2.13.0/lib/theme-chalk/fonts/element-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/Origin/libs/element-ui@2.13.0/lib/theme-chalk/fonts/element-icons.woff -------------------------------------------------------------------------------- /Origin/libs/yocool@final/origin/style.css: -------------------------------------------------------------------------------- 1 | /* -----------style----------- */ 2 | 3 | * { 4 | moz-user-select: -moz-none; 5 | -moz-user-select: none; 6 | -o-user-select: none; 7 | -khtml-user-select: none; 8 | -ms-user-select: none; 9 | user-select: none; 10 | } 11 | 12 | *:not(input, textarea) { 13 | -webkit-touch-callout: none; 14 | -webkit-user-select: none; 15 | } 16 | 17 | a { 18 | text-decoration: none; 19 | } 20 | 21 | body { 22 | font-family: Arial, Tahoma, sans-serif; 23 | text-align: center; 24 | } 25 | 26 | /* -----------login----------- */ 27 | 28 | 29 | .container { 30 | display: flex; 31 | justify-content: center; 32 | align-items: center; 33 | flex-flow: column; 34 | max-width: 400px; 35 | } 36 | 37 | .comment { 38 | color: #aaa; 39 | line-height: 20px; 40 | font-size: 0.8em; 41 | margin: 20px 0; 42 | } 43 | 44 | .header { 45 | position: relative; 46 | text-align: center; 47 | background: linear-gradient(60deg, rgba(43, 122, 205, 1) 0%, rgba(0, 90, 180, 1) 100%); 48 | color: white; 49 | } 50 | 51 | .inner-header { 52 | height: 200px; 53 | width: 100%; 54 | margin: 0; 55 | padding: 0; 56 | } 57 | 58 | .flex { 59 | /*Flexbox for containers*/ 60 | display: flex; 61 | justify-content: center; 62 | align-items: center; 63 | text-align: center; 64 | } 65 | 66 | .waves { 67 | position: relative; 68 | width: 100%; 69 | height: 40px; 70 | margin-bottom: -7px; 71 | /*Fix for safari gap*/ 72 | min-height: 60px; 73 | max-height: 120px; 74 | } 75 | 76 | .content { 77 | position: relative; 78 | height: 20vh; 79 | text-align: center; 80 | background-color: white; 81 | } 82 | 83 | /* Animation */ 84 | 85 | .parallax>use { 86 | animation: move-forever 25s cubic-bezier(.55, .5, .45, .5) infinite; 87 | } 88 | 89 | .parallax>use:nth-child(1) { 90 | animation-delay: -2s; 91 | animation-duration: 7s; 92 | } 93 | 94 | .parallax>use:nth-child(2) { 95 | animation-delay: -3s; 96 | animation-duration: 10s; 97 | } 98 | 99 | .parallax>use:nth-child(3) { 100 | animation-delay: -4s; 101 | animation-duration: 13s; 102 | } 103 | 104 | .parallax>use:nth-child(4) { 105 | animation-delay: -5s; 106 | animation-duration: 20s; 107 | } 108 | 109 | @keyframes move-forever { 110 | 0% { 111 | transform: translate3d(-90px, 0, 0); 112 | } 113 | 114 | 100% { 115 | transform: translate3d(85px, 0, 0); 116 | } 117 | } 118 | 119 | /*Shrinking for mobile*/ 120 | @media (max-width: 768px) { 121 | .waves { 122 | height: 40px; 123 | min-height: 40px; 124 | } 125 | 126 | .content { 127 | height: 30vh; 128 | } 129 | 130 | h1 { 131 | font-size: 24px; 132 | } 133 | } 134 | 135 | #bottomToolbar { 136 | width: 100%; 137 | height: 22px; 138 | line-height: 22px; 139 | background: #409EFF; 140 | position: fixed; 141 | bottom: 0; 142 | left: 0; 143 | _position: absolute; 144 | _top: expression(documentElement.scrollTop+documentElement.clientHeight-this.offsetHeight); 145 | z-index: 999; 146 | font-size: 13px; 147 | color: #FFF; 148 | } 149 | 150 | #bottomToolbar a { 151 | color: #FFF; 152 | } 153 | 154 | .el-icon-star-on { 155 | font-size: 20px; 156 | } 157 | 158 | .finishedRow td span { 159 | color: #909399 !important; 160 | } 161 | 162 | .finishedRow, 163 | .finishedRow td { 164 | background-color: #F5F7FA !important; 165 | color: #909399; 166 | } 167 | 168 | .finishedRow .el-table__expand-icon>.el-icon { 169 | background-color: #F5F7FA !important; 170 | color: #909399; 171 | } 172 | 173 | .finishedRow .el-table th { 174 | background-color: #F5F7FA; 175 | } 176 | 177 | .el-table--enable-row-hover .el-table__body tr:hover>td { 178 | background-color: #EBEEF5; 179 | } 180 | 181 | .el-table .cell { 182 | padding-right: 0px; 183 | } 184 | 185 | .el-table td { 186 | border-bottom: none; 187 | border-right: none; 188 | } 189 | 190 | .el-table th.is-leaf { 191 | border-bottom: none; 192 | } 193 | 194 | .el-table thead { 195 | font-weight: 500; 196 | } 197 | 198 | .el-table .sort-caret.ascending { 199 | top: 5px; 200 | } 201 | 202 | .el-table .sort-caret.descending { 203 | bottom: 7px; 204 | } 205 | 206 | .el-table__expand-icon { 207 | position: relative; 208 | cursor: pointer; 209 | -webkit-transition: -webkit-transform .2s ease-in-out; 210 | transition: -webkit-transform .2s ease-in-out; 211 | transition: transform .2s ease-in-out; 212 | transition: transform .2s ease-in-out, -webkit-transform .2s ease-in-out; 213 | height: 20px; 214 | } 215 | 216 | .el-table--border, 217 | .el-table--group { 218 | border: none; 219 | } 220 | 221 | .el-table::before { 222 | content: ''; 223 | position: absolute; 224 | background-color: transparent; 225 | z-index: 1; 226 | } 227 | 228 | .el-table--border::after, 229 | .el-table--group::after, 230 | .el-table::before { 231 | content: ''; 232 | position: absolute; 233 | background-color: transparent; 234 | z-index: 1; 235 | } 236 | 237 | .el-table__header { 238 | table-layout: auto; 239 | border-collapse: separate; 240 | } 241 | 242 | .el-table .cell { 243 | -webkit-box-sizing: border-box; 244 | box-sizing: border-box; 245 | overflow: hidden; 246 | text-overflow: ellipsis; 247 | white-space: normal; 248 | word-break: break-all; 249 | line-height: 23px; 250 | } 251 | 252 | .el-table .cell, .el-table--border td:first-child .cell, .el-table--border th:first-child .cell { 253 | padding-left: 0px; 254 | } 255 | 256 | .el-table__body, .el-table__footer, .el-table__header { 257 | table-layout: auto; 258 | border-collapse: separate; 259 | } 260 | 261 | .el-table th>.cell { 262 | padding-left: 0px; 263 | padding-right: 0px; 264 | } -------------------------------------------------------------------------------- /Origin/libs/yocool@final/origin/yocool.js: -------------------------------------------------------------------------------- 1 | document.writeln("
Powered by Yobot    |    Themes by YoCool
"); -------------------------------------------------------------------------------- /Origin/static/.gitignore: -------------------------------------------------------------------------------- 1 | *.gz -------------------------------------------------------------------------------- /Origin/static/README.md: -------------------------------------------------------------------------------- 1 | # 开发注意事项 2 | 3 | 默认配置下,此目录下的文件会被 gzip 压缩缓存。修改源文件不会立刻反映在浏览器中。开发时请在配置文件中将 `web-gzp` 值设置为 `0` 4 | 5 | 或者使用下面的命令删除所有缓存 6 | 7 | ```shell 8 | # 查看所有 .gz 文件 9 | find . -name "*.gz" -type f 10 | 11 | # 删除所有 .gz 文件 12 | find . -name "*.gz" -type f -delete 13 | ``` 14 | -------------------------------------------------------------------------------- /Origin/static/admin/groups.js: -------------------------------------------------------------------------------- 1 | var vm = new Vue({ 2 | el: '#app', 3 | data: { 4 | groupData: [], 5 | }, 6 | mounted() { 7 | this.refresh(); 8 | }, 9 | methods: { 10 | refresh: function (event) { 11 | var thisvue = this; 12 | axios.post(api_path, { 13 | action: 'get_data', 14 | csrf_token: csrf_token, 15 | }).then(function (res) { 16 | if (res.data.code == 0) { 17 | thisvue.groupData = res.data.data; 18 | } else { 19 | thisvue.$alert(res.data.message, '加载数据错误'); 20 | } 21 | }).catch(function (error) { 22 | thisvue.$alert(error, '加载数据错误'); 23 | }); 24 | }, 25 | delete_group: function (scope) { 26 | var thisvue = this; 27 | thisvue.$confirm('是否删除' + scope.row.group_name, '提示', { 28 | confirmButtonText: '确定', 29 | cancelButtonText: '取消', 30 | type: 'danger' 31 | }).then(() => { 32 | axios.post(api_path, { 33 | action: 'drop_group', 34 | csrf_token: csrf_token, 35 | group_id: scope.row.group_id, 36 | }).then(function (res) { 37 | if (res.data.code == 0) { 38 | thisvue.$message({ 39 | message: '删除成功', 40 | type: 'success', 41 | }); 42 | } else { 43 | thisvue.$message.error('删除失败' + res.data.message); 44 | } 45 | }).catch(function (error) { 46 | thisvue.$message.error(error); 47 | }); 48 | }).catch(() => { 49 | thisvue.$message({ 50 | type: 'info', 51 | message: '已取消删除' 52 | }); 53 | }); 54 | }, 55 | }, 56 | delimiters: ['[[', ']]'], 57 | }) -------------------------------------------------------------------------------- /Origin/static/admin/pool-setting.js: -------------------------------------------------------------------------------- 1 | var vm = new Vue({ 2 | el: '#app', 3 | data: { 4 | settings: null, 5 | }, 6 | mounted() { 7 | var thisvue = this; 8 | axios.get(api_path).then(function (res) { 9 | if (res.data.code == 0) { 10 | thisvue.settings = res.data.settings; 11 | } else { 12 | alert(res.data.message, '加载数据错误'); 13 | } 14 | }).catch(function (error) { 15 | alert(error, '加载数据错误'); 16 | }); 17 | }, 18 | methods: { 19 | addpool: function () { 20 | let newname = "奖池" + (Object.keys(this.settings.pool).length+1); 21 | this.$set(this.settings.pool, newname, { 22 | prop: 0, 23 | prop_last: 0, 24 | prefix: "★★★", 25 | pool: ["请输入内容"], 26 | }); 27 | }, 28 | update: function () { 29 | var thisvue = this; 30 | axios.put(api_path, { 31 | setting: thisvue.settings, 32 | csrf_token: csrf_token, 33 | }).then(function (res) { 34 | if (res.data.code == 0) { 35 | alert('设置成功,重启后生效'); 36 | } else { 37 | alert('设置失败:' + res.data.message); 38 | } 39 | }).catch(function (error) { 40 | alert(error); 41 | }); 42 | }, 43 | }, 44 | delimiters: ['[[', ']]'], 45 | }) -------------------------------------------------------------------------------- /Origin/static/admin/setting.js: -------------------------------------------------------------------------------- 1 | var vm = new Vue({ 2 | el: '#app', 3 | data: { 4 | setting: {}, 5 | activeNames: [], 6 | bossSetting: false, 7 | domain: '', 8 | domainApply: false, 9 | applyName: '', 10 | loading: false, 11 | }, 12 | mounted() { 13 | var thisvue = this; 14 | axios.get(api_path).then(function (res) { 15 | if (res.data.code == 0) { 16 | thisvue.setting = res.data.settings; 17 | } else { 18 | alert(res.data.message); 19 | } 20 | }).catch(function (error) { 21 | alert(error); 22 | }); 23 | }, 24 | methods: { 25 | update: function (event) { 26 | this.setting.web_mode_hint = false; 27 | axios.put( 28 | api_path, 29 | { 30 | setting: this.setting, 31 | csrf_token: csrf_token, 32 | }, 33 | ).then(function (res) { 34 | if (res.data.code == 0) { 35 | alert('设置成功,重启机器人后生效'); 36 | } else { 37 | alert('设置失败:' + res.data.message); 38 | } 39 | }).catch(function (error) { 40 | alert(error); 41 | }); 42 | }, 43 | sendApply: function (api) { 44 | if (this.domain === '') { 45 | alert('请选择后缀'); 46 | return; 47 | } 48 | if (/^[0-9a-z]{1,16}$/.test(this.applyName)) { 49 | ; 50 | } else { 51 | alert('只能包含字母、数字'); 52 | return; 53 | } 54 | var thisvue = this; 55 | this.loading = true; 56 | axios.get( 57 | api + '?name=' + thisvue.applyName + thisvue.domain 58 | ).then(function (res) { 59 | thisvue.domainApply = false; 60 | if (res.data.code == 0) { 61 | alert('申请成功,请等待1分钟左右解析生效'); 62 | thisvue.setting.public_address = thisvue.setting.public_address.replace(/\/\/([^:\/]+)/, '//' + thisvue.applyName + thisvue.domain); 63 | thisvue.update(null); 64 | } else if (res.data.code == 1) { 65 | alert('申请失败,此域已被占用'); 66 | } else { 67 | alert('申请失败,' + res.data.message); 68 | } 69 | thisvue.loading = false; 70 | }).catch(function (error) { 71 | thisvue.loading = false; 72 | alert(error); 73 | }); 74 | }, 75 | add_stage: function (area) { 76 | this.setting.boss[area].push(this.setting.boss[area][this.setting.boss[area].length - 1].slice()); 77 | const index = this.setting.stage_cycle[area].length - 1; 78 | if (index >= 0) { 79 | this.setting.stage_cycle[area].push(this.setting.stage_cycle[area][index] + 1); 80 | } else { 81 | this.setting.stage_cycle[area].push(2); 82 | } 83 | }, 84 | remove_stage: function (area) { 85 | if (this.setting.boss[area].length == 1) return; 86 | this.setting.boss[area].pop(); 87 | this.setting.stage_cycle[area].pop(); 88 | }, 89 | comfirm_change_clan_mode: function (event) { 90 | this.$alert('修改模式后,公会战数据会重置。请不要在公会战期间修改!', '警告', { 91 | confirmButtonText: '知道了', 92 | type: 'warning', 93 | }); 94 | }, 95 | }, 96 | delimiters: ['[[', ']]'], 97 | }) -------------------------------------------------------------------------------- /Origin/static/admin/users.js: -------------------------------------------------------------------------------- 1 | var vm = new Vue({ 2 | el: '#app', 3 | data: { 4 | isLoading: true, 5 | moreLoading: false, 6 | userData: [], 7 | querys: { 8 | page: 1, 9 | page_size: 50, 10 | qqid: null, 11 | clan_group_id: null, 12 | authority_group: null, 13 | }, 14 | query_input: { 15 | qqid: null, 16 | clan_group_id: null, 17 | authority_group: null, 18 | }, 19 | has_more: true, 20 | authtype: [{ 21 | value: 100, 22 | label: '成员', 23 | }, { 24 | value: 10, 25 | label: '公会战管理员', 26 | }, { 27 | value: 1, 28 | label: '主人', 29 | }], 30 | }, 31 | mounted() { 32 | this.load_more(); 33 | }, 34 | methods: { 35 | datestr: function (ts) { 36 | if (ts == 0) { 37 | return null; 38 | } 39 | var nd = new Date(); 40 | nd.setTime(ts * 1000); 41 | return nd.toLocaleString('chinese', { hour12: false, timeZone: 'asia/shanghai' }); 42 | }, 43 | search: function (event) { 44 | Object.assign(this.querys, this.query_input); 45 | this.querys.page = 1; 46 | this.isLoading = true; 47 | this.userData = []; 48 | this.load_more(); 49 | }, 50 | load_more: function (event) { 51 | this.moreLoading = true; 52 | var thisvue = this; 53 | axios.post(api_path, { 54 | action: 'get_data', 55 | querys: thisvue.querys, 56 | csrf_token: csrf_token, 57 | }).then(function (res) { 58 | if (res.data.code == 0) { 59 | thisvue.userData.push(...res.data.data); 60 | thisvue.isLoading = false; 61 | thisvue.moreLoading = false; 62 | if (res.data.data.length < thisvue.querys.page_size) { 63 | thisvue.has_more = false; 64 | } else { 65 | thisvue.querys.page += 1; 66 | } 67 | } else { 68 | thisvue.$alert(res.data.message, '加载数据错误'); 69 | } 70 | }).catch(function (error) { 71 | thisvue.$alert(error, '加载数据错误'); 72 | }); 73 | }, 74 | modify: function (scope) { 75 | var thisvue = this; 76 | axios.post(api_path, { 77 | action: 'modify_user', 78 | csrf_token: csrf_token, 79 | data: { 80 | qqid: scope.row.qqid, 81 | authority_group: scope.row.authority_group, 82 | }, 83 | }).then(function (res) { 84 | if (res.data.code == 0) { 85 | thisvue.$message({ 86 | message: '修改成功', 87 | type: 'success', 88 | }); 89 | } else { 90 | thisvue.$message.error('修改失败' + res.data.message); 91 | } 92 | }).catch(function (error) { 93 | thisvue.$message.error(error); 94 | }); 95 | }, 96 | delete_user: function (scope) { 97 | var thisvue = this; 98 | thisvue.$confirm('是否删除' + scope.row.nickname, '提示', { 99 | confirmButtonText: '确定', 100 | cancelButtonText: '取消', 101 | type: 'danger' 102 | }).then(() => { 103 | axios.post(api_path, { 104 | action: 'delete_user', 105 | csrf_token: csrf_token, 106 | data: { 107 | qqid: scope.row.qqid, 108 | }, 109 | }).then(function (res) { 110 | if (res.data.code == 0) { 111 | thisvue.$message({ 112 | message: '删除成功', 113 | type: 'success', 114 | }); 115 | } else { 116 | thisvue.$message.error('删除失败' + res.data.message); 117 | } 118 | }).catch(function (error) { 119 | thisvue.$message.error(error); 120 | }); 121 | }).catch(() => { 122 | thisvue.$message({ 123 | type: 'info', 124 | message: '已取消删除' 125 | }); 126 | }); 127 | 128 | 129 | 130 | 131 | }, 132 | }, 133 | delimiters: ['[[', ']]'], 134 | }) -------------------------------------------------------------------------------- /Origin/static/chara_marks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/Origin/static/chara_marks.png -------------------------------------------------------------------------------- /Origin/static/clan/setting.js: -------------------------------------------------------------------------------- 1 | if (!Object.defineProperty) { 2 | alert('浏览器版本过低'); 3 | } 4 | var vm = new Vue({ 5 | el: '#app', 6 | data: { 7 | activeIndex: null, 8 | groupData: {}, 9 | battle_id: null, 10 | data_slot_record_count: [], 11 | form: { 12 | game_server: null, 13 | privacy: { 14 | allow_guest: false, 15 | allow_statistics_api: false, 16 | }, 17 | notify: { 18 | challenge: false, 19 | undo: false, 20 | apply: false, 21 | cancelapply: false, 22 | subscribe: false, 23 | cancelsubscribe: false, 24 | suspend: false, 25 | cancelsuspend: false, 26 | modify: false, 27 | sl: false, 28 | }, 29 | }, 30 | switchVisible: false, 31 | confirmVisible: false, 32 | }, 33 | mounted() { 34 | var thisvue = this; 35 | axios.post('./api/', { 36 | action: 'get_setting', 37 | csrf_token: csrf_token, 38 | }).then(function (res) { 39 | if (res.data.code == 0) { 40 | thisvue.groupData = res.data.groupData; 41 | thisvue.battle_id = res.data.groupData.battle_id; 42 | thisvue.form.game_server = res.data.groupData.game_server; 43 | thisvue.form.privacy.allow_guest = Boolean(res.data.privacy & 0x1); 44 | thisvue.form.privacy.allow_statistics_api = Boolean(res.data.privacy & 0x2); 45 | document.title = res.data.groupData.group_name + ' - 公会战设置'; 46 | var notify_code = res.data.notification; 47 | for (key in thisvue.form.notify) { 48 | thisvue.form.notify[key] = Boolean(notify_code & 1); 49 | notify_code >>= 1; 50 | } 51 | } else { 52 | thisvue.$alert(res.data.message, '加载数据失败'); 53 | } 54 | }).catch(function (error) { 55 | thisvue.$alert(error, '加载数据失败'); 56 | }); 57 | }, 58 | methods: { 59 | submit: function (event) { 60 | var thisvue = this; 61 | var privacy = (thisvue.form.privacy.allow_guest * 0x1) + (thisvue.form.privacy.allow_statistics_api * 0x2); 62 | var notify_code = 0; 63 | var magnitude = 1; 64 | for (key in thisvue.form.notify) { 65 | notify_code += thisvue.form.notify[key] * magnitude; 66 | magnitude <<= 1; 67 | } 68 | axios.post('./api/', { 69 | action: 'put_setting', 70 | csrf_token: csrf_token, 71 | game_server: thisvue.form.game_server, 72 | privacy: privacy, 73 | notification: notify_code, 74 | }).then(function (res) { 75 | if (res.data.code == 0) { 76 | thisvue.$notify({ 77 | title: '通知', 78 | message: '设置成功', 79 | }); 80 | } else { 81 | thisvue.$alert(res.data.message, '保存设置失败'); 82 | } 83 | }).catch(function (error) { 84 | thisvue.$alert(error, '保存设置失败'); 85 | }); 86 | }, 87 | export_data: function (event) { 88 | window.location = '../statistics/api/'; 89 | }, 90 | call_api: function (payload) { 91 | var thisvue = this; 92 | payload.csrf_token = csrf_token; 93 | axios.post('./api/', payload).then(function (res) { 94 | if (res.data.code == 0) { 95 | thisvue.$notify({ 96 | title: '通知', 97 | message: '成功', 98 | }); 99 | } else { 100 | thisvue.$alert(res.data.message, '失败'); 101 | } 102 | }).catch(function (error) { 103 | thisvue.$alert(error, '失败'); 104 | }); 105 | }, 106 | clear_data_slot: function (event) { 107 | this.call_api({ 108 | action: 'clear_data_slot', 109 | }); 110 | this.confirmVisible = false; 111 | }, 112 | // new_data_slot: function (event) { 113 | // this.call_api({ 114 | // action: 'new_data_slot', 115 | // }); 116 | // }, 117 | switch_data_slot: function (event) { 118 | this.call_api({ 119 | action: 'switch_data_slot', 120 | battle_id: this.battle_id, 121 | }); 122 | this.switchVisible = false; 123 | }, 124 | get_data_slot_record_count: function () { 125 | if (this.data_slot_record_count.length !== 0) { 126 | return 127 | } 128 | var thisvue = this; 129 | axios.post('./api/', { 130 | action: 'get_data_slot_record_count', 131 | csrf_token: csrf_token, 132 | }).then(function (res) { 133 | if (res.data.code == 0) { 134 | thisvue.data_slot_record_count = res.data.counts; 135 | } else { 136 | thisvue.$alert(res.data.message, '失败'); 137 | } 138 | }).catch(function (error) { 139 | thisvue.$alert(error, '失败'); 140 | }); 141 | }, 142 | handleSelect(key, keyPath) { 143 | switch (key) { 144 | case '1': 145 | window.location = '../'; 146 | break; 147 | case '2': 148 | window.location = '../subscribers/'; 149 | break; 150 | case '3': 151 | window.location = '../progress/'; 152 | break; 153 | case '4': 154 | window.location = '../statistics/'; 155 | break; 156 | case '5': 157 | window.location = `../my/`; 158 | break; 159 | } 160 | }, 161 | }, 162 | delimiters: ['[[', ']]'], 163 | }) -------------------------------------------------------------------------------- /Origin/static/clan/statistics.js: -------------------------------------------------------------------------------- 1 | if (!Object.defineProperty) { 2 | alert('浏览器版本过低'); 3 | } 4 | var vm = new Vue({ 5 | el: '#app', 6 | data: { 7 | progressData: [], 8 | members: [], 9 | tailsData: [], 10 | tailsDataVisible: false, 11 | group_name: null, 12 | reportDate: null, 13 | activeIndex: '4', 14 | multipleSelection: [], 15 | sendRemindVisible: false, 16 | send_via_private: false, 17 | dropMemberVisible: false, 18 | today: 0, 19 | }, 20 | methods: { 21 | handleTitleSelect(key, keyPath) { 22 | switch (key) { 23 | case '1': 24 | window.location = '../'; 25 | break; 26 | case '2': 27 | window.location = '../subscribers/'; 28 | break; 29 | case '3': 30 | window.location = '../progress/'; 31 | break; 32 | case '4': 33 | window.location = '../statistics/'; 34 | break; 35 | case '5': 36 | window.location = `../my/`; 37 | break; 38 | } 39 | }, 40 | } 41 | }) 42 | 43 | -------------------------------------------------------------------------------- /Origin/static/clan/statistics/deviation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/Origin/static/clan/statistics/deviation.png -------------------------------------------------------------------------------- /Origin/static/clan/statistics/many.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/Origin/static/clan/statistics/many.png -------------------------------------------------------------------------------- /Origin/static/clan/statistics/order.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/Origin/static/clan/statistics/order.png -------------------------------------------------------------------------------- /Origin/static/clan/statistics/pie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/Origin/static/clan/statistics/pie.png -------------------------------------------------------------------------------- /Origin/static/clan/subscribers.js: -------------------------------------------------------------------------------- 1 | var vm = new Vue({ 2 | el: '#app', 3 | data: { 4 | bosstag: ['挂树', '预约1', '预约2', '预约3', '预约4', '预约5'], 5 | subscribers: [ 6 | [], [], [], [], [], [], 7 | ], 8 | members: [], 9 | group_name: null, 10 | activeIndex: '2', 11 | }, 12 | mounted() { 13 | var thisvue = this; 14 | axios.post('../api/', { 15 | action: 'get_subscribers', 16 | csrf_token: csrf_token, 17 | }).then(function (res) { 18 | if (res.data.code == 0) { 19 | for (sub of res.data.subscribers) { 20 | thisvue.subscribers[sub.boss].push(sub); 21 | } 22 | thisvue.group_name = res.data.group_name; 23 | document.title = res.data.group_name + ' - 公会战设置'; 24 | } else { 25 | thisvue.$alert(res.data.message, '获取数据失败'); 26 | } 27 | }).catch(function (error) { 28 | thisvue.$alert(error, '获取数据失败'); 29 | }); 30 | axios.post('../api/', { 31 | action: 'get_member_list', 32 | csrf_token: csrf_token, 33 | }).then(function (res) { 34 | if (res.data.code == 0) { 35 | thisvue.members = res.data.members; 36 | } else { 37 | thisvue.$alert(res.data.message, '获取成员失败'); 38 | } 39 | }).catch(function (error) { 40 | thisvue.$alert(error, '获取成员失败'); 41 | }); 42 | }, 43 | methods: { 44 | find_name: function (qqid) { 45 | for (m of this.members) { 46 | if (m.qqid == qqid) { 47 | return m.nickname; 48 | } 49 | }; 50 | return qqid; 51 | }, 52 | get_time_delta: function (time) { 53 | var dateBegin = new Date(time); 54 | var dateEnd = new Date(); 55 | var dateDiff = dateEnd.getTime() - dateBegin.getTime(); 56 | if (dateDiff >= 86400000) { 57 | return '24小时+' 58 | } 59 | var leave1 = dateDiff % (24 * 3600 * 1000); 60 | var hours = Math.floor(leave1 / (3600 * 1000)); 61 | var leave2 = leave1 % (3600 * 1000); 62 | var minutes = Math.floor(leave2 / (60 * 1000)); 63 | return (hours + "小时" + minutes + "分钟"); 64 | }, 65 | handleSelect(key, keyPath) { 66 | switch (key) { 67 | case '1': 68 | window.location = '../'; 69 | break; 70 | case '2': 71 | window.location = '../subscribers/'; 72 | break; 73 | case '3': 74 | window.location = '../progress/'; 75 | break; 76 | case '4': 77 | window.location = '../statistics/'; 78 | break; 79 | case '5': 80 | window.location = `../my/`; 81 | break; 82 | } 83 | }, 84 | }, 85 | delimiters: ['[[', ']]'], 86 | }) -------------------------------------------------------------------------------- /Origin/static/clan/user.js: -------------------------------------------------------------------------------- 1 | var gs_offset = { jp: 4, tw: 5, kr: 4, cn: 5 }; 2 | function pad2(num) { 3 | return String(num).padStart(2, '0'); 4 | } 5 | function ts2ds(timestamp) { 6 | var d = new Date(); 7 | d.setTime(timestamp * 1000); 8 | return d.getFullYear() + '/' + pad2(d.getMonth() + 1) + '/' + pad2(d.getDate()); 9 | } 10 | var vm = new Vue({ 11 | el: '#app', 12 | data: { 13 | isLoading: true, 14 | challengeData: [], 15 | activeIndex: '5', 16 | qqid: 0, 17 | nickname: '', 18 | }, 19 | mounted() { 20 | var thisvue = this; 21 | var pathname = window.location.pathname.split('/'); 22 | thisvue.qqid = parseInt(pathname[pathname.length - 2]); 23 | axios.post('../api/', { 24 | action: 'get_user_challenge', 25 | csrf_token: csrf_token, 26 | qqid: thisvue.qqid, 27 | }).then(function (res) { 28 | if (res.data.code != 0) { 29 | thisvue.$alert(res.data.message, '获取记录失败'); 30 | return; 31 | } 32 | thisvue.nickname = res.data.user_info.nickname; 33 | thisvue.refresh(res.data.challenges, res.data.game_server); 34 | thisvue.isLoading = false; 35 | }).catch(function (error) { 36 | thisvue.$alert(error, '获取数据失败'); 37 | }); 38 | }, 39 | methods: { 40 | csummary: function (cha) { 41 | if (cha == undefined) { 42 | return ''; 43 | } 44 | return `(${cha.cycle}-${cha.boss_num}) ${cha.damage}`; 45 | }, 46 | cdetail: function (cha) { 47 | if (cha == undefined) { 48 | return ''; 49 | } 50 | var nd = new Date(); 51 | nd.setTime(cha.challenge_time * 1000); 52 | var detailstr = nd.toLocaleString('chinese', { hour12: false, timeZone: 'asia/shanghai' }) + '\n'; 53 | detailstr += cha.cycle + '周目' + cha.boss_num + '号boss\n'; 54 | detailstr += (cha.health_ramain + cha.damage).toLocaleString(options = { timeZone: 'asia/shanghai' }) + '→' + cha.health_ramain.toLocaleString(options = { timeZone: 'asia/shanghai' }); 55 | if (cha.message) { 56 | detailstr += '\n留言:' + cha.message; 57 | } 58 | return detailstr; 59 | }, 60 | arraySpanMethod: function ({ row, column, rowIndex, columnIndex }) { 61 | if (columnIndex >= 2) { 62 | if (columnIndex % 2 == 0) { 63 | var detail = row.detail[columnIndex - 2]; 64 | if (detail != undefined && detail.health_ramain != 0) { 65 | return [1, 2]; 66 | } 67 | } else { 68 | var detail = row.detail[columnIndex - 3]; 69 | if (detail != undefined && detail.health_ramain != 0) { 70 | return [0, 0]; 71 | } 72 | } 73 | } 74 | }, 75 | refresh: function (challenges, game_server) { 76 | var thisvue = this; 77 | var m = { pcrdate: -1 }; 78 | for (c of challenges) { 79 | var pcrdate = ts2ds(c.challenge_time - (gs_offset[game_server] * 3600)); 80 | if (m.pcrdate != pcrdate) { 81 | if (m.pcrdate != -1) { 82 | thisvue.challengeData.push(m); 83 | } 84 | m = { 85 | pcrdate: pcrdate, 86 | finished: 0, 87 | detail: [], 88 | } 89 | } 90 | m.detail[2 * m.finished] = c; 91 | if (c.is_continue) { 92 | m.finished += 0.5; 93 | } else { 94 | if (c.health_ramain != 0) { 95 | m.finished += 1; 96 | } else { 97 | m.finished += 0.5; 98 | } 99 | } 100 | } 101 | if (m.pcrdate != -1) { 102 | thisvue.challengeData.push(m); 103 | } 104 | }, 105 | viewInExcel: function () { 106 | var icons = document.getElementsByTagName('span'); 107 | while (icons[0]) { 108 | icons[0].remove(); 109 | } 110 | var uri = 'data:application/vnd.ms-excel;base64,'; 111 | var ctx = '' + document.getElementsByTagName('thead')[0].innerHTML + document.getElementsByTagName('tbody')[0].innerHTML + '
'; 112 | window.location.href = uri + window.btoa(unescape(encodeURIComponent(ctx))); 113 | document.documentElement.innerHTML = '请在Excel中查看(如果无法打开,请安装最新版本Excel)\n或者将整个表格复制,粘贴到Excel中使用'; 114 | }, 115 | handleTitleSelect(key, keyPath) { 116 | switch (key) { 117 | case '1': 118 | window.location = '../'; 119 | break; 120 | case '2': 121 | window.location = '../subscribers/'; 122 | break; 123 | case '3': 124 | window.location = '../progress/'; 125 | break; 126 | case '4': 127 | window.location = '../statistics/'; 128 | break; 129 | case '5': 130 | window.location = `../my/`; 131 | break; 132 | } 133 | }, 134 | }, 135 | delimiters: ['[[', ']]'], 136 | }) -------------------------------------------------------------------------------- /Origin/static/gacha.js: -------------------------------------------------------------------------------- 1 | var pool = [ 2 | [1071, 1061, 1070, 1804, 1012, 1043, 1057, 1028, 1029, 1011, 1030, 1018, 1032, 1053, 1049, 1009, 1047, 1010, 1063, 1036, 1044, 1037, 1056, 1014, 1092, 1094, 1095, 1096, 1107, 1108, 1113, 1114, 1065, 1117, 1122, 1109, 1110, 1075, 1077, 1078, 1079, 1081, 1083, 1084, 1086, 1087, 1088, 1091, 1097, 1099, 1100, 1103, 1104, 1106, 1111, 1115, 1119, 1120, 1124, 1125, 1127, 1128], 3 | [1045, 1048, 1008, 1006, 1046, 1020, 1033, 1031, 1017, 1042, 1051, 1027, 1007, 1038, 1016, 1026, 1023, 1015, 1054, 1005, 1013], 4 | [1003, 1034, 1040, 1022, 1004, 1052, 1025, 1050, 1001, 1021, 1055], 5 | ]; 6 | var experience = { 7 | "star3": 0, 8 | "star2": 0, 9 | "star1": 0, 10 | "diamond": 0, 11 | }; 12 | var progress = false; 13 | (function () { 14 | var h = localStorage['gacha_experience']; 15 | if (h) { 16 | [experience.star3, experience.star2, experience.star1, experience.diamond] = h.split(',').map(x => +x); 17 | } 18 | })(); 19 | function randarr(arr) { 20 | return String(arr[Math.floor(Math.random() * arr.length)]); 21 | } 22 | function pick(i) { 23 | var x = Math.random(); 24 | if (x < 0.025) { 25 | experience.star3 += 1; 26 | return randarr(pool[0]) + '31'; 27 | } else if (x < 0.205) { 28 | experience.star2 += 1; 29 | return randarr(pool[1]) + '11'; 30 | } else if (i == 9) { 31 | experience.star2 += 1; 32 | return randarr(pool[1]) + '11'; 33 | } 34 | experience.star1 += 1; 35 | return randarr(pool[2]) + '11'; 36 | } 37 | function sleep(time) { 38 | return new Promise((resolve) => setTimeout(resolve, time)); 39 | } 40 | async function reload() { 41 | var container = document.getElementById('container'); 42 | container.innerHTML = ''; 43 | for (i of Array(10).keys()) { 44 | await sleep(200); 45 | let chara = String(pick(i)); 46 | let result = document.createElement('img'); 47 | result.src = sourcebase + chara + '.jpg'; 48 | container.appendChild(result); 49 | if (i === 4) { 50 | container.appendChild(document.createElement('br')); 51 | } 52 | } 53 | experience.diamond += 1500; 54 | } 55 | async function gacha() { 56 | if (progress) { 57 | return; 58 | } 59 | progress = true; 60 | await reload(); 61 | document.getElementById('result').innerHTML = `★3: ${experience.star3}
★2: ${experience.star2}
★1: ${experience.star1}
总耗钻: ${experience.diamond}`; 62 | localStorage['gacha_experience'] = [experience.star3, experience.star2, experience.star1, experience.diamond].join(','); 63 | progress = false; 64 | } -------------------------------------------------------------------------------- /Origin/static/gongan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/Origin/static/gongan.png -------------------------------------------------------------------------------- /Origin/static/marionette.js: -------------------------------------------------------------------------------- 1 | var vm = new Vue({ 2 | el: '#sending', 3 | data: { 4 | message_type: 'group', 5 | user_id: 0, 6 | group_id: 0, 7 | message: '', 8 | }, 9 | mounted() { 10 | if (localStorage.message_type) { 11 | this.message_type = localStorage.message_type; 12 | this.user_id = localStorage.user_id; 13 | this.group_id = localStorage.group_id; 14 | this.message = localStorage.message; 15 | } 16 | }, 17 | watch: { 18 | message_type: function (newmessage_type) { 19 | localStorage.message_type = newmessage_type; 20 | }, 21 | user_id: function (newuser_id) { 22 | localStorage.user_id = newuser_id; 23 | }, 24 | group_id: function (newgroup_id) { 25 | localStorage.group_id = newgroup_id; 26 | }, 27 | message: function (newmessage) { 28 | localStorage.message = newmessage; 29 | }, 30 | }, 31 | methods: { 32 | send_msg: function (event) { 33 | axios.post( 34 | api_path, 35 | this.$data, 36 | ).then(function (res) { 37 | if (res.data.code == 0) { 38 | alert('已发送'); 39 | } else { 40 | alert('发送失败:' + res.data.message); 41 | } 42 | }).catch(function (error) { 43 | alert(error); 44 | }); 45 | }, 46 | }, 47 | delimiters: ['[[', ']]'], 48 | }) -------------------------------------------------------------------------------- /Origin/static/small.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/Origin/static/small.ico -------------------------------------------------------------------------------- /Origin/template/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 404 6 | 7 | 8 | 9 |

404: not found

10 |

这个{{ item }}不存在

11 |

返回

12 | 13 | 14 | -------------------------------------------------------------------------------- /Origin/template/about.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 关于 5 | 6 | 7 | 8 | 9 |

10 | 返回 11 |

12 |
13 |

14 | 关于yobot 15 |

16 |

17 | 版本:
18 | {{ verinfo | replace("\n", "
") }} 19 |

20 |

21 | 主页:
22 | https://yobot.win/ 23 |

24 |

25 | 源码:
26 | yobot 27 |

28 |

29 | 联系邮箱:
30 | yobot@pcrbot.com 31 |

32 |

33 | 交流群:770947581 34 |

35 |

36 | 其他 37 |

38 |

39 | 本项目没有开启赞助、打赏的渠道,所有付款行为与本项目无关。
40 | 如果你付费获取了本工具,可能是第三方收取的服务器费用和托管费用。 41 |

42 |
43 |
44 |

45 | 关于YoCool 46 |

47 |

48 | :版本
49 | YoCool-Final-Origin 50 |

51 |

52 | :源码
53 | YoCool 55 |

56 |

57 | :更新日志
点我查看 58 |

59 |

60 | :了解更多
YoCool WIKI 61 |

62 |

63 | 赞助名单(排名不分先后) 64 |

65 |

66 | @var-mixer 67 |

68 |
69 | 70 | -------------------------------------------------------------------------------- /Origin/template/admin/groups.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | yobot公会管理 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 28 | 29 | 30 |
31 | 32 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Origin/template/admin/pool-setting.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 自定义奖池 6 | 7 | 8 | 9 | 10 | 11 | 12 |

返回

13 |

所有概率都是相对值,即:抽取率 = 当前奖池概率 ÷ 所有奖池总概率

14 |
15 |
16 |

奖池:[[pname]]

17 |
18 | 名称:
19 | 前缀:
20 | 单抽概率:
21 | 保底抽概率:
22 | 内容:
23 | 24 | 25 |
26 |

27 | 28 |


29 |
30 | 每次抽卡数:
31 | 每日抽卡次数:
32 | 保底抽位置不固定 33 |
34 | 35 |
36 | 37 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /Origin/template/admin/users.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | yobot用户管理 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 | 17 | 18 |
19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 搜索 38 | 39 | 40 | 41 | 42 | 45 | 46 | 47 | 48 | 49 | 50 | 55 | 56 | 57 | 60 | 61 | 62 | 63 | 66 | 67 | 68 | 加载更多 69 | 已加载全部 70 | 71 |
72 | 73 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /Origin/template/clan/setting.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 公会战设置 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 面板 19 | 预约 20 | 查刀 21 | 统计 22 | 我的 23 | 24 |

设置

25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 出刀表无需登录 36 | 允许api获取数据 37 | 38 | 39 | 伤害上报 40 | 撤销上报 41 | 申请出刀 42 | 取消申请 43 | 预约boss 44 | 取消预约 45 | 挂树 46 | 取消挂树 47 | 修改状态 48 | 使用SL 49 | 50 | 51 | 确定 52 | 返回 53 | 54 | 55 | 现在档案编号:[[ battle_id ]]
56 | 导出数据 57 | {#- 新建档案 -#} 58 | 切换档案 59 | 60 | 61 |
    62 |
  • 63 | [[ item.battle_id ]]号存档:[[ item.record_count ]]条记录 64 |
  • 65 |
66 | 67 | 68 | 69 | 70 | 71 | 72 | 取消 73 | 切换 74 | 75 |
76 | 删除数据 77 | 78 |

此操作会删除 [[ battle_id ]] 号存档中所有数据

79 | 80 | 取消 81 | 确定 82 | 83 |
84 |
85 |
86 |
87 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /Origin/template/clan/statistics.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 公会战 - 数据分析 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 33 | 34 | 35 | 36 |
37 | 38 | 39 | 面板 40 | 预约 41 | 查刀 42 | 统计 43 | 我的 44 | 45 |

选择查看方式


46 | 47 |

出刀顺序
49 |

数据图表
51 | 52 |

均值偏差
53 |
54 | 55 |

多维分析
57 |
58 |
59 |

原始数据

60 | 62 | 64 | 66 | 68 |


69 |
70 | {% if allow_api -%} 71 | 72 | 73 | {% else -%} 74 | api访问已禁用,如需开启请前往 75 | 公会设置 76 | 77 | {% endif -%} 78 |
79 |
80 | 88 |

89 | 90 |

91 | 92 | 93 | 94 | 106 | 107 | 108 | 127 | -------------------------------------------------------------------------------- /Origin/template/clan/statistics/statistics1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 总统计 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 20 | 21 | 22 | 23 | 24 | 26 | 27 | 28 | 31 | 32 | 33 |
34 | 35 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /Origin/template/clan/subscribers.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 公会战预约 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 面板 24 | 预约 25 | 查刀 26 | 统计 27 | 我的 28 | 29 |

预约名单

30 | 31 | 32 | 33 | [[ bosstag[bn-1] ]] 34 | 35 |

36 | [[ find_name(m.qqid) ]]([[ m.qqid ]]) 37 | 40 | 43 |

44 |

45 | 没有记录 46 |

47 |
48 |
49 |
50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /Origin/template/clan/unauthorized.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 权限不足 6 | 7 | 8 | 9 |

权限不足

10 |

这个公会的信息是私密的,只有其成员可以查看

11 |

返回

12 | 13 | 14 | -------------------------------------------------------------------------------- /Origin/template/clan/user.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 出刀记录 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | 面板 33 | 预约 34 | 查刀 35 | 统计 36 | 我的 37 | 38 |

[[ nickname ]]的出刀记录

39 | 87 | 90 |
91 | 在Excel中查看 92 | 查看用户:[[ nickname ]]
93 |
94 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /Origin/template/homepage.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | YoCool Link Start 6 | 7 | 8 | 9 | 10 | 11 | 12 | 36 | 37 | 38 | 39 |
40 |
41 |

Hi!YoCool!

42 |
43 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |

56 |

—yobot is running—

57 |
58 | 59 | 登录 60 | 61 |
62 | 63 | 关于 64 | 65 |
66 | 68 | {% if show_icp -%} 69 | {{ icp_info }} 70 |   71 | {% if gongan_info -%} 72 | 74 | 75 | {{ gongan_info }} 76 | 77 |   78 | {% endif -%} 79 | {% endif -%} 80 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /Origin/template/login-code.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | yobot登录 5 | 6 | 7 | 8 |

正在登录中……

9 | 17 | 18 | -------------------------------------------------------------------------------- /Origin/template/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 会战系统登录 7 | 8 | 9 | 10 | 11 | 12 | 13 | 36 | 37 | 38 | 39 |
40 |
41 |

会战系统登录

42 |
43 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
56 |
57 |
58 | {% if reason -%} 59 | 60 | 61 | {% endif -%} 62 |
63 | 64 | 65 | 66 | 67 | 68 | 69 | 71 | 72 | 73 | 登录 74 | 75 | 76 |
77 |
78 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /Origin/template/manual.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 使用手册 5 | 6 | 7 | 8 | 27 | 28 | 29 | 30 |

公会战功能使用手册

31 | 32 |

使用 Bot 管理公会战,需要所有成员遵守使用规则
Bot 只是辅助作用,与成员多沟通才能提高分数

33 | 34 |

具体指令请以查看帮助页面

35 | 36 |

开始前

37 | 38 |
    39 |
  1. 机器人管理员进入后台设置,确认设置中的 boss 生命值符合当期公会战
  2. 40 |
  3. 在群聊中发送创建日服公会(日、韩、台、国)
  4. 41 |
  5. 所有公会战成员在群聊中发送加入公会,或者由群管理员发送加入全部成员
  6. 42 |
  7. 成员向 bot 私聊发送登录重置密码,进入后台确认,同时修改登录密码
  8. 43 |
  9. 成员进入公会战面板,并将网页地址保存到桌面快捷方式(手机、电脑均可),以便使用网页报刀和查看数据
  10. 44 |
  11. 管理员在公会设置中,新建一个空白档案用来存放公会战数据
  12. 45 |
46 | 47 |

进行中:成员

48 | 49 | 58 | 59 |

进行中:管理员

60 | 61 | 66 | 67 |

特殊情况

68 | 69 | 75 | 76 |

查看数据

77 | 78 |

公会战面板“查刀”页面中能查看记录的所有数据,并进行快速的筛选、过滤。如果需要原始数据,可以从“统计”页面导出。

79 | 80 | 81 | -------------------------------------------------------------------------------- /Origin/template/marionette.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | yobot 6 | 7 | 8 | 9 | 10 | 11 |
12 |

Marionette

13 | 发送类型: 14 | 18 |
19 | QQ号: 20 |
21 |
22 | 群号: 23 |
24 | 消息: 25 | 26 |
27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Origin/template/password.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 修改密码 6 | 7 | 8 | 9 | 10 | 11 | 12 | 55 | 56 | 57 | 58 |
59 | 60 |
61 | {% if error -%} 62 | 65 | 66 | {% endif -%} 67 | {% if success -%} 68 | 71 | 72 | {% endif -%} 73 | 74 | 75 |
76 |

修改密码

77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 修改 86 | 87 | 88 |
89 |
90 | 91 | 156 | 157 | 158 | -------------------------------------------------------------------------------- /Origin/template/unauthorized.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 权限不足 6 | 7 | 8 | 9 |

权限不足

10 |

浏览这个页面需要权限:{{ limit }}

11 |

你的权限:{{ uath }}

12 |

13 | 返回 14 | 15 | 16 | -------------------------------------------------------------------------------- /Origin/template/user-info.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 用户信息 6 | 7 | 8 | 9 | 10 | 32 | 33 | 34 | 35 | 36 |
37 | 38 | 69 | 74 |
75 | 76 | 154 | 155 | -------------------------------------------------------------------------------- /Origin/template/user.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 公主连结公会战面板 6 | 7 | 8 | 9 | 10 | 11 | 12 | 54 | 55 | 56 | 57 |
58 | 59 |
60 |

会战管理面板

61 |
62 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 |

75 |
76 | 77 |

欢迎,{{ user.nickname }}

78 | {% if user.authority_group < 10 -%} 79 | 80 | 81 | 设置项 82 | 83 | 84 | 用户管理 85 | 86 | 87 | 群管理 88 | 89 | 90 | {%- endif %} 91 | 92 | {% if not clan_groups -%} 93 | 94 |
你还没有加入公会
请在你的公会群内发送“加入公会”来加入一个公会
95 | 无公会 96 |
97 | {%- else -%} 98 | {% for group in clan_groups -%} 99 | 100 | 公会:{{ group['group_name'] }} 101 | 102 |
103 | {% endfor -%} 104 | {%- endif %} 105 |
106 |
107 | 108 | 139 | 140 | -------------------------------------------------------------------------------- /PrincessAdventure/README.md: -------------------------------------------------------------------------------- 1 | ![PrincessAdventurebanner.png](https://i.loli.net/2020/07/25/mlL9FqC5tWZcT3Y.png) 2 | ## 与公主们展开一场冒险故事吧! 3 | > 小巧、轻盈、快速的yocool主题!即使是小水管也可轻松使用! 4 | 5 | ### 主题特色 6 | * 轻量资源,快速加载访问 7 | * 随机三色,橙黑绿御三家 8 | * 动态Q版小人,可爱的管理面板 9 | * 微调按钮布局,实用美观两全法 10 | * 移动端适配优化,手机使用如此简单 11 | 12 | ### 安装使用 13 | > 安装前请先备份``yobot\src\client\public``文件夹中的全部文件,以防出现意外问题 14 | 1. 复制主题包中的**template**和**static**文件夹 15 | 2. 进入到``yobot\src\client\public``目录下 16 | 3. 将文件夹直接粘贴覆盖 17 | > 无需重启,初次安装或更新版本时,PC端需要``Ctrl+F5``强制刷新缓存,移动端需要清除浏览器缓存 18 | 19 | ### 特别注意 20 | 面板页面中的“设置”与“修改状态”按钮进行了变更
21 | 点击**动画小人**即可**打开设置**
22 | 点击**进度条、boss血量数字或者boss血量百分比**,即可**修改boss状态** 23 | 24 | ### 了解更多 25 | 前往[YoCoolWiki](https://github.com/A-kirami/YoCool/wiki)了解更多信息 26 | -------------------------------------------------------------------------------- /PrincessAdventure/libs/canvas-nest.js@1.0.1/dist/canvas-nest.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2016 hustcc 3 | * License: MIT 4 | * Version: v1.0.1 5 | * GitHub: https://github.com/hustcc/canvas-nest.js 6 | **/ 7 | !function(){function n(n,e,t){return n.getAttribute(e)||t}function e(n){return document.getElementsByTagName(n)}function t(){var t=e("script"),o=t.length,i=t[o-1];return{l:o,z:n(i,"zIndex",-1),o:n(i,"opacity",.5),c:n(i,"color","0,0,0"),n:n(i,"count",99)}}function o(){a=m.width=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,c=m.height=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}function i(){r.clearRect(0,0,a,c);var n,e,t,o,m,l;s.forEach(function(i,x){for(i.x+=i.xa,i.y+=i.ya,i.xa*=i.x>a||i.x<0?-1:1,i.ya*=i.y>c||i.y<0?-1:1,r.fillRect(i.x-.5,i.y-.5,1,1),e=x+1;e=n.max/2&&(i.x-=.03*o,i.y-=.03*m),t=(n.max-l)/n.max,r.beginPath(),r.lineWidth=t/2,r.strokeStyle="rgba("+d.c+","+(t+.2)+")",r.moveTo(i.x,i.y),r.lineTo(n.x,n.y),r.stroke()))}),x(i)}var a,c,u,m=document.createElement("canvas"),d=t(),l="c_n"+d.l,r=m.getContext("2d"),x=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(n){window.setTimeout(n,1e3/45)},w=Math.random,y={x:null,y:null,max:2e4};m.id=l,m.style.cssText="position:fixed;top:0;left:0;z-index:"+d.z+";opacity:"+d.o,e("body")[0].appendChild(m),o(),window.onresize=o,window.onmousemove=function(n){n=n||window.event,y.x=n.clientX,y.y=n.clientY},window.onmouseout=function(){y.x=null,y.y=null};for(var s=[],f=0;d.n>f;f++){var h=w()*a,g=w()*c,v=2*w()-1,p=2*w()-1;s.push({x:h,y:g,xa:v,ya:p,max:6e3})}u=s.concat([y]),setTimeout(function(){i()},100)}(); -------------------------------------------------------------------------------- /PrincessAdventure/libs/element-ui@2.13.0/lib/theme-chalk/fonts/element-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/element-ui@2.13.0/lib/theme-chalk/fonts/element-icons.ttf -------------------------------------------------------------------------------- /PrincessAdventure/libs/element-ui@2.13.0/lib/theme-chalk/fonts/element-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/element-ui@2.13.0/lib/theme-chalk/fonts/element-icons.woff -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/banner.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/box-gift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/box-gift.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/clanbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/clanbg.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/error.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/flag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/flag.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/icon-loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/icon-loading.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/jquery.sliderBar.js: -------------------------------------------------------------------------------- 1 | /*************************************************************************************** 2 | 侧边栏插件 3 | @autor iProg 4 | @date 2016-01-25 5 | @version 1.0 6 | 7 | 使用方法: 8 | 在页面建立html标签如下: 9 |
10 |
通知消息
11 |
12 | 无消息 13 |
14 |
15 | 16 | 说明:上面的class属性值,除了sliderbar-container1可以随意更改,其它的如title,body都 17 | 不能更改哦! 18 | 19 | 然后加入js代码如下,就可以了: 20 | 32 | ****************************************************************************************/ 33 | ;(function ($) { 34 | $.fn.extend({ 35 | "sliderBar": function (options) { 36 | // 使用jQuery.extend 覆盖插件默认参数 37 | var opts = $.extend( 38 | {} , 39 | $.fn.sliderBar.defalutPublic , 40 | options 41 | ); 42 | 43 | // 这里的this 就是 jQuery对象,遍历页面元素对象 44 | // 加个return可以链式调用 45 | return this.each(function () { 46 | //获取当前元素 的this对象 47 | var $this = $(this); 48 | 49 | $this.data('open', opts.open); 50 | 51 | privateMethods.initSliderBarCss($this, opts); 52 | 53 | switch(opts.position){ 54 | case 'right' : privateMethods.showAtRight($this, opts); break; 55 | case 'left' : privateMethods.showAtLeft($this, opts); break; 56 | } 57 | 58 | }); 59 | } 60 | }); 61 | 62 | // 默认公有参数 63 | $.fn.sliderBar.defalutPublic = { 64 | open : true, // 默认是否打开,true打开,false关闭 65 | top : 200, // 距离顶部多高 66 | width : 260, // body内容宽度 67 | height : 200, // body内容高度 68 | position : 'left' // 显示位置,有left和right两种 69 | } 70 | 71 | var privateMethods = { 72 | initSliderBarCss : function(obj, opts){ 73 | obj.css({ 74 | 'width': opts.width+20+'px', 75 | 'height' : opts.height+20+'px', 76 | 'top' : opts.top+'px', 77 | 'position':'fixed', 78 | 'font-family':'Microsoft Yahei', 79 | 'z-index': '9999' 80 | }).find('.body').css({ 81 | 'width': opts.width+'px', 82 | 'height' : opts.height+'px', 83 | 'position':'relative', 84 | 'padding':'15px', 85 | 'overflow-x':'hidden', 86 | 'overflow-y':'auto', 87 | 'font-family':'Microsoft Yahei', 88 | 'font-size' : '15px' 89 | }); 90 | 91 | var titleCss = { 92 | 'width':'15px', 93 | 'height':'105px', 94 | 'position':'absolute', 95 | 'top':'-1px', 96 | 'display':'block', 97 | 'font-size': '13px', 98 | 'padding':'8px 4px 8px 5px', 99 | 'color':'#fff', 100 | 'cursor': 'pointer', 101 | 'font-family':'Microsoft Yahei' 102 | } 103 | 104 | obj.find('.title').css(titleCss).find('i').css({ 105 | 'font-size': '15px' 106 | }); 107 | } 108 | }; 109 | })(jQuery) 110 | -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/karin_q.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/karin_q.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/karyl_q.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/karyl_q.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/kokkoro_q.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/kokkoro_q.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/logo.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/pecorine_q.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/pecorine_q.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/scheme-01.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --primary-color-1: #ffa84e;/* 主色调1 */ 3 | --primary-color-2: #ffd34e;/* 主色调2 */ 4 | --secondary-color-1: #ffba54;/* 副色调1 */ 5 | --secondary-color-2: #FF9800;/* 副色调2 */ 6 | --background-color: #fbebd3;/* 背景颜色 */ 7 | --font-color: #FF9800;/* 文字颜色 */ 8 | } 9 | 10 | /* CharacterspriteAnime */ 11 | 12 | .character-container { 13 | width: 200px; 14 | height: 200px; 15 | overflow: hidden; 16 | background: url("/yobot-depencency/yocool@final/princessadventure/sprite01.png"); 17 | background-size: 100%; 18 | } 19 | 20 | .character-container.char { 21 | animation: spriteAnimechar 700ms steps(18) infinite; 22 | } 23 | 24 | @keyframes spriteAnimechar { 25 | 0% { 26 | background-position: 0 0; 27 | } 28 | 29 | 100% { 30 | background-position: 0 -3600px; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/scheme-02.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --primary-color-1: #3f51b5;/* 主色调1 */ 3 | --primary-color-2: #626ead;/* 主色调2 */ 4 | --secondary-color-1: #344080;/* 副色调1 */ 5 | --secondary-color-2: #3a177b;/* 副色调2 */ 6 | --background-color: #e8ebff;/* 背景色 */ 7 | --font-color: #032584;/* 文字颜色 */ 8 | } 9 | 10 | /* CharacterspriteAnime */ 11 | 12 | .character-container { 13 | width: 200px; 14 | height: 200px; 15 | overflow: hidden; 16 | background: url("/yobot-depencency/yocool@final/princessadventure/sprite02.png"); 17 | background-size: 100%; 18 | } 19 | 20 | .character-container.char { 21 | animation: spriteAnimechar 700ms steps(19) infinite; 22 | } 23 | 24 | @keyframes spriteAnimechar { 25 | 0% { 26 | background-position: 0 0; 27 | } 28 | 29 | 100% { 30 | background-position: 0 -3800px; 31 | } 32 | } -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/scheme-03.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --primary-color-1: #56c596;/* 主色调1 */ 3 | --primary-color-2: #73c088;/* 主色调2 */ 4 | --secondary-color-1: #397d54;/* 副色调1 */ 5 | --secondary-color-2: #4dd252;/* 副色调2 */ 6 | --background-color: #d5ffd0;/* 背景色 */ 7 | --font-color: #117c6f;/* 文字颜色 */ 8 | } 9 | 10 | /* CharacterspriteAnime */ 11 | 12 | .character-container { 13 | width: 200px; 14 | height: 200px; 15 | overflow: hidden; 16 | background: url("/yobot-depencency/yocool@final/princessadventure/sprite03.png"); 17 | background-size: 100%; 18 | } 19 | 20 | .character-container.char { 21 | animation: spriteAnimechar 700ms steps(19) infinite; 22 | } 23 | 24 | @keyframes spriteAnimechar { 25 | 0% { 26 | background-position: 0 0; 27 | } 28 | 29 | 100% { 30 | background-position: 0 -3800px; 31 | } 32 | } -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/sprite01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/sprite01.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/sprite02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/sprite02.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/sprite03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/sprite03.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/text-loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/text-loading.png -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/yocool.js: -------------------------------------------------------------------------------- 1 | var link = []; 2 | link[0] = "/yobot-depencency/yocool@final/princessadventure/scheme-01.css"; 3 | link[1] = "/yobot-depencency/yocool@final/princessadventure/scheme-02.css"; 4 | link[2] = "/yobot-depencency/yocool@final/princessadventure/scheme-03.css"; 5 | $(function() { 6 | var style = link[Math.floor(Math.random() * link.length)]; 7 | if (document.createStyleSheet) { 8 | document.createStyleSheet(style) 9 | } else { 10 | $('', { 11 | rel: 'stylesheet', 12 | href: style 13 | }).appendTo('head') 14 | } 15 | }); 16 | document.writeln("
Powered by Yobot    |    Themes by YoCool
"); 17 | $(function() { 18 | $(window).scroll(function() { 19 | var topToolbar = $("#topToolbar"); 20 | var headerH = $("#header").outerHeight(); 21 | var scrollTop = $(document).scrollTop() 22 | }) 23 | }); 24 | ;(function ($) { 25 | $.fn.extend({ 26 | "sliderBar": function (options) { 27 | var opts = $.extend( 28 | {} , 29 | $.fn.sliderBar.defalutPublic , 30 | options 31 | ); 32 | return this.each(function () { 33 | var $this = $(this); 34 | 35 | $this.data('open', opts.open); 36 | 37 | privateMethods.initSliderBarCss($this, opts); 38 | 39 | switch(opts.position){ 40 | case 'right' : privateMethods.showAtRight($this, opts); break; 41 | case 'left' : privateMethods.showAtLeft($this, opts); break; 42 | } 43 | 44 | }); 45 | } 46 | }); 47 | 48 | $.fn.sliderBar.defalutPublic = { 49 | open : false, 50 | top : 200, 51 | width : 260, 52 | height : 200, 53 | position : 'left' 54 | } 55 | 56 | var privateMethods = { 57 | initSliderBarCss : function(obj, opts){ 58 | obj.css({ 59 | 'width': opts.width+20+'px', 60 | 'height' : opts.height+20+'px', 61 | 'top' : opts.top+'px', 62 | 'position':'fixed', 63 | 'font-family':'Microsoft Yahei', 64 | 'z-index': '9999' 65 | }).find('.body').css({ 66 | 'width': opts.width+'px', 67 | 'height' : opts.height+'px', 68 | 'position':'relative', 69 | 'padding':'10px', 70 | 'overflow-x':'hidden', 71 | 'overflow-y':'auto', 72 | 'font-family':'Microsoft Yahei', 73 | 'font-size' : '14px' 74 | }); 75 | 76 | var titleCss = { 77 | 'width':'15px', 78 | 'position':'absolute', 79 | 'top':'-1px', 80 | 'display':'block', 81 | 'font-size': '13px', 82 | 'padding':'8px 4px 8px 5px', 83 | 'color':'#fff', 84 | 'cursor': 'pointer', 85 | 'font-family':'Microsoft Yahei' 86 | } 87 | 88 | obj.find('.title').css(titleCss).find('i').css({ 89 | 'font-size': '15px' 90 | }); 91 | }, 92 | showAtLeft : function(obj, opts){ 93 | if(opts.open){ 94 | obj.css({left:'0px'}); 95 | obj.find('.title').css('right','-25px').find('i').attr('class','fa fa-chevron-circle-left'); 96 | }else{ 97 | obj.css({left:-opts.width-22+'px'}); 98 | obj.find('.title').css('right','-25px').find('i').attr('class','fa fa-chevron-circle-right'); 99 | } 100 | 101 | obj.find('.title').click(function(){ 102 | if(obj.data('open')){ 103 | obj.animate({left:-opts.width-22+'px'}, 500); 104 | $(this).find('i').attr('class','fa fa-chevron-circle-right'); 105 | }else{ 106 | obj.animate({left:'0px'}, 500); 107 | $(this).find('i').attr('class','fa fa-chevron-circle-left'); 108 | } 109 | obj.data('open',obj.data('open') == true ? false : true); 110 | }); 111 | }, 112 | showAtRight : function(obj, opts){ 113 | if(opts.open){ 114 | obj.css({right:'0px'}); 115 | obj.find('.title').css('right', opts.width+20+'px').find('i').attr('class','fa fa-chevron-circle-right'); 116 | }else{ 117 | obj.css({right:'25px'}); 118 | obj.find('.title').css('right', opts.width+20+'px').find('i').attr('class','fa fa-chevron-circle-left'); 119 | } 120 | 121 | obj.find('.title').click(function(){ 122 | if(obj.data('open')){ 123 | obj.animate({right:-opts.width-22+'px'}, 500); 124 | $(this).find('i').attr('class','fa fa-chevron-circle-left'); 125 | }else{ 126 | obj.animate({right:'0px'}, 500); 127 | $(this).find('i').attr('class','fa fa-chevron-circle-right'); 128 | } 129 | obj.data('open',obj.data('open') == true ? false : true); 130 | }); 131 | } 132 | }; 133 | })(jQuery) -------------------------------------------------------------------------------- /PrincessAdventure/libs/yocool@final/princessadventure/yui_q.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/libs/yocool@final/princessadventure/yui_q.png -------------------------------------------------------------------------------- /PrincessAdventure/static/.gitignore: -------------------------------------------------------------------------------- 1 | *.gz -------------------------------------------------------------------------------- /PrincessAdventure/static/README.md: -------------------------------------------------------------------------------- 1 | # 开发注意事项 2 | 3 | 默认配置下,此目录下的文件会被 gzip 压缩缓存。修改源文件不会立刻反映在浏览器中。开发时请在配置文件中将 `web-gzp` 值设置为 `0` 4 | 5 | 或者使用下面的命令删除所有缓存 6 | 7 | ```shell 8 | # 查看所有 .gz 文件 9 | find . -name "*.gz" -type f 10 | 11 | # 删除所有 .gz 文件 12 | find . -name "*.gz" -type f -delete 13 | ``` 14 | -------------------------------------------------------------------------------- /PrincessAdventure/static/admin/groups.js: -------------------------------------------------------------------------------- 1 | var vm = new Vue({ 2 | el: '#app', 3 | data: { 4 | groupData: [], 5 | }, 6 | mounted() { 7 | this.refresh(); 8 | }, 9 | methods: { 10 | refresh: function (event) { 11 | var thisvue = this; 12 | axios.post(api_path, { 13 | action: 'get_data', 14 | csrf_token: csrf_token, 15 | }).then(function (res) { 16 | if (res.data.code == 0) { 17 | thisvue.groupData = res.data.data; 18 | } else { 19 | thisvue.$alert(res.data.message, '加载数据错误'); 20 | } 21 | }).catch(function (error) { 22 | thisvue.$alert(error, '加载数据错误'); 23 | }); 24 | }, 25 | delete_group: function (scope) { 26 | var thisvue = this; 27 | thisvue.$confirm('是否删除' + scope.row.group_name, '提示', { 28 | confirmButtonText: '确定', 29 | cancelButtonText: '取消', 30 | type: 'danger' 31 | }).then(() => { 32 | axios.post(api_path, { 33 | action: 'drop_group', 34 | csrf_token: csrf_token, 35 | group_id: scope.row.group_id, 36 | }).then(function (res) { 37 | if (res.data.code == 0) { 38 | thisvue.$message({ 39 | message: '删除成功', 40 | type: 'success', 41 | }); 42 | } else { 43 | thisvue.$message.error('删除失败' + res.data.message); 44 | } 45 | }).catch(function (error) { 46 | thisvue.$message.error(error); 47 | }); 48 | }).catch(() => { 49 | thisvue.$message({ 50 | type: 'info', 51 | message: '已取消删除' 52 | }); 53 | }); 54 | }, 55 | }, 56 | delimiters: ['[[', ']]'], 57 | }) -------------------------------------------------------------------------------- /PrincessAdventure/static/admin/pool-setting.js: -------------------------------------------------------------------------------- 1 | var vm = new Vue({ 2 | el: '#app', 3 | data: { 4 | settings: null, 5 | }, 6 | mounted() { 7 | var thisvue = this; 8 | axios.get(api_path).then(function (res) { 9 | if (res.data.code == 0) { 10 | thisvue.settings = res.data.settings; 11 | } else { 12 | alert(res.data.message, '加载数据错误'); 13 | } 14 | }).catch(function (error) { 15 | alert(error, '加载数据错误'); 16 | }); 17 | }, 18 | methods: { 19 | addpool: function () { 20 | let newname = "奖池" + (Object.keys(this.settings.pool).length+1); 21 | this.$set(this.settings.pool, newname, { 22 | prop: 0, 23 | prop_last: 0, 24 | prefix: "★★★", 25 | pool: ["请输入内容"], 26 | }); 27 | }, 28 | update: function () { 29 | var thisvue = this; 30 | axios.put(api_path, { 31 | setting: thisvue.settings, 32 | csrf_token: csrf_token, 33 | }).then(function (res) { 34 | if (res.data.code == 0) { 35 | alert('设置成功,重启后生效'); 36 | } else { 37 | alert('设置失败:' + res.data.message); 38 | } 39 | }).catch(function (error) { 40 | alert(error); 41 | }); 42 | }, 43 | }, 44 | delimiters: ['[[', ']]'], 45 | }) -------------------------------------------------------------------------------- /PrincessAdventure/static/admin/setting.js: -------------------------------------------------------------------------------- 1 | var vm = new Vue({ 2 | el: '#app', 3 | data: { 4 | setting: {}, 5 | activeNames: [], 6 | bossSetting: false, 7 | domain: '', 8 | domainApply: false, 9 | applyName: '', 10 | loading: false, 11 | }, 12 | mounted() { 13 | var thisvue = this; 14 | axios.get(api_path).then(function (res) { 15 | if (res.data.code == 0) { 16 | thisvue.setting = res.data.settings; 17 | } else { 18 | alert(res.data.message); 19 | } 20 | }).catch(function (error) { 21 | alert(error); 22 | }); 23 | }, 24 | methods: { 25 | update: function (event) { 26 | this.setting.web_mode_hint = false; 27 | axios.put( 28 | api_path, 29 | { 30 | setting: this.setting, 31 | csrf_token: csrf_token, 32 | }, 33 | ).then(function (res) { 34 | if (res.data.code == 0) { 35 | alert('设置成功,重启机器人后生效'); 36 | } else { 37 | alert('设置失败:' + res.data.message); 38 | } 39 | }).catch(function (error) { 40 | alert(error); 41 | }); 42 | }, 43 | sendApply: function (api) { 44 | if (this.domain === '') { 45 | alert('请选择后缀'); 46 | return; 47 | } 48 | if (/^[0-9a-z]{1,16}$/.test(this.applyName)) { 49 | ; 50 | } else { 51 | alert('只能包含字母、数字'); 52 | return; 53 | } 54 | var thisvue = this; 55 | this.loading = true; 56 | axios.get( 57 | api + '?name=' + thisvue.applyName + thisvue.domain 58 | ).then(function (res) { 59 | thisvue.domainApply = false; 60 | if (res.data.code == 0) { 61 | alert('申请成功,请等待1分钟左右解析生效'); 62 | thisvue.setting.public_address = thisvue.setting.public_address.replace(/\/\/([^:\/]+)/, '//' + thisvue.applyName + thisvue.domain); 63 | thisvue.update(null); 64 | } else if (res.data.code == 1) { 65 | alert('申请失败,此域已被占用'); 66 | } else { 67 | alert('申请失败,' + res.data.message); 68 | } 69 | thisvue.loading = false; 70 | }).catch(function (error) { 71 | thisvue.loading = false; 72 | alert(error); 73 | }); 74 | }, 75 | add_stage: function (area) { 76 | this.setting.boss[area].push(this.setting.boss[area][this.setting.boss[area].length - 1].slice()); 77 | const index = this.setting.stage_cycle[area].length - 1; 78 | if (index >= 0) { 79 | this.setting.stage_cycle[area].push(this.setting.stage_cycle[area][index] + 1); 80 | } else { 81 | this.setting.stage_cycle[area].push(2); 82 | } 83 | }, 84 | remove_stage: function (area) { 85 | if (this.setting.boss[area].length == 1) return; 86 | this.setting.boss[area].pop(); 87 | this.setting.stage_cycle[area].pop(); 88 | }, 89 | comfirm_change_clan_mode: function (event) { 90 | this.$alert('修改模式后,公会战数据会重置。请不要在公会战期间修改!', '警告', { 91 | confirmButtonText: '知道了', 92 | type: 'warning', 93 | }); 94 | }, 95 | }, 96 | delimiters: ['[[', ']]'], 97 | }) -------------------------------------------------------------------------------- /PrincessAdventure/static/admin/users.js: -------------------------------------------------------------------------------- 1 | var vm = new Vue({ 2 | el: '#app', 3 | data: { 4 | isLoading: true, 5 | moreLoading: false, 6 | userData: [], 7 | querys: { 8 | page: 1, 9 | page_size: 50, 10 | qqid: null, 11 | clan_group_id: null, 12 | authority_group: null, 13 | }, 14 | query_input: { 15 | qqid: null, 16 | clan_group_id: null, 17 | authority_group: null, 18 | }, 19 | has_more: true, 20 | authtype: [{ 21 | value: 100, 22 | label: '成员', 23 | }, { 24 | value: 10, 25 | label: '公会战管理员', 26 | }, { 27 | value: 1, 28 | label: '主人', 29 | }], 30 | }, 31 | mounted() { 32 | this.load_more(); 33 | }, 34 | methods: { 35 | datestr: function (ts) { 36 | if (ts == 0) { 37 | return null; 38 | } 39 | var nd = new Date(); 40 | nd.setTime(ts * 1000); 41 | return nd.toLocaleString('chinese', { hour12: false, timeZone: 'asia/shanghai' }); 42 | }, 43 | search: function (event) { 44 | Object.assign(this.querys, this.query_input); 45 | this.querys.page = 1; 46 | this.isLoading = true; 47 | this.userData = []; 48 | this.load_more(); 49 | }, 50 | load_more: function (event) { 51 | this.moreLoading = true; 52 | var thisvue = this; 53 | axios.post(api_path, { 54 | action: 'get_data', 55 | querys: thisvue.querys, 56 | csrf_token: csrf_token, 57 | }).then(function (res) { 58 | if (res.data.code == 0) { 59 | thisvue.userData.push(...res.data.data); 60 | thisvue.isLoading = false; 61 | thisvue.moreLoading = false; 62 | if (res.data.data.length < thisvue.querys.page_size) { 63 | thisvue.has_more = false; 64 | } else { 65 | thisvue.querys.page += 1; 66 | } 67 | } else { 68 | thisvue.$alert(res.data.message, '加载数据错误'); 69 | } 70 | }).catch(function (error) { 71 | thisvue.$alert(error, '加载数据错误'); 72 | }); 73 | }, 74 | modify: function (scope) { 75 | var thisvue = this; 76 | axios.post(api_path, { 77 | action: 'modify_user', 78 | csrf_token: csrf_token, 79 | data: { 80 | qqid: scope.row.qqid, 81 | authority_group: scope.row.authority_group, 82 | }, 83 | }).then(function (res) { 84 | if (res.data.code == 0) { 85 | thisvue.$message({ 86 | message: '修改成功', 87 | type: 'success', 88 | }); 89 | } else { 90 | thisvue.$message.error('修改失败' + res.data.message); 91 | } 92 | }).catch(function (error) { 93 | thisvue.$message.error(error); 94 | }); 95 | }, 96 | delete_user: function (scope) { 97 | var thisvue = this; 98 | thisvue.$confirm('是否删除' + scope.row.nickname, '提示', { 99 | confirmButtonText: '确定', 100 | cancelButtonText: '取消', 101 | type: 'danger' 102 | }).then(() => { 103 | axios.post(api_path, { 104 | action: 'delete_user', 105 | csrf_token: csrf_token, 106 | data: { 107 | qqid: scope.row.qqid, 108 | }, 109 | }).then(function (res) { 110 | if (res.data.code == 0) { 111 | thisvue.$message({ 112 | message: '删除成功', 113 | type: 'success', 114 | }); 115 | } else { 116 | thisvue.$message.error('删除失败' + res.data.message); 117 | } 118 | }).catch(function (error) { 119 | thisvue.$message.error(error); 120 | }); 121 | }).catch(() => { 122 | thisvue.$message({ 123 | type: 'info', 124 | message: '已取消删除' 125 | }); 126 | }); 127 | 128 | 129 | 130 | 131 | }, 132 | }, 133 | delimiters: ['[[', ']]'], 134 | }) -------------------------------------------------------------------------------- /PrincessAdventure/static/chara_marks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/static/chara_marks.png -------------------------------------------------------------------------------- /PrincessAdventure/static/clan/statistics.js: -------------------------------------------------------------------------------- 1 | if (!Object.defineProperty) { 2 | alert('浏览器版本过低'); 3 | } 4 | var vm = new Vue({ 5 | el: '#app', 6 | data: { 7 | progressData: [], 8 | members: [], 9 | tailsData: [], 10 | tailsDataVisible: false, 11 | group_name: null, 12 | reportDate: null, 13 | activeIndex: '4', 14 | multipleSelection: [], 15 | sendRemindVisible: false, 16 | send_via_private: false, 17 | dropMemberVisible: false, 18 | today: 0, 19 | }, 20 | methods: { 21 | handleTitleSelect(key, keyPath) { 22 | switch (key) { 23 | case '1': 24 | window.location = '../'; 25 | break; 26 | case '2': 27 | window.location = '../subscribers/'; 28 | break; 29 | case '3': 30 | window.location = '../progress/'; 31 | break; 32 | case '4': 33 | window.location = '../statistics/'; 34 | break; 35 | case '5': 36 | window.location = `../my/`; 37 | break; 38 | } 39 | }, 40 | } 41 | }) 42 | 43 | -------------------------------------------------------------------------------- /PrincessAdventure/static/clan/subscribers.js: -------------------------------------------------------------------------------- 1 | var vm = new Vue({ 2 | el: '#app', 3 | data: { 4 | bosstag: ['挂树', '预约1', '预约2', '预约3', '预约4', '预约5'], 5 | subscribers: [ 6 | [], [], [], [], [], [], 7 | ], 8 | members: [], 9 | group_name: null, 10 | activeIndex: '2', 11 | }, 12 | mounted() { 13 | var thisvue = this; 14 | axios.post('../api/', { 15 | action: 'get_subscribers', 16 | csrf_token: csrf_token, 17 | }).then(function (res) { 18 | if (res.data.code == 0) { 19 | for (sub of res.data.subscribers) { 20 | thisvue.subscribers[sub.boss].push(sub); 21 | } 22 | thisvue.group_name = res.data.group_name; 23 | document.title = res.data.group_name + ' - 公会战设置'; 24 | } else { 25 | thisvue.$alert(res.data.message, '获取数据失败'); 26 | } 27 | }).catch(function (error) { 28 | thisvue.$alert(error, '获取数据失败'); 29 | }); 30 | axios.post('../api/', { 31 | action: 'get_member_list', 32 | csrf_token: csrf_token, 33 | }).then(function (res) { 34 | if (res.data.code == 0) { 35 | thisvue.members = res.data.members; 36 | } else { 37 | thisvue.$alert(res.data.message, '获取成员失败'); 38 | } 39 | }).catch(function (error) { 40 | thisvue.$alert(error, '获取成员失败'); 41 | }); 42 | }, 43 | methods: { 44 | find_name: function (qqid) { 45 | for (m of this.members) { 46 | if (m.qqid == qqid) { 47 | return m.nickname; 48 | } 49 | }; 50 | return qqid; 51 | }, 52 | get_time_delta: function (time) { 53 | var dateBegin = new Date(time); 54 | var dateEnd = new Date(); 55 | var dateDiff = dateEnd.getTime() - dateBegin.getTime(); 56 | if (dateDiff >= 86400000) { 57 | return '24小时+' 58 | } 59 | var leave1 = dateDiff % (24 * 3600 * 1000); 60 | var hours = Math.floor(leave1 / (3600 * 1000)); 61 | var leave2 = leave1 % (3600 * 1000); 62 | var minutes = Math.floor(leave2 / (60 * 1000)); 63 | return (hours + "小时" + minutes + "分钟"); 64 | }, 65 | handleSelect(key, keyPath) { 66 | switch (key) { 67 | case '1': 68 | window.location = '../'; 69 | break; 70 | case '2': 71 | window.location = '../subscribers/'; 72 | break; 73 | case '3': 74 | window.location = '../progress/'; 75 | break; 76 | case '4': 77 | window.location = '../statistics/'; 78 | break; 79 | case '5': 80 | window.location = `../my/`; 81 | break; 82 | } 83 | }, 84 | }, 85 | delimiters: ['[[', ']]'], 86 | }) -------------------------------------------------------------------------------- /PrincessAdventure/static/clan/user.js: -------------------------------------------------------------------------------- 1 | var gs_offset = { jp: 4, tw: 5, kr: 4, cn: 5 }; 2 | function pad2(num) { 3 | return String(num).padStart(2, '0'); 4 | } 5 | function ts2ds(timestamp) { 6 | var d = new Date(); 7 | d.setTime(timestamp * 1000); 8 | return d.getFullYear() + '/' + pad2(d.getMonth() + 1) + '/' + pad2(d.getDate()); 9 | } 10 | var vm = new Vue({ 11 | el: '#app', 12 | data: { 13 | isLoading: true, 14 | challengeData: [], 15 | activeIndex: '5', 16 | qqid: 0, 17 | nickname: '', 18 | }, 19 | mounted() { 20 | var thisvue = this; 21 | var pathname = window.location.pathname.split('/'); 22 | thisvue.qqid = parseInt(pathname[pathname.length - 2]); 23 | axios.post('../api/', { 24 | action: 'get_user_challenge', 25 | csrf_token: csrf_token, 26 | qqid: thisvue.qqid, 27 | }).then(function (res) { 28 | if (res.data.code != 0) { 29 | thisvue.$alert(res.data.message, '获取记录失败'); 30 | return; 31 | } 32 | thisvue.nickname = res.data.user_info.nickname; 33 | thisvue.refresh(res.data.challenges, res.data.game_server); 34 | thisvue.isLoading = false; 35 | }).catch(function (error) { 36 | thisvue.$alert(error, '获取数据失败'); 37 | }); 38 | }, 39 | methods: { 40 | csummary: function (cha) { 41 | if (cha == undefined) { 42 | return ''; 43 | } 44 | return `(${cha.cycle}-${cha.boss_num}) ${cha.damage}`; 45 | }, 46 | cdetail: function (cha) { 47 | if (cha == undefined) { 48 | return ''; 49 | } 50 | var nd = new Date(); 51 | nd.setTime(cha.challenge_time * 1000); 52 | var detailstr = nd.toLocaleString('chinese', { hour12: false, timeZone: 'asia/shanghai' }) + '\n'; 53 | detailstr += cha.cycle + '周目' + cha.boss_num + '号boss\n'; 54 | detailstr += (cha.health_ramain + cha.damage).toLocaleString(options = { timeZone: 'asia/shanghai' }) + '→' + cha.health_ramain.toLocaleString(options = { timeZone: 'asia/shanghai' }); 55 | if (cha.message) { 56 | detailstr += '\n留言:' + cha.message; 57 | } 58 | return detailstr; 59 | }, 60 | arraySpanMethod: function ({ row, column, rowIndex, columnIndex }) { 61 | if (columnIndex >= 2) { 62 | if (columnIndex % 2 == 0) { 63 | var detail = row.detail[columnIndex - 2]; 64 | if (detail != undefined && detail.health_ramain != 0) { 65 | return [1, 2]; 66 | } 67 | } else { 68 | var detail = row.detail[columnIndex - 3]; 69 | if (detail != undefined && detail.health_ramain != 0) { 70 | return [0, 0]; 71 | } 72 | } 73 | } 74 | }, 75 | refresh: function (challenges, game_server) { 76 | var thisvue = this; 77 | var m = { pcrdate: -1 }; 78 | for (c of challenges) { 79 | var pcrdate = ts2ds(c.challenge_time - (gs_offset[game_server] * 3600)); 80 | if (m.pcrdate != pcrdate) { 81 | if (m.pcrdate != -1) { 82 | thisvue.challengeData.push(m); 83 | } 84 | m = { 85 | pcrdate: pcrdate, 86 | finished: 0, 87 | detail: [], 88 | } 89 | } 90 | m.detail[2 * m.finished] = c; 91 | if (c.is_continue) { 92 | m.finished += 0.5; 93 | } else { 94 | if (c.health_ramain != 0) { 95 | m.finished += 1; 96 | } else { 97 | m.finished += 0.5; 98 | } 99 | } 100 | } 101 | if (m.pcrdate != -1) { 102 | thisvue.challengeData.push(m); 103 | } 104 | }, 105 | viewInExcel: function () { 106 | var icons = document.getElementsByTagName('span'); 107 | while (icons[0]) { 108 | icons[0].remove(); 109 | } 110 | var uri = 'data:application/vnd.ms-excel;base64,'; 111 | var ctx = '' + document.getElementsByTagName('thead')[0].innerHTML + document.getElementsByTagName('tbody')[0].innerHTML + '
'; 112 | window.location.href = uri + window.btoa(unescape(encodeURIComponent(ctx))); 113 | document.documentElement.innerHTML = '请在Excel中查看(如果无法打开,请安装最新版本Excel)\n或者将整个表格复制,粘贴到Excel中使用'; 114 | }, 115 | handleTitleSelect(key, keyPath) { 116 | switch (key) { 117 | case '1': 118 | window.location = '../'; 119 | break; 120 | case '2': 121 | window.location = '../subscribers/'; 122 | break; 123 | case '3': 124 | window.location = '../progress/'; 125 | break; 126 | case '4': 127 | window.location = '../statistics/'; 128 | break; 129 | case '5': 130 | window.location = `../my/`; 131 | break; 132 | } 133 | }, 134 | }, 135 | delimiters: ['[[', ']]'], 136 | }) -------------------------------------------------------------------------------- /PrincessAdventure/static/gacha.js: -------------------------------------------------------------------------------- 1 | var pool = [ 2 | [1071, 1061, 1070, 1804, 1012, 1043, 1057, 1028, 1029, 1011, 1030, 1018, 1032, 1053, 1049, 1009, 1047, 1010, 1063, 1036, 1044, 1037, 1056, 1014, 1092, 1094, 1095, 1096, 1107, 1108, 1113, 1114, 1065, 1117, 1122, 1109, 1110, 1075, 1077, 1078, 1079, 1081, 1083, 1084, 1086, 1087, 1088, 1091, 1097, 1099, 1100, 1103, 1104, 1106, 1111, 1115, 1119, 1120, 1124, 1125, 1127, 1128], 3 | [1045, 1048, 1008, 1006, 1046, 1020, 1033, 1031, 1017, 1042, 1051, 1027, 1007, 1038, 1016, 1026, 1023, 1015, 1054, 1005, 1013], 4 | [1003, 1034, 1040, 1022, 1004, 1052, 1025, 1050, 1001, 1021, 1055], 5 | ]; 6 | var experience = { 7 | "star3": 0, 8 | "star2": 0, 9 | "star1": 0, 10 | "diamond": 0, 11 | }; 12 | var progress = false; 13 | (function () { 14 | var h = localStorage['gacha_experience']; 15 | if (h) { 16 | [experience.star3, experience.star2, experience.star1, experience.diamond] = h.split(',').map(x => +x); 17 | } 18 | })(); 19 | function randarr(arr) { 20 | return String(arr[Math.floor(Math.random() * arr.length)]); 21 | } 22 | function pick(i) { 23 | var x = Math.random(); 24 | if (x < 0.025) { 25 | experience.star3 += 1; 26 | return randarr(pool[0]) + '31'; 27 | } else if (x < 0.205) { 28 | experience.star2 += 1; 29 | return randarr(pool[1]) + '11'; 30 | } else if (i == 9) { 31 | experience.star2 += 1; 32 | return randarr(pool[1]) + '11'; 33 | } 34 | experience.star1 += 1; 35 | return randarr(pool[2]) + '11'; 36 | } 37 | function sleep(time) { 38 | return new Promise((resolve) => setTimeout(resolve, time)); 39 | } 40 | async function reload() { 41 | var container = document.getElementById('container'); 42 | container.innerHTML = ''; 43 | for (i of Array(10).keys()) { 44 | await sleep(200); 45 | let chara = String(pick(i)); 46 | let result = document.createElement('img'); 47 | result.src = sourcebase + chara + '.jpg'; 48 | container.appendChild(result); 49 | if (i === 4) { 50 | container.appendChild(document.createElement('br')); 51 | } 52 | } 53 | experience.diamond += 1500; 54 | } 55 | async function gacha() { 56 | if (progress) { 57 | return; 58 | } 59 | progress = true; 60 | await reload(); 61 | document.getElementById('result').innerHTML = `★3: ${experience.star3}
★2: ${experience.star2}
★1: ${experience.star1}
总耗钻: ${experience.diamond}`; 62 | localStorage['gacha_experience'] = [experience.star3, experience.star2, experience.star1, experience.diamond].join(','); 63 | progress = false; 64 | } -------------------------------------------------------------------------------- /PrincessAdventure/static/gongan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/static/gongan.png -------------------------------------------------------------------------------- /PrincessAdventure/static/marionette.js: -------------------------------------------------------------------------------- 1 | var vm = new Vue({ 2 | el: '#sending', 3 | data: { 4 | message_type: 'group', 5 | user_id: 0, 6 | group_id: 0, 7 | message: '', 8 | }, 9 | mounted() { 10 | if (localStorage.message_type) { 11 | this.message_type = localStorage.message_type; 12 | this.user_id = localStorage.user_id; 13 | this.group_id = localStorage.group_id; 14 | this.message = localStorage.message; 15 | } 16 | }, 17 | watch: { 18 | message_type: function (newmessage_type) { 19 | localStorage.message_type = newmessage_type; 20 | }, 21 | user_id: function (newuser_id) { 22 | localStorage.user_id = newuser_id; 23 | }, 24 | group_id: function (newgroup_id) { 25 | localStorage.group_id = newgroup_id; 26 | }, 27 | message: function (newmessage) { 28 | localStorage.message = newmessage; 29 | }, 30 | }, 31 | methods: { 32 | send_msg: function (event) { 33 | axios.post( 34 | api_path, 35 | this.$data, 36 | ).then(function (res) { 37 | if (res.data.code == 0) { 38 | alert('已发送'); 39 | } else { 40 | alert('发送失败:' + res.data.message); 41 | } 42 | }).catch(function (error) { 43 | alert(error); 44 | }); 45 | }, 46 | }, 47 | delimiters: ['[[', ']]'], 48 | }) -------------------------------------------------------------------------------- /PrincessAdventure/static/small.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A-kirami/YoCool/97b41304ce83fd9fb744c2cde6e7f3cbb7c1cb06/PrincessAdventure/static/small.ico -------------------------------------------------------------------------------- /PrincessAdventure/template/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 404 Not Found 5 | 6 | 7 | 8 | 9 | 10 | 31 | 32 | 33 | 34 | 35 |

404: not found

36 |

这个{{ item }}不存在

37 |
38 |
39 |
40 | loading... 42 | loading... 44 |
45 |
46 |
47 | 48 | 49 | -------------------------------------------------------------------------------- /PrincessAdventure/template/about.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 关于 5 | 6 | 7 | 8 | 9 |

10 | 返回 11 |

12 |
13 |

14 | 关于yobot 15 |

16 |

17 | 版本:
18 | {{ verinfo | replace("\n", "
") }} 19 |

20 |

21 | 主页:
22 | https://yobot.win/ 23 |

24 |

25 | 源码:
26 | yobot 27 |

28 |

29 | 联系邮箱:
30 | yobot@pcrbot.com 31 |

32 |

33 | 交流群:770947581 34 |

35 |

36 | 其他 37 |

38 |

39 | 本项目没有开启赞助、打赏的渠道,所有付款行为与本项目无关。
40 | 如果你付费获取了本工具,可能是第三方收取的服务器费用和托管费用。 41 |

42 |
43 |
44 |

45 | 关于YoCool 46 |

47 |

48 | :版本
49 | YoCool-Final-PrincessAdventure 50 |

51 |

52 | :源码
53 | YoCool 55 |

56 |

57 | :更新日志
点我查看 58 |

59 |

60 | :了解更多
YoCool WIKI 61 |

62 |

63 | 赞助名单(排名不分先后) 64 |

65 |

66 | @var-mixer 67 |

68 |
69 | 70 | -------------------------------------------------------------------------------- /PrincessAdventure/template/admin/groups.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | yobot公会管理 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 28 | 29 | 30 |
31 | 32 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /PrincessAdventure/template/admin/pool-setting.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 自定义奖池 6 | 7 | 8 | 9 | 10 | 11 | 12 |

返回

13 |

所有概率都是相对值,即:抽取率 = 当前奖池概率 ÷ 所有奖池总概率

14 |
15 |
16 |

奖池:[[pname]]

17 |
18 | 名称:
19 | 前缀:
20 | 单抽概率:
21 | 保底抽概率:
22 | 内容:
23 | 24 | 25 |
26 |

27 | 28 |


29 |
30 | 每次抽卡数:
31 | 每日抽卡次数:
32 | 保底抽位置不固定 33 |
34 | 35 |
36 | 37 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /PrincessAdventure/template/admin/users.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | yobot用户管理 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 | 17 | 18 |
19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 搜索 38 | 39 | 40 | 41 | 42 | 45 | 46 | 47 | 48 | 49 | 50 | 55 | 56 | 57 | 60 | 61 | 62 | 63 | 66 | 67 | 68 | 加载更多 69 | 已加载全部 70 | 71 |
72 | 73 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /PrincessAdventure/template/clan/setting.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 公会战设置 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 | 19 | 20 | 21 | 我的 22 | 统计 23 | 查刀 24 | 预约 25 | 面板 26 | 27 |
28 |

设置

29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 出刀表无需登录 40 | 允许api获取数据 41 | 42 | 43 | 伤害上报 44 | 撤销上报 45 | 申请出刀 46 | 取消申请 47 | 预约boss 48 | 取消预约 49 | 挂树 50 | 取消挂树 51 | 修改状态 52 | 使用SL 53 | 54 | 55 | 确定 56 | 返回 57 | 58 | 59 | 现在档案编号:[[ battle_id ]]
60 | 导出数据 61 | {#- 新建档案 -#} 62 | 切换档案 63 | 64 | 65 |
    66 |
  • 67 | [[ item.battle_id ]]号存档:[[ item.record_count ]]条记录 68 |
  • 69 |
70 | 71 | 72 | 73 | 74 | 75 | 76 | 取消 77 | 切换 78 | 79 |
80 | 删除数据 81 | 82 |

此操作会删除 [[ battle_id ]] 号存档中所有数据

83 | 84 | 取消 85 | 确定 86 | 87 |
88 |
89 |
90 |
91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /PrincessAdventure/template/clan/statistics/statistics1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 总统计 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 20 | 21 | 22 | 23 | 24 | 26 | 27 | 28 | 29 | 32 | 33 | 34 |
35 | 36 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /PrincessAdventure/template/clan/subscribers.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 公会战预约 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 18 | 19 | 20 | 21 |
22 |
23 | 24 | 25 | 26 | 我的 27 | 统计 28 | 查刀 29 | 预约 30 | 面板 31 | 32 |
33 |

预约名单

34 | 35 | 36 | 37 | [[ bosstag[bn-1] ]] 38 | 39 |

40 | [[ find_name(m.qqid) ]]([[ m.qqid ]]) 41 | 44 | 47 |

48 |

49 | 没有记录 50 |

51 |
52 |
53 |
54 | 55 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /PrincessAdventure/template/clan/unauthorized.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 权限不足 5 | 6 | 7 | 8 | 9 | 30 | 31 | 32 | 33 | 34 |

权限不足

35 |

这个公会的信息是私密的,只有其成员可以查看

36 |
37 |
38 |
39 | loading... 40 | loading... 41 |
42 |
43 |
44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /PrincessAdventure/template/clan/user.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 个人出刀记录 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 28 | 29 | 30 | 31 |
32 |
33 | 34 | 35 | 36 | 我的 37 | 统计 38 | 查刀 39 | 预约 40 | 面板 41 | 42 |
43 |

[[ nickname ]]的出刀记录

44 | 93 | 96 | 查看用户:[[ nickname ]] 97 |
98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /PrincessAdventure/template/collection.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 仓库 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | {% for th in data["header"] -%} 13 | 14 | {% endfor -%} 15 | 16 | {% for tr in data["body"] -%} 17 | 18 | {% for td in tr -%} 19 | 20 | {% endfor -%} 21 | 22 | {% endfor -%} 23 | 24 |
{{ th }}
{{ td }}
25 | -------------------------------------------------------------------------------- /PrincessAdventure/template/gacha.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | gacha 5 | 6 | 28 | 29 | 30 | 31 |
32 |
33 |
34 |
点击图片抽卡
35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /PrincessAdventure/template/homepage.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | YoCool Link Start 6 | 7 | 8 | 9 | 10 | 11 | 12 | 36 | 37 | 38 | 39 |
40 |
41 |

Hi!YoCool!

42 |
43 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |

56 |

—yobot is running—

57 | 66 | 68 | {% if show_icp -%} 69 | {{ icp_info }} 70 |   71 | {% if gongan_info -%} 72 | 74 | 75 | {{ gongan_info }} 76 | 77 |   78 | {% endif -%} 79 | {% endif -%} 80 | 81 | 82 | 85 | 86 | -------------------------------------------------------------------------------- /PrincessAdventure/template/jjc-solution.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 竞技场解法 6 | 50 | 51 | 52 | 53 |

竞技场解法

54 |

防守队伍:

55 |
56 | {% for (chara_id, _) in def_lst -%} 57 | 58 | {% endfor -%} 59 |
60 |

{{ '国服' if region==2 else '台服' if region==3 else '日服' if region==4 else '' }}解法:

61 | 62 | 63 | {% for solution in result -%} 64 | 65 | {% for chara in solution.team -%} 66 | 86 | {% endfor -%} 87 | 92 | 93 | {% endfor -%} 94 | 95 |
67 | 68 |
69 | {% if chara.stars == 6 -%} 70 |
71 |
72 |
73 |
74 |
75 |
76 | {% else -%} 77 | {% for i in range(chara.stars) -%} 78 |
79 | {% endfor -%} 80 | {% if chara.equip -%} 81 |
82 | {% endif -%} 83 | {% endif -%} 84 |
85 |
88 | 👍{{ solution.good }}
89 | 👎{{ solution.bad }}
90 | {{ solution.time }} 91 |
96 | {% if search_source=="nomae.net" -%} 97 |
数据来源nomae.net
98 | {% elif search_source=="pcrdfans.com" -%} 99 |
数据来源公主连结Re: Dive Fan Club
100 | {% endif -%} 101 | 102 | 103 | -------------------------------------------------------------------------------- /PrincessAdventure/template/login-code.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | yobot登录 5 | 6 | 7 | 8 |

正在登录中……

9 | 17 | 18 | -------------------------------------------------------------------------------- /PrincessAdventure/template/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 会战系统登录 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 32 | 33 | 34 | 35 |
36 |
37 |

会战系统登录

38 |
39 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 |
52 |
53 |
54 | {% if reason -%} 55 | 56 | 57 | {% endif -%} 58 |
59 | 60 | 61 | 62 | 63 | 64 | 65 | 67 | 68 | 69 | 登录 70 | 71 | 72 |
73 |
74 | 75 | 135 | 136 | 137 | -------------------------------------------------------------------------------- /PrincessAdventure/template/manual.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 使用手册 5 | 6 | 7 | 8 | 27 | 28 | 29 | 30 |

公会战功能使用手册

31 | 32 |

使用 Bot 管理公会战,需要所有成员遵守使用规则
Bot 只是辅助作用,与成员多沟通才能提高分数

33 | 34 |

具体指令请以查看帮助页面

35 | 36 |

开始前

37 | 38 |
    39 |
  1. 机器人管理员进入后台设置,确认设置中的 boss 生命值符合当期公会战
  2. 40 |
  3. 在群聊中发送创建日服公会(日、韩、台、国)
  4. 41 |
  5. 所有公会战成员在群聊中发送加入公会,或者由群管理员发送加入全部成员
  6. 42 |
  7. 成员向 bot 私聊发送登录重置密码,进入后台确认,同时修改登录密码
  8. 43 |
  9. 成员进入公会战面板,并将网页地址保存到桌面快捷方式(手机、电脑均可),以便使用网页报刀和查看数据
  10. 44 |
  11. 管理员在公会设置中,新建一个空白档案用来存放公会战数据
  12. 45 |
46 | 47 |

进行中:成员

48 | 49 | 58 | 59 |

进行中:管理员

60 | 61 | 66 | 67 |

特殊情况

68 | 69 | 75 | 76 |

查看数据

77 | 78 |

公会战面板“查刀”页面中能查看记录的所有数据,并进行快速的筛选、过滤。如果需要原始数据,可以从“统计”页面导出。

79 | 80 | 81 | -------------------------------------------------------------------------------- /PrincessAdventure/template/marionette.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 人偶模式 6 | 7 | 8 | 9 | 10 | 11 |
12 |

操纵人偶

13 | 发送: 14 | 18 |
19 | QQ号: 20 |
21 |
22 | 群号: 23 |
24 | 消息: 25 | 26 |
27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /PrincessAdventure/template/password.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 修改密码 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 52 | 53 | 54 | 55 |
56 | 57 |
58 | {% if error -%} 59 | 62 | 63 | {% endif -%} 64 | {% if success -%} 65 | 68 | 69 | {% endif -%} 70 | 71 | 72 |
73 |

修改密码

74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 修改 83 | 84 | 85 |
86 |
87 | 88 | 153 | 154 | -------------------------------------------------------------------------------- /PrincessAdventure/template/unauthorized.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 用户权限不足 6 | 7 | 8 | 9 |

权限不足

10 |

浏览这个页面需要权限:{{ limit }}

11 |

你的权限:{{ uath }}

12 |

13 | 返回 14 | 15 | 16 | -------------------------------------------------------------------------------- /PrincessAdventure/template/user-info.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 个人中心 6 | 7 | 8 | 9 | 10 | 32 | 33 | 34 | 35 | 36 |
37 | 38 | 69 | 74 |
75 | 76 | 158 | 159 | 160 | -------------------------------------------------------------------------------- /PrincessAdventure/template/user.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 公主连结公会战面板 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 52 | 53 | 54 | 55 |
56 |
57 |

会战管理面板

58 |
59 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |

72 |
73 | 74 |

欢迎,{{ user.nickname }}

75 | {% if user.authority_group < 10 -%} 76 | 77 | 78 | 设置项 79 | 80 | 81 | 用户管理 82 | 83 | 84 | 群管理 85 | 86 | 87 | {%- endif %} 88 | 89 | {% if not clan_groups -%} 90 | 91 |
你还没有加入公会
请在你的公会群内发送“加入公会”来加入一个公会
92 | 无公会 93 |
94 | {%- else -%} 95 | {% for group in clan_groups -%} 96 | 97 | 公会:{{ group['group_name'] }} 98 | 99 |

100 | {% endfor -%} 101 | {%- endif %} 102 |
103 |
104 | 105 | 136 | 137 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ⚠️ 警告:由于Yobot已停止更新,故此项目不再进行维护,最后适配版本为 Yobot v3.6.16 2 | 3 | ![](https://i.loli.net/2020/07/23/HmLnyN5UKesPXld.png) 4 | # YoCool——YobotWebBeautify 5 |

6 | 7 | 8 | 9 | 10 | 11 |

12 | 13 | ### YoCool——美观、可爱、精致的Yobot后台主题 14 | YoCool是[Yobot](https://github.com/pcrbot/yobot)的会战管理后台美化项目,拥有多种主题风格可供选择。 15 | 16 | ## 目录 17 | - [开始使用](https://github.com/A-kirami/YoCool/#开始使用) 18 | - [要求](https://github.com/A-kirami/YoCool/#要求) 19 | - [下载](https://github.com/A-kirami/YoCool/#下载) 20 | - [安装](https://github.com/A-kirami/YoCool/#安装) 21 | - [使用](https://github.com/A-kirami/YoCool/#使用) 22 | - [最近更新](https://github.com/A-kirami/YoCool/#最近更新) 23 | - [了解更多](https://github.com/A-kirami/YoCool/#了解更多) 24 | - [代码贡献](https://github.com/A-kirami/YoCool/#代码贡献) 25 | - [相关项目](https://github.com/A-kirami/YoCool/#相关项目) 26 | 27 | ## 开始使用 28 | 29 | ### 要求 30 | 31 | 本项目仅含主题模板,需要搭配Yobot本体使用 32 | > [Yobot Windows 一键部署](http://yobot.win/install/Windows-mirai-auto/) 33 | 34 | > [Yobot Linux 一键部署](http://yobot.win/install/docker-script/) 35 | 36 | > [Yobot Linux 手动部署](http://yobot.win/install/Linux-gocqhttp/) 37 | 38 | ### 下载 39 | 请前往[Releases](https://github.com/A-kirami/YoCool/releases),根据自身Yobot版本下载最新YoCool压缩包 40 | 41 | **便携版**下载文件名结尾为**exe**的压缩包 42 | 43 | **插件版或源码版**下载文件名结尾为**plugin**的压缩包 44 | 45 | ### 安装 46 |
47 | 便携版 48 | 49 | - 未安装过yobot便携版
50 | - 直接双击exe文件初始化后使用 51 | - 已安装yobot便携版
52 | - 直接替换yobot便携版的exe文件(注意备份原exe文件) 53 | 54 |
55 | 56 |
57 | 插件版或源码版 58 | 59 | 安装前请先备份``yobot\src\client\public``文件夹中的全部文件,以防出现意外问题
60 | 61 | 1. 复制主题包中的**libs**、**template**和**static**文件夹
62 | 63 | 2. 进入到``yobot\src\client\public``目录下
64 | 65 | 3. 将文件夹直接粘贴覆盖 66 | 67 |
68 | 69 | ### 使用 70 | 无需重启,即装即用 71 | 72 | ## 最近更新 73 | - 不再使用 CDN, 静态资源移至本地 74 | 75 | ## 了解更多 76 | 关于YoCool的更多信息,你可以在[YoCool Wiki](https://github.com/A-kirami/YoCool/wiki)中查看到 77 | 78 | ## 代码贡献 79 | 感谢以下大佬在本项目中提供的支援和帮助
80 | [@kaiseixd](https://github.com/kaiseixd) @白白小童鞋 [@pwinner](https://github.com/pwinner) 81 | 82 | ## 相关项目 83 | - [YoWhite](https://github.com/shkongzhu/YoWhite) - 一个白色调的Yobot美化模板 84 | - [YobotWebInterface](https://github.com/laipz8200/YobotWebInterface) - 使用Quasar的Yobot外观模板,提供对PC和移动端更好的布局适配以及更友好的交互逻辑 85 | --------------------------------------------------------------------------------