├── .eslintrc ├── .gitignore ├── LICENSE ├── README.md ├── app ├── assets │ ├── logo.icns │ ├── logo.ico │ ├── logo.pdn │ ├── logo.png │ ├── mogicians_manual.png │ ├── moha.png │ └── rubao_manual.jpg ├── libs │ └── node-fetch.js ├── local_proxy │ ├── hosts.json │ ├── index.js │ ├── node_modules │ │ ├── debug │ │ │ ├── node.js │ │ │ ├── package.json │ │ │ └── src │ │ │ │ ├── browser.js │ │ │ │ ├── debug.js │ │ │ │ ├── index.js │ │ │ │ └── node.js │ │ ├── eventemitter3 │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── package.json │ │ │ └── umd │ │ │ │ ├── eventemitter3.js │ │ │ │ ├── eventemitter3.min.js │ │ │ │ └── eventemitter3.min.js.map │ │ ├── follow-redirects │ │ │ ├── http.js │ │ │ ├── https.js │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── http-proxy │ │ │ ├── index.js │ │ │ ├── lib │ │ │ │ ├── http-proxy.js │ │ │ │ └── http-proxy │ │ │ │ │ ├── common.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── passes │ │ │ │ │ ├── web-incoming.js │ │ │ │ │ ├── web-outgoing.js │ │ │ │ │ └── ws-incoming.js │ │ │ └── package.json │ │ ├── ms │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── requires-port │ │ │ ├── index.js │ │ │ ├── package.json │ │ │ └── test.js │ │ ├── socksv5 │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── index.js │ │ │ ├── lib │ │ │ │ ├── Agents.js │ │ │ │ ├── auth │ │ │ │ │ ├── None.js │ │ │ │ │ └── UserPassword.js │ │ │ │ ├── client.js │ │ │ │ ├── client.parser.js │ │ │ │ ├── constants.js │ │ │ │ ├── server.js │ │ │ │ ├── server.parser.js │ │ │ │ └── utils.js │ │ │ ├── node_modules │ │ │ │ └── ipv6 │ │ │ │ │ ├── .npmignore │ │ │ │ │ ├── .travis.yml │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── bin │ │ │ │ │ ├── ipv6.js │ │ │ │ │ └── ipv6grep.js │ │ │ │ │ ├── examples │ │ │ │ │ ├── browser │ │ │ │ │ │ └── simple.html │ │ │ │ │ └── node │ │ │ │ │ │ └── simple.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── ipv6.js │ │ │ │ │ ├── lib │ │ │ │ │ ├── browser │ │ │ │ │ │ ├── jsbn-combined.js │ │ │ │ │ │ ├── jsbn.js │ │ │ │ │ │ ├── jsbn2.js │ │ │ │ │ │ └── sprintf.js │ │ │ │ │ └── node │ │ │ │ │ │ └── bigint.js │ │ │ │ │ ├── node_modules │ │ │ │ │ └── sprintf │ │ │ │ │ │ ├── .npmignore │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── lib │ │ │ │ │ │ └── sprintf.js │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ └── test │ │ │ │ │ │ └── function-export.js │ │ │ │ │ ├── package.json │ │ │ │ │ └── test │ │ │ │ │ ├── address-test.js │ │ │ │ │ ├── data │ │ │ │ │ ├── invalid-ipv4-addresses.json │ │ │ │ │ ├── invalid-ipv6-addresses.json │ │ │ │ │ ├── valid-ipv4-addresses.json │ │ │ │ │ └── valid-ipv6-addresses.json │ │ │ │ │ ├── functionality-v4-test.js │ │ │ │ │ ├── functionality-v6-test.js │ │ │ │ │ └── unused │ │ │ │ │ ├── grep-test.txt │ │ │ │ │ └── regex-test.js │ │ │ └── package.json │ │ └── wikipedia-proxy │ │ │ ├── .eslintrc │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── cert.crt │ │ │ ├── dns.js │ │ │ ├── ip-addresses.js │ │ │ ├── main.js │ │ │ ├── package.json │ │ │ ├── rsa.key │ │ │ └── socks5.js │ └── package.json ├── main.js ├── package.json ├── packager.sh ├── pages │ ├── bao │ │ ├── images │ │ │ ├── background.jpg │ │ │ ├── flash.png │ │ │ ├── fruit │ │ │ │ ├── b1-1.png │ │ │ │ ├── b1-2.png │ │ │ │ ├── b1.png │ │ │ │ ├── b2-1.png │ │ │ │ ├── b2-2.png │ │ │ │ ├── b2.png │ │ │ │ ├── b3-1.png │ │ │ │ ├── b3-2.png │ │ │ │ ├── b3.png │ │ │ │ ├── b4-1.png │ │ │ │ ├── b4-2.png │ │ │ │ ├── b4.png │ │ │ │ ├── basiclaw.png │ │ │ │ ├── f1-1.png │ │ │ │ ├── f1-2.png │ │ │ │ ├── f1.png │ │ │ │ ├── f2-1.png │ │ │ │ ├── f2-2.png │ │ │ │ ├── f2.png │ │ │ │ ├── f3-1.png │ │ │ │ ├── f3-2.png │ │ │ │ ├── f3.png │ │ │ │ ├── f4-1.png │ │ │ │ ├── f4-2.png │ │ │ │ ├── f4.png │ │ │ │ ├── f5-1.png │ │ │ │ ├── f5-2.png │ │ │ │ ├── f5.png │ │ │ │ ├── f6-1.png │ │ │ │ ├── f6-2.png │ │ │ │ ├── f6.png │ │ │ │ ├── ferrari.png │ │ │ │ ├── gesar.png │ │ │ │ ├── s1.png │ │ │ │ ├── s2.png │ │ │ │ ├── w1-1.png │ │ │ │ ├── w1-2.png │ │ │ │ ├── w1.png │ │ │ │ ├── w2-1.png │ │ │ │ ├── w2-2.png │ │ │ │ ├── w2.png │ │ │ │ ├── w3-1.png │ │ │ │ ├── w3-2.png │ │ │ │ ├── w3.png │ │ │ │ └── zy.png │ │ │ ├── game-over.png │ │ │ ├── home-mask.png │ │ │ ├── logo.png │ │ │ ├── mistake.png │ │ │ ├── new-game.png │ │ │ ├── ninja.png │ │ │ ├── shadow.png │ │ │ ├── x.png │ │ │ ├── xf.png │ │ │ ├── xx.png │ │ │ ├── xxf.png │ │ │ ├── xxx.png │ │ │ └── xxxf.png │ │ ├── index.html │ │ ├── scripts │ │ │ ├── animation.js │ │ │ ├── collision.js │ │ │ ├── drag.js │ │ │ ├── flash.js │ │ │ ├── fruit-manager.js │ │ │ ├── fruit.js │ │ │ ├── game.js │ │ │ ├── juice.js │ │ │ ├── knife.js │ │ │ ├── layer.js │ │ │ ├── layout.js │ │ │ ├── lib │ │ │ │ ├── raphael.js │ │ │ │ └── tween.js │ │ │ ├── light.js │ │ │ ├── main.js │ │ │ ├── object │ │ │ │ ├── background.js │ │ │ │ ├── game-over.js │ │ │ │ ├── logo.js │ │ │ │ ├── mistake.js │ │ │ │ ├── new-game.js │ │ │ │ └── score.js │ │ │ ├── require.js │ │ │ ├── rotation.js │ │ │ ├── scene.js │ │ │ ├── sound-manager.js │ │ │ ├── sound.js │ │ │ ├── timeline.js │ │ │ └── tools.js │ │ └── sounds │ │ │ ├── basiclaw1.mp3 │ │ │ ├── basiclaw2.mp3 │ │ │ ├── bun1.mp3 │ │ │ ├── bun2.mp3 │ │ │ ├── bun3.mp3 │ │ │ ├── bun4.mp3 │ │ │ ├── bun5.mp3 │ │ │ ├── fault1.mp3 │ │ │ ├── fault10.mp3 │ │ │ ├── fault2.mp3 │ │ │ ├── fault3.mp3 │ │ │ ├── fault4.mp3 │ │ │ ├── fault5.mp3 │ │ │ ├── fault6.mp3 │ │ │ ├── fault7.mp3 │ │ │ ├── fault8.mp3 │ │ │ ├── fault9.mp3 │ │ │ ├── ferrari1.mp3 │ │ │ ├── ferrari2.mp3 │ │ │ ├── ferrari3.mp3 │ │ │ ├── ferrari4.mp3 │ │ │ ├── ferrari5.mp3 │ │ │ ├── ferrari6.mp3 │ │ │ ├── frog1.mp3 │ │ │ ├── frog2.mp3 │ │ │ ├── frog3.mp3 │ │ │ ├── frog4.mp3 │ │ │ ├── gameover1.mp3 │ │ │ ├── gameover2.mp3 │ │ │ ├── gameover3.mp3 │ │ │ ├── gesar1.mp3 │ │ │ ├── shakespeare1.mp3 │ │ │ ├── shakespeare2.mp3 │ │ │ └── winnie1.mp3 │ ├── clock │ │ ├── clock.css │ │ ├── clock.html │ │ ├── clock.js │ │ └── xuming.js │ ├── flappy_frog │ │ ├── icons │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ └── Icon-App-76x76@2x.png │ │ ├── images │ │ │ ├── clouds.png │ │ │ ├── frog.png │ │ │ ├── ground.png │ │ │ └── pipe.png │ │ ├── index.html │ │ ├── js │ │ │ ├── clouds.js │ │ │ ├── game.js │ │ │ ├── global.js │ │ │ ├── main.js │ │ │ ├── pipes.js │ │ │ ├── require.js │ │ │ ├── scene.js │ │ │ ├── sounds.js │ │ │ └── utils.js │ │ ├── lib │ │ │ ├── phaser.min.js │ │ │ └── phaser.min.patched.js │ │ └── sounds │ │ │ ├── bgm.mp3 │ │ │ ├── crash.mp3 │ │ │ ├── flap.mp3 │ │ │ ├── ha.mp3 │ │ │ ├── hurt │ │ │ ├── 1.mp3 │ │ │ ├── 10.mp3 │ │ │ ├── 11.mp3 │ │ │ ├── 12.mp3 │ │ │ ├── 13.mp3 │ │ │ ├── 14.mp3 │ │ │ ├── 15.mp3 │ │ │ ├── 16.mp3 │ │ │ ├── 17.mp3 │ │ │ ├── 18.mp3 │ │ │ ├── 19.mp3 │ │ │ ├── 2.mp3 │ │ │ ├── 20.mp3 │ │ │ ├── 21.mp3 │ │ │ ├── 3.mp3 │ │ │ ├── 4.mp3 │ │ │ ├── 5.mp3 │ │ │ ├── 6.mp3 │ │ │ ├── 7.mp3 │ │ │ ├── 8.mp3 │ │ │ └── 9.mp3 │ │ │ └── score │ │ │ ├── 1.mp3 │ │ │ ├── 10.mp3 │ │ │ ├── 11.mp3 │ │ │ ├── 12.mp3 │ │ │ ├── 13.mp3 │ │ │ ├── 14.mp3 │ │ │ ├── 15.mp3 │ │ │ ├── 16.mp3 │ │ │ ├── 17.mp3 │ │ │ ├── 18.mp3 │ │ │ ├── 19.mp3 │ │ │ ├── 2.mp3 │ │ │ ├── 20.mp3 │ │ │ ├── 21.mp3 │ │ │ ├── 22.mp3 │ │ │ ├── 23.mp3 │ │ │ ├── 24.mp3 │ │ │ ├── 25.mp3 │ │ │ ├── 26.mp3 │ │ │ ├── 27.mp3 │ │ │ ├── 28.mp3 │ │ │ ├── 29.mp3 │ │ │ ├── 3.mp3 │ │ │ ├── 30.mp3 │ │ │ ├── 31.mp3 │ │ │ ├── 32.mp3 │ │ │ ├── 33.mp3 │ │ │ ├── 34.mp3 │ │ │ ├── 35.mp3 │ │ │ ├── 36.mp3 │ │ │ ├── 37.mp3 │ │ │ ├── 38.mp3 │ │ │ ├── 39.mp3 │ │ │ ├── 4.mp3 │ │ │ ├── 40.mp3 │ │ │ ├── 41.mp3 │ │ │ ├── 42.mp3 │ │ │ ├── 43.mp3 │ │ │ ├── 5.mp3 │ │ │ ├── 6.mp3 │ │ │ ├── 7.mp3 │ │ │ ├── 8.mp3 │ │ │ └── 9.mp3 │ ├── flappy_winnie │ │ ├── icons │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ └── Icon-App-76x76@2x.png │ │ ├── images │ │ │ ├── background.png │ │ │ ├── gameover.png │ │ │ ├── ground.png │ │ │ ├── pipe.png │ │ │ ├── play.png │ │ │ ├── restart.png │ │ │ ├── scoreboard.png │ │ │ └── winnie.png │ │ ├── index.html │ │ ├── js │ │ │ ├── game.js │ │ │ ├── global.js │ │ │ ├── main.js │ │ │ ├── pipes.js │ │ │ ├── require.js │ │ │ ├── scene.js │ │ │ ├── sounds.js │ │ │ └── utils.js │ │ ├── lib │ │ │ ├── phaser.min.js │ │ │ └── phaser.min.patched.js │ │ └── sounds │ │ │ ├── crash.mp3 │ │ │ ├── flap.mp3 │ │ │ ├── gameover.mp3 │ │ │ ├── ouch.mp3 │ │ │ ├── score1.mp3 │ │ │ ├── score10.mp3 │ │ │ ├── score11.mp3 │ │ │ ├── score12.mp3 │ │ │ ├── score13.mp3 │ │ │ ├── score14.mp3 │ │ │ ├── score15.mp3 │ │ │ ├── score16.mp3 │ │ │ ├── score17.mp3 │ │ │ ├── score18.mp3 │ │ │ ├── score19.mp3 │ │ │ ├── score2.mp3 │ │ │ ├── score20.mp3 │ │ │ ├── score21.mp3 │ │ │ ├── score22.mp3 │ │ │ ├── score23.mp3 │ │ │ ├── score24.mp3 │ │ │ ├── score25.mp3 │ │ │ ├── score26.mp3 │ │ │ ├── score27.mp3 │ │ │ ├── score3.mp3 │ │ │ ├── score4.mp3 │ │ │ ├── score5.mp3 │ │ │ ├── score6.mp3 │ │ │ ├── score7.mp3 │ │ │ ├── score8.mp3 │ │ │ └── score9.mp3 │ └── landing.html ├── pre.js └── src │ ├── app_menu.js │ ├── check_update.js │ ├── context_menu.js │ ├── copy_current_url.js │ └── menu.js ├── update_history.md └── Θ..Θ-+1s-green.svg /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "commonjs": true, 5 | "es6": true, 6 | "node": true 7 | }, 8 | "extends": "eslint:recommended", 9 | "parserOptions": { 10 | "ecmaVersion": 2018, 11 | "sourceType": "module" 12 | }, 13 | "rules": { 14 | "indent": [ 15 | "error", 16 | 4 17 | ], 18 | "linebreak-style": [ 19 | "error", 20 | "windows" 21 | ], 22 | "quotes": [ 23 | "warn", 24 | "double" 25 | ], 26 | "semi": [ 27 | "warn", 28 | "never" 29 | ], 30 | "no-console": "off" 31 | } 32 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /OutApp 2 | /dist 3 | /upload/settings.py 4 | /upload/settings.pyc 5 | /upload/settings.pyo 6 | /app/node_modules 7 | /*.PNG -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018-2019 Xmader 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mohu App 2 | 3 | 一个simple的膜乎免 番羽土啬 APP 4 | 5 | [![+1s](%CE%98..%CE%98-%2B1s-green.svg)](https://zh.wikipedia.org/wiki/%E8%86%9C%E8%9B%A4%E6%96%87%E5%8C%96) [![构建状态](https://dev.azure.com/xmader/apps/_apis/build/status/MohuAPP?branchName=master)](https://dev.azure.com/xmader/apps/_build/latest?definitionId=6) 6 | 7 | ## 功能 8 | 9 | * 免 番羽土啬 浏览~~膜乎~~、~~品葱~~、膜乎备份、新品葱、2049BBS、编程随想的博客 (镜像站) 10 | 11 | * **免 番羽土啬 访问中文维基百科和reddit等被用SNI检测方式屏蔽的网站** 12 | 13 | * 内置一个续命时钟和一个暴力续命程序 14 | 15 | * 内置一个 好几百个教授一致通过 的 `膜法指南` 16 | 17 | * 视频加载速度可能有些慢,请耐心等候 18 | 19 | * 内置 `乳包指南` 20 | 21 | * 内置三个镆铪/乳苞小游戏: 22 | 23 | * Flappy Winnie 24 | * Flappy Frog 25 | * 切包子 26 | 27 | * 自动检查更新 28 | 29 | ## 下载 30 | 31 | 你可以下载源码自行构建, 或者直接在下面下载构建好的可执行版本: 32 | 33 | [Github Releases](https://github.com/Xmader/mohu/releases/latest) 34 | 35 | 36 | 37 | 38 | 39 | ## 构建 40 | 41 | > 如果您下载的是构建好的版本, 您可以直接跳过泽一步 42 | 43 | ```bash 44 | cd ./app 45 | 46 | electron-packager . MohuAPP --app-copyright="Copyright (c) 2018-2019 Xmader" \ 47 | --platform=${platform} --arch=${arch} --electron-version 3.0.4 \ 48 | --out ../OutApp/ --overwrite \ 49 | --icon=./assets/logo.ico --ignore=packager.sh \ 50 | --tmpdir=../OutApp/Temp/ --download.cache=../OutApp/Temp/ \ 51 | --download.mirror="https://npm.taobao.org/mirrors/electron/" 52 | ``` 53 | 54 | ## 运行 55 | 56 | 1. 解压全部文件 57 | 2. 找到 `MohuAPP.exe`(Windows) 或 `MohuAPP`(Linux) 或 `MohuAPP.app`(MacOS),双击运行 58 | 59 | ## 备注 60 | 61 | * 如果有bug,请尽快在[这里](https://github.com/Xmader/mohu/issues)向我反馈 62 | 63 | ## 更新历史 64 | 65 | [点我查看](update_history.md) 66 | 67 | ## 特别感谢 68 | 69 | > 本项目在开发过程中参考了以下项目或用户的部分源代码 70 | 71 | * [wikipedia-proxy](https://github.com/Xmader/wikipedia-proxy) (用于免fq访问中文维基百科) 72 | 73 | * [Hydrogen](https://github.com/Xmader/hydrogen/tree/linux) (参考了其landing页面) 74 | 75 | * [膜法指南 网页版](https://github.com/Xmader/mogicians_manual) (本项目内置了【膜法指南】网页版) 76 | 77 | * [乳包指南](https://github.com/Xmader/rubao_manual) (本项目内置了乳包指南) 78 | 79 | * [【膜法指南】安卓客户端](https://github.com/naco-siren/mogicians_manual_public_release) 80 | 81 | * [angry.im](https://angry.im/) (本项目使用了angry.im的续命API) 82 | 83 | * [@hahaxixi](https://github.com/hahaxixi) (本项目内置了他的三个小游戏) 84 | 85 | ## 开源许可证 86 | 87 | 本软件是一个完全免费的开源软件, 基于 MIT 协议开源。 88 | 89 | > 很惭愧,就做了一点微小的工作,谢谢大家 90 | -------------------------------------------------------------------------------- /app/assets/logo.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/assets/logo.icns -------------------------------------------------------------------------------- /app/assets/logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/assets/logo.ico -------------------------------------------------------------------------------- /app/assets/logo.pdn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/assets/logo.pdn -------------------------------------------------------------------------------- /app/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/assets/logo.png -------------------------------------------------------------------------------- /app/assets/mogicians_manual.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/assets/mogicians_manual.png -------------------------------------------------------------------------------- /app/assets/moha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/assets/moha.png -------------------------------------------------------------------------------- /app/assets/rubao_manual.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/assets/rubao_manual.jpg -------------------------------------------------------------------------------- /app/local_proxy/hosts.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "src": "www.mohu.club", 4 | "dst": "104.27.146.57" 5 | }, 6 | { 7 | "src": "www.mohu.tw", 8 | "dst": "104.27.146.83" 9 | }, 10 | { 11 | "src": "www.ruhu.ml", 12 | "dst": "104.28.3.22" 13 | }, 14 | { 15 | "src": "www.pin-cong.com", 16 | "dst": "104.27.147.183" 17 | }, 18 | { 19 | "regex": true, 20 | "src": "(www\\.)?pincong\\.rocks", 21 | "dst": "104.18.54.73" 22 | }, 23 | { 24 | "regex": true, 25 | "src": "(www\\.)?2049bbs\\.xyz", 26 | "dst": "45.77.134.176" 27 | }, 28 | { 29 | "regex": true, 30 | "src": "(.*\\.|)freewechat\\.com", 31 | "dst": "104.25.179.28" 32 | }, 33 | { 34 | "src": "rules.quantcount.com", 35 | "dst": "13.35.8.50" 36 | }, 37 | { 38 | "src": "ajax.googleapis.com", 39 | "dst": "ajax.proxy.ustclug.org" 40 | }, 41 | { 42 | "src": "progr.tk", 43 | "dst": "104.18.253.167" 44 | }, 45 | { 46 | "src": "cloudflare-ipfs.com", 47 | "dst": "104.18.253.167" 48 | }, 49 | { 50 | "src": "zh.wikipedia.org", 51 | "dst": "91.198.174.192" 52 | }, 53 | { 54 | "src": "zh.wikinews.org", 55 | "dst": "91.198.174.192" 56 | }, 57 | { 58 | "regex": true, 59 | "src": "(.+?)\\.github\\.io", 60 | "dst": "151.101.164.133" 61 | }, 62 | { 63 | "src": "raw.githubusercontent.com", 64 | "dst": "151.101.164.133" 65 | }, 66 | { 67 | "src": "assets-cdn.github.com", 68 | "dst": "151.101.164.133" 69 | }, 70 | { 71 | "src": "github.map.fastly.net", 72 | "dst": "151.101.164.133" 73 | }, 74 | { 75 | "regex": true, 76 | "src": "(.*\\.|)cnzz\\.com", 77 | "dst": "0.0.0.0" 78 | }, 79 | { 80 | "regex": true, 81 | "src": "(.*\\.|)googlesyndication\\.com", 82 | "dst": "0.0.0.0" 83 | }, 84 | { 85 | "regex": true, 86 | "src": "(.*\\.|)google-analytics\\.com", 87 | "dst": "0.0.0.0" 88 | }, 89 | { 90 | "regex": true, 91 | "src": "(.*\\.|)51\\.la", 92 | "dst": "0.0.0.0" 93 | }, 94 | { 95 | "regex": true, 96 | "src": "(.*\\.|)51yes\\.com", 97 | "dst": "0.0.0.0" 98 | }, 99 | { 100 | "regex": true, 101 | "src": "(.*\\.|)baidu\\.com", 102 | "dst": "0.0.0.0" 103 | }, 104 | { 105 | "src": "cpro.baidustatic.com", 106 | "dst": "0.0.0.0" 107 | }, 108 | { 109 | "src": "www.googletagservices.com", 110 | "dst": "203.208.41.89" 111 | }, 112 | { 113 | "regex": true, 114 | "src": "(.*\\.|)reddit\\.com", 115 | "dst": "151.101.1.140" 116 | }, 117 | { 118 | "regex": true, 119 | "src": "(.*\\.|)redditinc\\.com", 120 | "dst": "151.101.41.140" 121 | }, 122 | { 123 | "regex": true, 124 | "src": "(.*\\.|)redd\\.it", 125 | "dst": "151.101.41.140" 126 | }, 127 | { 128 | "regex": true, 129 | "src": "(.*\\.|)redditstatic\\.com", 130 | "dst": "151.101.41.140" 131 | }, 132 | { 133 | "regex": true, 134 | "src": "(.*\\.|)redditmedia\\.com", 135 | "dst": "151.101.41.140" 136 | } 137 | ] -------------------------------------------------------------------------------- /app/local_proxy/index.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs") 2 | const path = require("path") 3 | const socks = require("wikipedia-proxy") 4 | 5 | const HOSTS_FILE = path.join(__dirname, "hosts.json") 6 | 7 | let hosts = [] 8 | /* 9 | hosts 的结构是这样的: 10 | [ 11 | { 12 | regex: false, // 是否为正则表达式 13 | src: 'localhost', // 源 域名 / IP 14 | dst: '127.0.0.1' // 目的 域名 / IP 15 | }, 16 | 17 | // 这个例子将 www.mydomain.com 指向 www.google.com 18 | { 19 | regex: false, 20 | src: 'www.mydomain.com', 21 | dst: 'www.google.com' 22 | }, 23 | 24 | // 这个例子屏蔽站长统计 25 | { 26 | regex: true, // 正则表达式 27 | src: '(.*\\.|)cnzz\\.com', 28 | dst: '0.0.0.0' 29 | } 30 | ] 31 | */ 32 | 33 | const loadHosts = function (filename) { 34 | const text = fs.readFileSync(filename).toString().trim() 35 | if (!text.length) 36 | return 37 | hosts = JSON.parse(text) 38 | } 39 | 40 | // 当 hosts.json 发生改变时重新载入 41 | fs.watch(HOSTS_FILE, function () { 42 | loadHosts(HOSTS_FILE) 43 | }) 44 | 45 | loadHosts(HOSTS_FILE) 46 | 47 | const random = function (min, max) { 48 | return Math.floor(Math.random() * (max - min + 1) + min) 49 | } 50 | 51 | // 在 localhost 上运行一个 socks5 server 52 | exports.run = function (cb) { 53 | const host = "localhost" 54 | const port = random(20000, 30000) // 从这个范围内随机选一个端口 55 | 56 | const server = socks.run({ 57 | protocol: "socks5", 58 | host, 59 | port, 60 | silent: true, 61 | hostsConfig: hosts 62 | }) 63 | 64 | server.on("error", (err) => { 65 | cb(err) 66 | }) 67 | 68 | server.once("listening", () => { 69 | cb(null, host + ":" + port) 70 | }) 71 | } 72 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/debug/node.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./src/node'); 2 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/debug/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_from": "debug@=3.1.0", 3 | "_id": "debug@3.1.0", 4 | "_inBundle": false, 5 | "_integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 6 | "_location": "/debug", 7 | "_phantomChildren": {}, 8 | "_requested": { 9 | "type": "version", 10 | "registry": true, 11 | "raw": "debug@=3.1.0", 12 | "name": "debug", 13 | "escapedName": "debug", 14 | "rawSpec": "=3.1.0", 15 | "saveSpec": null, 16 | "fetchSpec": "=3.1.0" 17 | }, 18 | "_requiredBy": [ 19 | "/follow-redirects" 20 | ], 21 | "_resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 22 | "_shasum": "5bb5a0672628b64149566ba16819e61518c67261", 23 | "_spec": "debug@=3.1.0", 24 | "_where": "F:\\mohu\\app\\local_proxy\\node_modules\\follow-redirects", 25 | "author": { 26 | "name": "TJ Holowaychuk", 27 | "email": "tj@vision-media.ca" 28 | }, 29 | "browser": "./src/browser.js", 30 | "bugs": { 31 | "url": "https://github.com/visionmedia/debug/issues" 32 | }, 33 | "bundleDependencies": false, 34 | "contributors": [ 35 | { 36 | "name": "Nathan Rajlich", 37 | "email": "nathan@tootallnate.net", 38 | "url": "http://n8.io" 39 | }, 40 | { 41 | "name": "Andrew Rhyne", 42 | "email": "rhyneandrew@gmail.com" 43 | } 44 | ], 45 | "dependencies": { 46 | "ms": "2.0.0" 47 | }, 48 | "deprecated": false, 49 | "description": "small debugging utility", 50 | "devDependencies": { 51 | "browserify": "14.4.0", 52 | "chai": "^3.5.0", 53 | "concurrently": "^3.1.0", 54 | "coveralls": "^2.11.15", 55 | "eslint": "^3.12.1", 56 | "istanbul": "^0.4.5", 57 | "karma": "^1.3.0", 58 | "karma-chai": "^0.1.0", 59 | "karma-mocha": "^1.3.0", 60 | "karma-phantomjs-launcher": "^1.0.2", 61 | "karma-sinon": "^1.0.5", 62 | "mocha": "^3.2.0", 63 | "mocha-lcov-reporter": "^1.2.0", 64 | "rimraf": "^2.5.4", 65 | "sinon": "^1.17.6", 66 | "sinon-chai": "^2.8.0" 67 | }, 68 | "homepage": "https://github.com/visionmedia/debug#readme", 69 | "keywords": [ 70 | "debug", 71 | "log", 72 | "debugger" 73 | ], 74 | "license": "MIT", 75 | "main": "./src/index.js", 76 | "name": "debug", 77 | "repository": { 78 | "type": "git", 79 | "url": "git://github.com/visionmedia/debug.git" 80 | }, 81 | "version": "3.1.0" 82 | } 83 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/debug/src/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Detect Electron renderer process, which is node, but we should 3 | * treat as a browser. 4 | */ 5 | 6 | if (typeof process === 'undefined' || process.type === 'renderer') { 7 | module.exports = require('./browser.js'); 8 | } else { 9 | module.exports = require('./node.js'); 10 | } 11 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/eventemitter3/index.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Minimal `EventEmitter` interface that is molded against the Node.js 3 | * `EventEmitter` interface. 4 | */ 5 | declare class EventEmitter { 6 | static prefixed: string | boolean; 7 | 8 | /** 9 | * Return an array listing the events for which the emitter has registered 10 | * listeners. 11 | */ 12 | eventNames(): Array; 13 | 14 | /** 15 | * Return the listeners registered for a given event. 16 | */ 17 | listeners(event: EventTypes): Array; 18 | 19 | /** 20 | * Return the number of listeners listening to a given event. 21 | */ 22 | listenerCount(event: EventTypes): number; 23 | 24 | /** 25 | * Calls each of the listeners registered for a given event. 26 | */ 27 | emit(event: EventTypes, ...args: Array): boolean; 28 | 29 | /** 30 | * Add a listener for a given event. 31 | */ 32 | on(event: EventTypes, fn: EventEmitter.ListenerFn, context?: any): this; 33 | addListener(event: EventTypes, fn: EventEmitter.ListenerFn, context?: any): this; 34 | 35 | /** 36 | * Add a one-time listener for a given event. 37 | */ 38 | once(event: EventTypes, fn: EventEmitter.ListenerFn, context?: any): this; 39 | 40 | /** 41 | * Remove the listeners of a given event. 42 | */ 43 | removeListener(event: EventTypes, fn?: EventEmitter.ListenerFn, context?: any, once?: boolean): this; 44 | off(event: EventTypes, fn?: EventEmitter.ListenerFn, context?: any, once?: boolean): this; 45 | 46 | /** 47 | * Remove all listeners, or those of the specified event. 48 | */ 49 | removeAllListeners(event?: EventTypes): this; 50 | } 51 | 52 | declare namespace EventEmitter { 53 | export interface ListenerFn { 54 | (...args: Array): void; 55 | } 56 | 57 | export interface EventEmitterStatic { 58 | new(): EventEmitter; 59 | } 60 | 61 | export const EventEmitter: EventEmitterStatic; 62 | } 63 | 64 | export = EventEmitter; 65 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/eventemitter3/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_from": "eventemitter3@^3.0.0", 3 | "_id": "eventemitter3@3.1.0", 4 | "_inBundle": false, 5 | "_integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", 6 | "_location": "/eventemitter3", 7 | "_phantomChildren": {}, 8 | "_requested": { 9 | "type": "range", 10 | "registry": true, 11 | "raw": "eventemitter3@^3.0.0", 12 | "name": "eventemitter3", 13 | "escapedName": "eventemitter3", 14 | "rawSpec": "^3.0.0", 15 | "saveSpec": null, 16 | "fetchSpec": "^3.0.0" 17 | }, 18 | "_requiredBy": [ 19 | "/http-proxy" 20 | ], 21 | "_resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", 22 | "_shasum": "090b4d6cdbd645ed10bf750d4b5407942d7ba163", 23 | "_spec": "eventemitter3@^3.0.0", 24 | "_where": "F:\\mohu\\app\\local_proxy\\node_modules\\http-proxy", 25 | "author": { 26 | "name": "Arnout Kazemier" 27 | }, 28 | "bugs": { 29 | "url": "https://github.com/primus/eventemitter3/issues" 30 | }, 31 | "bundleDependencies": false, 32 | "deprecated": false, 33 | "description": "EventEmitter3 focuses on performance while maintaining a Node.js AND browser compatible interface.", 34 | "devDependencies": { 35 | "assume": "~1.5.0", 36 | "browserify": "~16.2.0", 37 | "mocha": "~5.1.0", 38 | "nyc": "~11.7.1", 39 | "pre-commit": "~1.2.0", 40 | "sauce-browsers": "~1.2.0", 41 | "sauce-test": "~1.3.3", 42 | "uglify-js": "~3.3.0" 43 | }, 44 | "files": [ 45 | "index.js", 46 | "index.d.ts", 47 | "umd" 48 | ], 49 | "homepage": "https://github.com/primus/eventemitter3#readme", 50 | "keywords": [ 51 | "EventEmitter", 52 | "EventEmitter2", 53 | "EventEmitter3", 54 | "Events", 55 | "addEventListener", 56 | "addListener", 57 | "emit", 58 | "emits", 59 | "emitter", 60 | "event", 61 | "once", 62 | "pub/sub", 63 | "publish", 64 | "reactor", 65 | "subscribe" 66 | ], 67 | "license": "MIT", 68 | "main": "index.js", 69 | "name": "eventemitter3", 70 | "repository": { 71 | "type": "git", 72 | "url": "git://github.com/primus/eventemitter3.git" 73 | }, 74 | "scripts": { 75 | "benchmark": "find benchmarks/run -name '*.js' -exec benchmarks/start.sh {} \\;", 76 | "browserify": "rm -rf umd && mkdir umd && browserify index.js -s EventEmitter3 -o umd/eventemitter3.js", 77 | "minify": "uglifyjs umd/eventemitter3.js --source-map -cm -o umd/eventemitter3.min.js", 78 | "prepublishOnly": "npm run browserify && npm run minify", 79 | "test": "nyc --reporter=html --reporter=text mocha test/test.js", 80 | "test-browser": "node test/browser.js" 81 | }, 82 | "typings": "index.d.ts", 83 | "version": "3.1.0" 84 | } 85 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/eventemitter3/umd/eventemitter3.min.js: -------------------------------------------------------------------------------- 1 | !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).EventEmitter3=e()}}(function(){return function i(s,f,c){function u(t,e){if(!f[t]){if(!s[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(a)return a(t,!0);var r=new Error("Cannot find module '"+t+"'");throw r.code="MODULE_NOT_FOUND",r}var o=f[t]={exports:{}};s[t][0].call(o.exports,function(e){return u(s[t][1][e]||e)},o,o.exports,i,s,f,c)}return f[t].exports}for(var a="function"==typeof require&&require,e=0;e=4.0" 60 | }, 61 | "files": [ 62 | "index.js", 63 | "create.js", 64 | "http.js", 65 | "https.js" 66 | ], 67 | "homepage": "https://github.com/olalonde/follow-redirects", 68 | "keywords": [ 69 | "http", 70 | "https", 71 | "url", 72 | "redirect", 73 | "client", 74 | "location", 75 | "utility" 76 | ], 77 | "license": "MIT", 78 | "main": "index.js", 79 | "name": "follow-redirects", 80 | "nyc": { 81 | "reporter": [ 82 | "lcov", 83 | "text" 84 | ] 85 | }, 86 | "repository": { 87 | "type": "git", 88 | "url": "git+ssh://git@github.com/olalonde/follow-redirects.git" 89 | }, 90 | "scripts": { 91 | "lint": "eslint *.js test", 92 | "mocha": "nyc mocha", 93 | "test": "npm run lint && npm run mocha" 94 | }, 95 | "version": "1.5.9" 96 | } 97 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/http-proxy/index.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Caron dimonio, con occhi di bragia 3 | * loro accennando, tutte le raccoglie; 4 | * batte col remo qualunque s’adagia 5 | * 6 | * Charon the demon, with the eyes of glede, 7 | * Beckoning to them, collects them all together, 8 | * Beats with his oar whoever lags behind 9 | * 10 | * Dante - The Divine Comedy (Canto III) 11 | */ 12 | 13 | module.exports = require('./lib/http-proxy'); -------------------------------------------------------------------------------- /app/local_proxy/node_modules/http-proxy/lib/http-proxy.js: -------------------------------------------------------------------------------- 1 | // Use explicit /index.js to help browserify negociation in require '/lib/http-proxy' (!) 2 | var ProxyServer = require('./http-proxy/index.js').Server; 3 | 4 | 5 | /** 6 | * Creates the proxy server. 7 | * 8 | * Examples: 9 | * 10 | * httpProxy.createProxyServer({ .. }, 8000) 11 | * // => '{ web: [Function], ws: [Function] ... }' 12 | * 13 | * @param {Object} Options Config object passed to the proxy 14 | * 15 | * @return {Object} Proxy Proxy object with handlers for `ws` and `web` requests 16 | * 17 | * @api public 18 | */ 19 | 20 | 21 | function createProxyServer(options) { 22 | /* 23 | * `options` is needed and it must have the following layout: 24 | * 25 | * { 26 | * target : 27 | * forward: 28 | * agent : 29 | * ssl : 30 | * ws : 31 | * xfwd : 32 | * secure : 33 | * toProxy: 34 | * prependPath: 35 | * ignorePath: 36 | * localAddress : 37 | * changeOrigin: 38 | * preserveHeaderKeyCase: 39 | * auth : Basic authentication i.e. 'user:password' to compute an Authorization header. 40 | * hostRewrite: rewrites the location hostname on (301/302/307/308) redirects, Default: null. 41 | * autoRewrite: rewrites the location host/port on (301/302/307/308) redirects based on requested host/port. Default: false. 42 | * protocolRewrite: rewrites the location protocol on (301/302/307/308) redirects to 'http' or 'https'. Default: null. 43 | * } 44 | * 45 | * NOTE: `options.ws` and `options.ssl` are optional. 46 | * `options.target and `options.forward` cannot be 47 | * both missing 48 | * } 49 | */ 50 | 51 | return new ProxyServer(options); 52 | } 53 | 54 | 55 | ProxyServer.createProxyServer = createProxyServer; 56 | ProxyServer.createServer = createProxyServer; 57 | ProxyServer.createProxy = createProxyServer; 58 | 59 | 60 | 61 | 62 | /** 63 | * Export the proxy "Server" as the main export. 64 | */ 65 | module.exports = ProxyServer; 66 | 67 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/http-proxy/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_from": "http-proxy@^1.17.0", 3 | "_id": "http-proxy@1.17.0", 4 | "_inBundle": false, 5 | "_integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", 6 | "_location": "/http-proxy", 7 | "_phantomChildren": {}, 8 | "_requested": { 9 | "type": "range", 10 | "registry": true, 11 | "raw": "http-proxy@^1.17.0", 12 | "name": "http-proxy", 13 | "escapedName": "http-proxy", 14 | "rawSpec": "^1.17.0", 15 | "saveSpec": null, 16 | "fetchSpec": "^1.17.0" 17 | }, 18 | "_requiredBy": [ 19 | "/wikipedia-proxy" 20 | ], 21 | "_resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", 22 | "_shasum": "7ad38494658f84605e2f6db4436df410f4e5be9a", 23 | "_spec": "http-proxy@^1.17.0", 24 | "_where": "F:\\mohu\\app\\local_proxy\\node_modules\\wikipedia-proxy", 25 | "author": { 26 | "name": "Charlie Robbins", 27 | "email": "charlie.robbins@gmail.com" 28 | }, 29 | "bugs": { 30 | "url": "https://github.com/nodejitsu/node-http-proxy/issues" 31 | }, 32 | "bundleDependencies": false, 33 | "dependencies": { 34 | "eventemitter3": "^3.0.0", 35 | "follow-redirects": "^1.0.0", 36 | "requires-port": "^1.0.0" 37 | }, 38 | "deprecated": false, 39 | "description": "HTTP proxying for the masses", 40 | "devDependencies": { 41 | "async": "^2.0.0", 42 | "concat-stream": "^1.6.2", 43 | "expect.js": "~0.3.1", 44 | "mocha": "^3.5.3", 45 | "nyc": "^11.7.1", 46 | "semver": "^5.0.3", 47 | "socket.io": "^2.1.0", 48 | "socket.io-client": "^2.1.0", 49 | "sse": "0.0.6", 50 | "ws": "^0.8.0" 51 | }, 52 | "engines": { 53 | "node": ">=4.0.0" 54 | }, 55 | "homepage": "https://github.com/nodejitsu/node-http-proxy#readme", 56 | "license": "MIT", 57 | "main": "index.js", 58 | "maintainers": [ 59 | { 60 | "name": "jcrugzz", 61 | "email": "jcrugzz@gmail.com" 62 | } 63 | ], 64 | "name": "http-proxy", 65 | "repository": { 66 | "type": "git", 67 | "url": "git+https://github.com/nodejitsu/node-http-proxy.git" 68 | }, 69 | "scripts": { 70 | "mocha": "mocha test/*-test.js", 71 | "test": "nyc --reporter=text --reporter=lcov npm run mocha" 72 | }, 73 | "version": "1.17.0" 74 | } 75 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/ms/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Helpers. 3 | */ 4 | 5 | var s = 1000; 6 | var m = s * 60; 7 | var h = m * 60; 8 | var d = h * 24; 9 | var y = d * 365.25; 10 | 11 | /** 12 | * Parse or format the given `val`. 13 | * 14 | * Options: 15 | * 16 | * - `long` verbose formatting [false] 17 | * 18 | * @param {String|Number} val 19 | * @param {Object} [options] 20 | * @throws {Error} throw an error if val is not a non-empty string or a number 21 | * @return {String|Number} 22 | * @api public 23 | */ 24 | 25 | module.exports = function(val, options) { 26 | options = options || {}; 27 | var type = typeof val; 28 | if (type === 'string' && val.length > 0) { 29 | return parse(val); 30 | } else if (type === 'number' && isNaN(val) === false) { 31 | return options.long ? fmtLong(val) : fmtShort(val); 32 | } 33 | throw new Error( 34 | 'val is not a non-empty string or a valid number. val=' + 35 | JSON.stringify(val) 36 | ); 37 | }; 38 | 39 | /** 40 | * Parse the given `str` and return milliseconds. 41 | * 42 | * @param {String} str 43 | * @return {Number} 44 | * @api private 45 | */ 46 | 47 | function parse(str) { 48 | str = String(str); 49 | if (str.length > 100) { 50 | return; 51 | } 52 | var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( 53 | str 54 | ); 55 | if (!match) { 56 | return; 57 | } 58 | var n = parseFloat(match[1]); 59 | var type = (match[2] || 'ms').toLowerCase(); 60 | switch (type) { 61 | case 'years': 62 | case 'year': 63 | case 'yrs': 64 | case 'yr': 65 | case 'y': 66 | return n * y; 67 | case 'days': 68 | case 'day': 69 | case 'd': 70 | return n * d; 71 | case 'hours': 72 | case 'hour': 73 | case 'hrs': 74 | case 'hr': 75 | case 'h': 76 | return n * h; 77 | case 'minutes': 78 | case 'minute': 79 | case 'mins': 80 | case 'min': 81 | case 'm': 82 | return n * m; 83 | case 'seconds': 84 | case 'second': 85 | case 'secs': 86 | case 'sec': 87 | case 's': 88 | return n * s; 89 | case 'milliseconds': 90 | case 'millisecond': 91 | case 'msecs': 92 | case 'msec': 93 | case 'ms': 94 | return n; 95 | default: 96 | return undefined; 97 | } 98 | } 99 | 100 | /** 101 | * Short format for `ms`. 102 | * 103 | * @param {Number} ms 104 | * @return {String} 105 | * @api private 106 | */ 107 | 108 | function fmtShort(ms) { 109 | if (ms >= d) { 110 | return Math.round(ms / d) + 'd'; 111 | } 112 | if (ms >= h) { 113 | return Math.round(ms / h) + 'h'; 114 | } 115 | if (ms >= m) { 116 | return Math.round(ms / m) + 'm'; 117 | } 118 | if (ms >= s) { 119 | return Math.round(ms / s) + 's'; 120 | } 121 | return ms + 'ms'; 122 | } 123 | 124 | /** 125 | * Long format for `ms`. 126 | * 127 | * @param {Number} ms 128 | * @return {String} 129 | * @api private 130 | */ 131 | 132 | function fmtLong(ms) { 133 | return plural(ms, d, 'day') || 134 | plural(ms, h, 'hour') || 135 | plural(ms, m, 'minute') || 136 | plural(ms, s, 'second') || 137 | ms + ' ms'; 138 | } 139 | 140 | /** 141 | * Pluralization helper. 142 | */ 143 | 144 | function plural(ms, n, name) { 145 | if (ms < n) { 146 | return; 147 | } 148 | if (ms < n * 1.5) { 149 | return Math.floor(ms / n) + ' ' + name; 150 | } 151 | return Math.ceil(ms / n) + ' ' + name + 's'; 152 | } 153 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/ms/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_from": "ms@2.0.0", 3 | "_id": "ms@2.0.0", 4 | "_inBundle": false, 5 | "_integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 6 | "_location": "/ms", 7 | "_phantomChildren": {}, 8 | "_requested": { 9 | "type": "version", 10 | "registry": true, 11 | "raw": "ms@2.0.0", 12 | "name": "ms", 13 | "escapedName": "ms", 14 | "rawSpec": "2.0.0", 15 | "saveSpec": null, 16 | "fetchSpec": "2.0.0" 17 | }, 18 | "_requiredBy": [ 19 | "/debug" 20 | ], 21 | "_resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 22 | "_shasum": "5608aeadfc00be6c2901df5f9861788de0d597c8", 23 | "_spec": "ms@2.0.0", 24 | "_where": "F:\\mohu\\app\\local_proxy\\node_modules\\debug", 25 | "bugs": { 26 | "url": "https://github.com/zeit/ms/issues" 27 | }, 28 | "bundleDependencies": false, 29 | "deprecated": false, 30 | "description": "Tiny milisecond conversion utility", 31 | "devDependencies": { 32 | "eslint": "3.19.0", 33 | "expect.js": "0.3.1", 34 | "husky": "0.13.3", 35 | "lint-staged": "3.4.1", 36 | "mocha": "3.4.1" 37 | }, 38 | "eslintConfig": { 39 | "extends": "eslint:recommended", 40 | "env": { 41 | "node": true, 42 | "es6": true 43 | } 44 | }, 45 | "files": [ 46 | "index.js" 47 | ], 48 | "homepage": "https://github.com/zeit/ms#readme", 49 | "license": "MIT", 50 | "lint-staged": { 51 | "*.js": [ 52 | "npm run lint", 53 | "prettier --single-quote --write", 54 | "git add" 55 | ] 56 | }, 57 | "main": "./index", 58 | "name": "ms", 59 | "repository": { 60 | "type": "git", 61 | "url": "git+https://github.com/zeit/ms.git" 62 | }, 63 | "scripts": { 64 | "lint": "eslint lib/* bin/*", 65 | "precommit": "lint-staged", 66 | "test": "mocha tests.js" 67 | }, 68 | "version": "2.0.0" 69 | } 70 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/requires-port/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Check if we're required to add a port number. 5 | * 6 | * @see https://url.spec.whatwg.org/#default-port 7 | * @param {Number|String} port Port number we need to check 8 | * @param {String} protocol Protocol we need to check against. 9 | * @returns {Boolean} Is it a default port for the given protocol 10 | * @api private 11 | */ 12 | module.exports = function required(port, protocol) { 13 | protocol = protocol.split(':')[0]; 14 | port = +port; 15 | 16 | if (!port) return false; 17 | 18 | switch (protocol) { 19 | case 'http': 20 | case 'ws': 21 | return port !== 80; 22 | 23 | case 'https': 24 | case 'wss': 25 | return port !== 443; 26 | 27 | case 'ftp': 28 | return port !== 21; 29 | 30 | case 'gopher': 31 | return port !== 70; 32 | 33 | case 'file': 34 | return false; 35 | } 36 | 37 | return port !== 0; 38 | }; 39 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/requires-port/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_from": "requires-port@^1.0.0", 3 | "_id": "requires-port@1.0.0", 4 | "_inBundle": false, 5 | "_integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", 6 | "_location": "/requires-port", 7 | "_phantomChildren": {}, 8 | "_requested": { 9 | "type": "range", 10 | "registry": true, 11 | "raw": "requires-port@^1.0.0", 12 | "name": "requires-port", 13 | "escapedName": "requires-port", 14 | "rawSpec": "^1.0.0", 15 | "saveSpec": null, 16 | "fetchSpec": "^1.0.0" 17 | }, 18 | "_requiredBy": [ 19 | "/http-proxy" 20 | ], 21 | "_resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 22 | "_shasum": "925d2601d39ac485e091cf0da5c6e694dc3dcaff", 23 | "_spec": "requires-port@^1.0.0", 24 | "_where": "F:\\mohu\\app\\local_proxy\\node_modules\\http-proxy", 25 | "author": { 26 | "name": "Arnout Kazemier" 27 | }, 28 | "bugs": { 29 | "url": "https://github.com/unshiftio/requires-port/issues" 30 | }, 31 | "bundleDependencies": false, 32 | "deprecated": false, 33 | "description": "Check if a protocol requires a certain port number to be added to an URL.", 34 | "devDependencies": { 35 | "assume": "1.3.x", 36 | "istanbul": "0.4.x", 37 | "mocha": "2.3.x", 38 | "pre-commit": "1.1.x" 39 | }, 40 | "homepage": "https://github.com/unshiftio/requires-port", 41 | "keywords": [ 42 | "port", 43 | "require", 44 | "http", 45 | "https", 46 | "ws", 47 | "wss", 48 | "gopher", 49 | "file", 50 | "ftp", 51 | "requires", 52 | "requried", 53 | "portnumber", 54 | "url", 55 | "parsing", 56 | "validation", 57 | "cows" 58 | ], 59 | "license": "MIT", 60 | "main": "index.js", 61 | "name": "requires-port", 62 | "repository": { 63 | "type": "git", 64 | "url": "git+https://github.com/unshiftio/requires-port.git" 65 | }, 66 | "scripts": { 67 | "100%": "istanbul check-coverage --statements 100 --functions 100 --lines 100 --branches 100", 68 | "coverage": "istanbul cover _mocha -- test.js", 69 | "test": "mocha test.js", 70 | "test-travis": "istanbul cover _mocha --report lcovonly -- test.js", 71 | "watch": "mocha --watch test.js" 72 | }, 73 | "version": "1.0.0" 74 | } 75 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/requires-port/test.js: -------------------------------------------------------------------------------- 1 | describe('requires-port', function () { 2 | 'use strict'; 3 | 4 | var assume = require('assume') 5 | , required = require('./'); 6 | 7 | it('is exported as a function', function () { 8 | assume(required).is.a('function'); 9 | }); 10 | 11 | it('does not require empty ports', function () { 12 | assume(required('', 'http')).false(); 13 | assume(required('', 'wss')).false(); 14 | assume(required('', 'ws')).false(); 15 | assume(required('', 'cowsack')).false(); 16 | }); 17 | 18 | it('assumes true for unknown protocols',function () { 19 | assume(required('808', 'foo')).true(); 20 | assume(required('80', 'bar')).true(); 21 | }); 22 | 23 | it('never requires port numbers for file', function () { 24 | assume(required(8080, 'file')).false(); 25 | }); 26 | 27 | it('does not require port 80 for http', function () { 28 | assume(required('80', 'http')).false(); 29 | assume(required(80, 'http')).false(); 30 | assume(required(80, 'http://')).false(); 31 | assume(required(80, 'http://www.google.com')).false(); 32 | 33 | assume(required('8080', 'http')).true(); 34 | assume(required(8080, 'http')).true(); 35 | assume(required(8080, 'http://')).true(); 36 | assume(required(8080, 'http://www.google.com')).true(); 37 | }); 38 | 39 | it('does not require port 80 for ws', function () { 40 | assume(required('80', 'ws')).false(); 41 | assume(required(80, 'ws')).false(); 42 | assume(required(80, 'ws://')).false(); 43 | assume(required(80, 'ws://www.google.com')).false(); 44 | 45 | assume(required('8080', 'ws')).true(); 46 | assume(required(8080, 'ws')).true(); 47 | assume(required(8080, 'ws://')).true(); 48 | assume(required(8080, 'ws://www.google.com')).true(); 49 | }); 50 | 51 | it('does not require port 443 for https', function () { 52 | assume(required('443', 'https')).false(); 53 | assume(required(443, 'https')).false(); 54 | assume(required(443, 'https://')).false(); 55 | assume(required(443, 'https://www.google.com')).false(); 56 | 57 | assume(required('8080', 'https')).true(); 58 | assume(required(8080, 'https')).true(); 59 | assume(required(8080, 'https://')).true(); 60 | assume(required(8080, 'https://www.google.com')).true(); 61 | }); 62 | 63 | it('does not require port 443 for wss', function () { 64 | assume(required('443', 'wss')).false(); 65 | assume(required(443, 'wss')).false(); 66 | assume(required(443, 'wss://')).false(); 67 | assume(required(443, 'wss://www.google.com')).false(); 68 | 69 | assume(required('8080', 'wss')).true(); 70 | assume(required(8080, 'wss')).true(); 71 | assume(required(8080, 'wss://')).true(); 72 | assume(required(8080, 'wss://www.google.com')).true(); 73 | }); 74 | 75 | it('does not require port 21 for ftp', function () { 76 | assume(required('21', 'ftp')).false(); 77 | assume(required(21, 'ftp')).false(); 78 | assume(required(21, 'ftp://')).false(); 79 | assume(required(21, 'ftp://www.google.com')).false(); 80 | 81 | assume(required('8080', 'ftp')).true(); 82 | assume(required(8080, 'ftp')).true(); 83 | assume(required(8080, 'ftp://')).true(); 84 | assume(required(8080, 'ftp://www.google.com')).true(); 85 | }); 86 | 87 | it('does not require port 70 for gopher', function () { 88 | assume(required('70', 'gopher')).false(); 89 | assume(required(70, 'gopher')).false(); 90 | assume(required(70, 'gopher://')).false(); 91 | assume(required(70, 'gopher://www.google.com')).false(); 92 | 93 | assume(required('8080', 'gopher')).true(); 94 | assume(required(8080, 'gopher')).true(); 95 | assume(required(8080, 'gopher://')).true(); 96 | assume(required(8080, 'gopher://www.google.com')).true(); 97 | }); 98 | }); 99 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2014 Brian White. All rights reserved. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to 5 | deal in the Software without restriction, including without limitation the 6 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 7 | sell copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19 | IN THE SOFTWARE. -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/index.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'), 2 | path = require('path'); 3 | 4 | ['server', 'client', 'Agents'].forEach(function(f) { 5 | var exp = require(__dirname + '/lib/' + f), 6 | keys = Object.keys(exp); 7 | for (var i = 0, len = keys.length; i < len; ++i) 8 | exports[keys[i]] = exp[keys[i]]; 9 | }); 10 | 11 | exports.auth = {}; 12 | 13 | fs.readdirSync(__dirname + '/lib/auth').forEach(function(f) { 14 | exports.auth[path.basename(f, '.js')] = require(__dirname + '/lib/auth/' + f); 15 | }); -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/lib/auth/None.js: -------------------------------------------------------------------------------- 1 | module.exports = function NoneAuthHandlers() { 2 | return { 3 | METHOD: 0x00, 4 | server: function serverHandler(stream, cb) { 5 | cb(true); 6 | }, 7 | client: function clientHandler(stream, cb) { 8 | cb(true); 9 | } 10 | }; 11 | }; 12 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/lib/constants.js: -------------------------------------------------------------------------------- 1 | exports.CMD = { 2 | CONNECT: 0x01, 3 | BIND: 0x02, 4 | UDP: 0x03 5 | }; 6 | 7 | exports.ATYP = { 8 | IPv4: 0x01, 9 | NAME: 0x03, 10 | IPv6: 0x04 11 | }; 12 | 13 | exports.REP = { 14 | SUCCESS: 0x00, 15 | GENFAIL: 0x01, 16 | DISALLOW: 0x02, 17 | NETUNREACH: 0x03, 18 | HOSTUNREACH: 0x04, 19 | CONNREFUSED: 0x05, 20 | TTLEXPIRED: 0x06, 21 | CMDUNSUPP: 0x07, 22 | ATYPUNSUPP: 0x08 23 | }; 24 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/lib/utils.js: -------------------------------------------------------------------------------- 1 | var net = require('net'), 2 | ipv6 = require('ipv6').v6; 3 | 4 | exports.ipbytes = function(str) { 5 | var type = net.isIP(str), 6 | nums, 7 | bytes, 8 | i; 9 | 10 | if (type === 4) { 11 | nums = str.split('.', 4); 12 | bytes = new Array(4); 13 | for (i = 0; i < 4; ++i) { 14 | if (isNaN(bytes[i] = +nums[i])) 15 | throw new Error('Error parsing IP: ' + str); 16 | } 17 | } else if (type === 6) { 18 | var addr = new ipv6.Address(str), 19 | b = 0, 20 | group; 21 | if (!addr.valid) 22 | throw new Error('Error parsing IP: ' + str); 23 | nums = addr.parsedAddress; 24 | bytes = new Array(16); 25 | for (i = 0; i < 8; ++i, b += 2) { 26 | group = parseInt(nums[i], 16); 27 | bytes[b] = group >>> 8; 28 | bytes[b + 1] = group & 0xFF; 29 | } 30 | } 31 | 32 | return bytes; 33 | }; 34 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/.npmignore: -------------------------------------------------------------------------------- 1 | */*.swp 2 | node_modules 3 | npm-debug.log 4 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 0.6 4 | - 0.8 5 | - 0.10 6 | - 0.11 7 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (C) 2011 by Beau Gunderson 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/README.md: -------------------------------------------------------------------------------- 1 | javascript-ipv6 [![Build Status](https://secure.travis-ci.org/beaugunderson/javascript-ipv6.png?branch=master)](http://travis-ci.org/beaugunderson/javascript-ipv6) 2 | =============== 3 | 4 | javascript-ipv6 is a library for manipulating IPv6 addresses in JavaScript. 5 | 6 | Examples 7 | -------- 8 | 9 | For node: 10 | 11 | ```js 12 | var v6 = require('ipv6').v6; 13 | 14 | var address = new v6.Address('2001:0:ce49:7601:e866:efff:62c3:fffe'); 15 | 16 | console.log(address.isValid()); // Prints "true" 17 | 18 | var teredo = address.teredo(); 19 | 20 | console.log(teredo.client4); // Prints "157.60.0.1" 21 | ``` 22 | 23 | For a browser: 24 | 25 | ```html 26 | 27 | 28 | 29 | Simple IPv6 test 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 47 | 48 | 49 | 50 | The canonical form of a::b is: 51 | 52 | 53 | ``` 54 | 55 | Current functionality 56 | --------------------- 57 | 58 | - Parsing of most IPv6 notations 59 | - Parsing of IPv6 Addresses and Ports from URLs with `v6.Address.fromURL(url)` 60 | - Validity checking 61 | - Decoding of the [Teredo information](http://en.wikipedia.org/wiki/Teredo_tunneling#IPv6_addressing) in an address 62 | - Whether one address is a valid subnet of another 63 | - What special properties a given address has (multicast prefix, unique local address prefix, etc.) 64 | - Number of subnets of a certain size in a given address 65 | - Display methods 66 | - Hex, binary, and decimal 67 | - Canonical form 68 | - Correct form 69 | - IPv4-compatible (i.e. `::ffff:192.168.0.1`) 70 | - Works in [node.js](http://nodejs.org/) and the browser 71 | - Unit tests with [node.js](http://nodejs.org/) and [Mocha](http://visionmedia.github.com/mocha/) 72 | 73 | Used by 74 | ------- 75 | 76 | - [Rackspace](http://www.rackspace.com/) in [node-swiz](https://github.com/racker/node-swiz) 77 | - [node-socksified](https://github.com/vially/node-socksified) 78 | 79 | Future functionality 80 | -------------------- 81 | 82 | - Investigate `procstreams` for the CLI tool 83 | - Base 64/85 encoding? 84 | - Reverse lookups? (Whether a domain name has IPv6 glue) 85 | 86 | TODO 87 | ---- 88 | 89 | - Documentation 90 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/bin/ipv6.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var v6 = require('../ipv6.js').v6; 4 | var v4 = require('../ipv6.js').v4; 5 | 6 | var sprintf = require('sprintf').sprintf; 7 | var cli = require('cli'); 8 | var cliff = require('cliff'); 9 | 10 | var options = cli.parse(); 11 | 12 | var rows = [['Address', 'Valid', 'Correct Form', 'Canonical Form']]; 13 | 14 | cli.withStdinLines(function(lines, newline) { 15 | for (var i = 0; i < lines.length; i++) { 16 | if (lines[i] == '') { 17 | continue; 18 | } 19 | 20 | var address = new v6.Address(lines[i]); 21 | 22 | if (options.v) { 23 | this.output(sprintf('%s = %s\n', lines[i], cliff.inspect(address))); 24 | } else if (options.c) { 25 | rows.push([ 26 | lines[i], 27 | address.isValid() ? 'Yes' : 'No'.red, 28 | address.isValid() ? address.correctForm() : '', 29 | address.isValid() ? address.canonicalForm() : '' 30 | ]); 31 | } else { 32 | this.output(sprintf('%s,%s\n', lines[i], address.isValid() ? 'valid' : 'invalid')); 33 | } 34 | } 35 | 36 | if (options.c) { 37 | console.log(cliff.stringifyRows(rows, ['green', 'green', 'green', 'green'])); 38 | } 39 | }); 40 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/bin/ipv6grep.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var v6 = require('../ipv6.js').v6; 4 | var v4 = require('../ipv6.js').v4; 5 | 6 | var sprintf = require('sprintf').sprintf; 7 | var cli = require('cli'); 8 | var cliff = require('cliff'); 9 | 10 | var util = require('util'); 11 | var spawn = require('child_process').spawn; 12 | 13 | cli.enable('version', 'status', 'glob'); 14 | 15 | cli.parse({ 16 | all: ['a', 'Find all addresses'], 17 | validate: ['v', 'Validate found addresses'], 18 | substring: ['s', 'Substring match'] 19 | }); 20 | 21 | cli.debug('script: ' + process.ARGV[1]); 22 | 23 | cli.main(function(args, options) { 24 | cli.debug('args: ' + util.inspect(args)); 25 | cli.debug('options: ' + util.inspect(options)); 26 | 27 | var grepArguments = ['-E', '-n', '--color=always']; 28 | var stdin = false; 29 | 30 | if (args.length == 0 && options.all) { 31 | // STDIN with all addresses 32 | grepArguments.push('ADDRESS'); 33 | stdin = true; 34 | } else if (args.length == 1) { 35 | // STDIN 36 | var address = new v6.Address(new v6.Address(args[0]).correctForm()); 37 | var regex = address.regularExpressionString(options.substring); 38 | 39 | cli.debug('address: ' + util.inspect(address.regularExpression())); 40 | 41 | grepArguments.push(regex); 42 | stdin = true; 43 | } else if (args.length > 1) { 44 | // filename 45 | var address = new v6.Address(new v6.Address(args[0]).correctForm()); 46 | var regex = address.regularExpressionString(options.substring); 47 | 48 | var files = args.slice(1, args.length); 49 | 50 | cli.debug('address: ' + util.inspect(address.regularExpression())); 51 | cli.debug('files: ' + util.inspect(files)); 52 | 53 | grepArguments = grepArguments.concat(regex, files) 54 | } 55 | 56 | cli.debug('grep arguments: ' + util.inspect(grepArguments)); 57 | 58 | if (!stdin) { 59 | var grep = spawn('grep', grepArguments); 60 | 61 | grep.stdout.on('data', function (data) { 62 | console.log(String(data).trim()); 63 | }); 64 | 65 | grep.on('exit', function (code) { 66 | cli.debug('grep exited: ' + code); 67 | }); 68 | 69 | //grep.stdin.end(); 70 | } 71 | 72 | //cli.withStdinLines(function(lines, newline) { 73 | //}); 74 | }); 75 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/examples/browser/simple.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Simple IPv6 test 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 24 | 25 | 26 | 27 | The canonical form of a::b is: 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/examples/node/simple.js: -------------------------------------------------------------------------------- 1 | var v6 = require('ipv6').v6; 2 | 3 | var address = new v6.Address('a::b'); 4 | 5 | console.log(address.canonicalForm()); 6 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/index.js: -------------------------------------------------------------------------------- 1 | exports = module.exports = require('./ipv6.js'); -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/node_modules/sprintf/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/node_modules/sprintf/README.md: -------------------------------------------------------------------------------- 1 | # sprintf() for node 2 | 3 | ## Disclaimer 4 | 5 | This was originally just an adoption of a browser library to node.js. 6 | Since that library is now itself a node.js module, you should check that out: [alexei/sprintf.js](https://github.com/alexei/sprintf.js) 7 | 8 | There is also a [built-in util.format](http://nodejs.org/api/util.html#util_util_format_format). 9 | 10 | 11 | ## Install 12 | 13 | npm install sprintf 14 | 15 | 16 | ## How to 17 | 18 | Works exactly like http://www.diveintojavascript.com/projects/javascript-sprintf, except that it exports those two functions: 19 | 20 | sprintf = require('sprintf').sprintf; 21 | vsprintf = require('sprintf').vsprintf; 22 | 23 | Have fun! 24 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/node_modules/sprintf/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sprintf", 3 | "version": "0.1.3", 4 | "engines": { 5 | "node": ">=0.2.4" 6 | }, 7 | "author": { 8 | "name": "Moritz Peters" 9 | }, 10 | "directories": { 11 | "lib": "./lib" 12 | }, 13 | "description": "Sprintf() for node.js", 14 | "main": "./lib/sprintf", 15 | "homepage": "https://github.com/maritz/node-sprintf", 16 | "repository": { 17 | "type": "git", 18 | "url": "https://github.com/maritz/node-sprintf.git" 19 | }, 20 | "scripts": { 21 | "test": "nodeunit test/function-export.js" 22 | }, 23 | "devDependencies": { 24 | "nodeunit": "0.8.0" 25 | }, 26 | "bugs": { 27 | "url": "https://github.com/maritz/node-sprintf/issues" 28 | }, 29 | "_id": "sprintf@0.1.3", 30 | "dist": { 31 | "shasum": "530fc31405d47422f6edb40f29bdafac599ede11", 32 | "tarball": "http://registry.npmjs.org/sprintf/-/sprintf-0.1.3.tgz" 33 | }, 34 | "_from": "sprintf@0.1.x", 35 | "_npmVersion": "1.3.8", 36 | "_npmUser": { 37 | "name": "maritz", 38 | "email": "maritz.peters@gmail.com" 39 | }, 40 | "maintainers": [ 41 | { 42 | "name": "maritz", 43 | "email": "moritz@mpeters.biz" 44 | } 45 | ], 46 | "_shasum": "530fc31405d47422f6edb40f29bdafac599ede11", 47 | "_resolved": "https://registry.npmjs.org/sprintf/-/sprintf-0.1.3.tgz" 48 | } 49 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/node_modules/sprintf/test/function-export.js: -------------------------------------------------------------------------------- 1 | var sprintf = require(__dirname + '/..'); 2 | 3 | exports['sprintf() export works'] = function(test) { 4 | test.equal(sprintf('Hallo %s!', 'Welt'), 'Hallo Welt!'); 5 | test.equal(sprintf.sprintf('Hallo %s!', 'Welt'), 'Hallo Welt!'); 6 | test.equal(sprintf.vsprintf('Hallo %s!', ['Welt']), 'Hallo Welt!'); 7 | 8 | test.done(); 9 | }; 10 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/test/data/invalid-ipv4-addresses.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "address": " 127.0.0.1", 4 | "conditions": [] 5 | }, 6 | { 7 | "address": "127.0.0.1 ", 8 | "conditions": [] 9 | }, 10 | { 11 | "address": "127.0.0.1 127.0.0.1", 12 | "conditions": [] 13 | }, 14 | { 15 | "address": "127.0.0.256", 16 | "conditions": [] 17 | }, 18 | { 19 | "address": "127.0.0.1//1", 20 | "conditions": [] 21 | }, 22 | { 23 | "address": "127.0.0.1/0x1", 24 | "conditions": [] 25 | }, 26 | { 27 | "address": "127.0.0.1/-1", 28 | "conditions": [] 29 | }, 30 | { 31 | "address": "127.0.0.1/ab", 32 | "conditions": [] 33 | }, 34 | { 35 | "address": "127.0.0.1/", 36 | "conditions": [] 37 | }, 38 | { 39 | "address": "127.0.0.256/32", 40 | "conditions": [] 41 | }, 42 | { 43 | "address": "127.0.0.1/33", 44 | "conditions": [] 45 | } 46 | ] 47 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/test/data/valid-ipv4-addresses.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "address": "001.002.003.004", 4 | "conditions": ["incorrect-ipv4"] 5 | }, 6 | { 7 | "address": "127.0.0.1", 8 | "conditions": ["correct-ipv4"] 9 | }, 10 | { 11 | "address": "127.0.0.1/02", 12 | "conditions": ["incorrect-ipv4"] 13 | }, 14 | { 15 | "address": "127.0.0.1/32", 16 | "conditions": ["correct-ipv4"] 17 | }, 18 | { 19 | "address": "255.255.255.255/32", 20 | "conditions": ["correct-ipv4"] 21 | } 22 | ] 23 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/test/unused/grep-test.txt: -------------------------------------------------------------------------------- 1 | a::b 2 | a::b2 3 | a::b testing 4 | http://[a::b]:80 testing 5 | a::b2 testing2 6 | 000a::000b 7 | b::c 8 | b::c2 9 | a:0:0:0:0:0:0:b 10 | 2001:db8:0:0:1:0:0:1 11 | 2001:0db8:0:0:1:0:0:1 12 | 2001:db8::1:0:0:1 13 | 2001:db8::0:1:0:0:1 14 | 2001:0db8::1:0:0:1 15 | 2001:db8:0:0:1::1 16 | 2001:db8:0000:0:1::1 17 | 2001:DB8:0:0:1::1 18 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/node_modules/ipv6/test/unused/regex-test.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'), 2 | sprintf = require('sprintf').sprintf; 3 | 4 | var v6 = require('../ipv6').v6, 5 | BigInteger = require('../lib/node/bigint'); 6 | 7 | var a = new v6.Address('::'); 8 | var b = new v6.Address('a:b:c:d::'); 9 | 10 | console.log(a.regularExpressionString()); 11 | console.log(b.regularExpressionString()); 12 | 13 | var ar = new RegExp(a.regularExpressionString()); 14 | var br = new RegExp(a.regularExpressionString()); 15 | 16 | console.log(ar.test('::')); 17 | console.log(ar.test('0:0:0:0:0:0:0:0')); 18 | 19 | console.log(br.test('a:b:c:d::')); 20 | console.log(br.test('a:b:c:d:0000:0000:0000:0000')); 21 | console.log(br.test('a:b:c:d:0:0:0:0')); 22 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/socksv5/package.json: -------------------------------------------------------------------------------- 1 | { "name": "socksv5", 2 | "version": "0.0.6", 3 | "author": "Brian White ", 4 | "description": "SOCKS protocol version 5 server and client implementations for node.js", 5 | "main": "./index", 6 | "scripts": { 7 | "test": "node test/test.js" 8 | }, 9 | "dependencies": { 10 | "ipv6": "*" 11 | }, 12 | "bundledDependencies": [ 13 | "ipv6" 14 | ], 15 | "engines": { "node": ">=0.10.0" }, 16 | "keywords": [ "socks", "socks5", "socksv5", "proxy" ], 17 | "licenses": [ { "type": "MIT", "url": "http://github.com/mscdex/socksv5/raw/master/LICENSE" } ], 18 | "repository" : { "type": "git", "url": "http://github.com/mscdex/socksv5.git" } 19 | } 20 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/wikipedia-proxy/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "commonjs": true, 5 | "es6": true, 6 | "node": true 7 | }, 8 | "extends": "eslint:recommended", 9 | "parserOptions": { 10 | "ecmaVersion": 2018, 11 | "sourceType": "module" 12 | }, 13 | "rules": { 14 | "indent": [ 15 | "error", 16 | 4 17 | ], 18 | "linebreak-style": [ 19 | "error", 20 | "windows" 21 | ], 22 | "quotes": [ 23 | "warn", 24 | "double" 25 | ], 26 | "semi": [ 27 | "warn", 28 | "never" 29 | ], 30 | "no-console": "off" 31 | } 32 | } -------------------------------------------------------------------------------- /app/local_proxy/node_modules/wikipedia-proxy/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Xmader 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/wikipedia-proxy/README.md: -------------------------------------------------------------------------------- 1 | # wikipedia-proxy 2 | 3 | > 用于访问中文维基百科和reddit的Node.js本地反代服务器 4 | 5 | ## 说明 6 | 7 | 和`master`分支相比,增加了对reddit的支持, 8 | 内置于[膜乎 App](https://github.com/Xmader/mohu) 9 | 10 | ## License 11 | 12 | MIT 13 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/wikipedia-proxy/cert.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIEKzCCAxOgAwIBAgIJAOGRM4Se5SxZMA0GCSqGSIb3DQEBCwUAMHYxGDAWBgNV 3 | BAMMDyoud2lraXBlZGlhLm9yZzELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlm 4 | b3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xIDAeBgNVBAoMF0Z1Y0dGVyBG 5 | b3VuZGF0aW9uLCBJbmMuMB4XDTE4MTAxNTE0MTI0MloXDTI4MTAxMjE0MTI0Mlow 6 | djEYMBYGA1UEAwwPKi53aWtpcGVkaWEub3JnMQswCQYDVQQGEwJVUzETMBEGA1UE 7 | CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEgMB4GA1UECgwX 8 | RnVjR0ZXIEZvdW5kYXRpb24sIEluYy4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw 9 | ggEKAoIBAQClcydYtP3QfqnIoYmGj3zv6r/S1JQFvTO2qiq3G2c/CkB5aWUYbW0F 10 | +bBkUNAa/7N/Yu0E2J9p4BvvwwJi7fkcDG/8aCQHuyfjY/yWKOWNrbPeE85UQSec 11 | FfM5gM/DKmz3VPrp/R/yTjZblaY8S8fN4EqjArqk41T/qp+Xw735ZkvVK7qOh5KW 12 | +xxMjyvDJ1VMCtVVS/FU4vCusVDMhK++tgPaQUeOwSFsgP2TbPCoREpqmtumd/dX 13 | PrHL1HcRmcy5XN3hxJbVC6FCry95glDgU9UVVZaf6KLMzHg9waWUpxWzgGt8qjw7 14 | l4mVy6X3nMdtWAf0e38QYXrw+KDABZStAgMBAAGjgbswgbgwDgYDVR0PAQH/BAQD 15 | AgOIMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMDwG 16 | A1UdEQQ1MDOCDyoud2lraXBlZGlhLm9yZ4IRKi5tLndpa2ltZWRpYS5vcmeCDXdp 17 | a2lwZWRpYS5vcmcwHQYDVR0OBBYEFPTif213FnoSPw0NcSlNmsWSp5/gMB8GA1Ud 18 | IwQYMBaAFPTif213FnoSPw0NcSlNmsWSp5/gMA0GCSqGSIb3DQEBCwUAA4IBAQB4 19 | 4M7Q2ms3Mgvf6lAXqRFwEKrFy2wn1O+xYaOO9NOz7Cs9bybKnNFLrtRKicA/zEdn 20 | XHerkNBNpIgdlPFAKmZSVga1RPFTJkZ5uUaiD1zreuf2VXPROVPjkWeVv9o8+gpx 21 | HixAQwVOG+2zObxKQNsqf/78GJ9YUmUefHK6iFUNmIKvoVgWr/yb4zPFVBzqadZl 22 | +JOm4gVWIWuwgQ1kaisc9x1zbN6ejLvfZ6QWGPd6HUF3qPaVgIeeSB5Y228VY5X1 23 | s8yCb8etlZSQ90QRvrG6+n1Z4GWGl+4DsR/sGJ/efTtPsoNj4Q83Um5J0z6HhjPN 24 | nTCdklUpljmt6wxuR7Ym 25 | -----END CERTIFICATE----- 26 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/wikipedia-proxy/dns.js: -------------------------------------------------------------------------------- 1 | const { Resolver } = require("dns") 2 | const net = require("net") 3 | 4 | const resolver = new Resolver() 5 | resolver.setServers(["202.141.162.123", "202.38.93.153"]) 6 | 7 | let results = {} 8 | 9 | /** 10 | * Promise化的DNS解析 11 | * @param {string} hostname 需要解析的主机名. 如果是一个IP地址, 则返回解析值为 `[hostname]` 的一个Promise 12 | * @param {boolean} cache 是否缓存DNS解析结果 13 | * @returns {Promise} 14 | */ 15 | const resolve4 = (hostname, cache = true) => { 16 | if (net.isIP(hostname)) return Promise.resolve([hostname]) 17 | 18 | return new Promise((resolve, reject) => { 19 | if (cache && results[hostname]) { 20 | resolve(results[hostname]) 21 | } else { 22 | resolver.resolve4(hostname, (err, addresses) => { 23 | if (err) { 24 | reject(err) 25 | } else { 26 | if (cache) { 27 | Object.assign(results, { 28 | [hostname]: addresses 29 | }) 30 | } 31 | resolve(addresses) 32 | } 33 | }) 34 | } 35 | }) 36 | } 37 | 38 | module.exports = { 39 | resolve4 40 | } 41 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/wikipedia-proxy/ip-addresses.js: -------------------------------------------------------------------------------- 1 | const os = require("os") 2 | 3 | const ifaces = os.networkInterfaces() 4 | 5 | const a = Object.keys(ifaces) 6 | 7 | /** @type {string[]} */ 8 | module.exports = ( 9 | a.map(name => ifaces[name] 10 | .filter(x => x.family == "IPv4") 11 | .map(x => x.address) 12 | .reduce((l, x) => l.concat(x)) 13 | ) 14 | ) -------------------------------------------------------------------------------- /app/local_proxy/node_modules/wikipedia-proxy/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wikipedia-proxy", 3 | "version": "3.2.2", 4 | "description": "用于访问中文维基百科的Node.js本地反代服务器", 5 | "main": "main.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/Xmader/wikipedia-proxy.git" 9 | }, 10 | "author": "Xmader", 11 | "license": "MIT", 12 | "bugs": { 13 | "url": "https://github.com/Xmader/wikipedia-proxy/issues" 14 | }, 15 | "homepage": "https://github.com/Xmader/wikipedia-proxy#readme", 16 | "scripts": { 17 | "start": "node run.js" 18 | }, 19 | "dependencies": { 20 | "http-proxy": "^1.17.0", 21 | "requires-port": "^1.0.0", 22 | "socksv5": "^0.0.6" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/wikipedia-proxy/rsa.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQClcydYtP3QfqnI 3 | oYmGj3zv6r/S1JQFvTO2qiq3G2c/CkB5aWUYbW0F+bBkUNAa/7N/Yu0E2J9p4Bvv 4 | wwJi7fkcDG/8aCQHuyfjY/yWKOWNrbPeE85UQSecFfM5gM/DKmz3VPrp/R/yTjZb 5 | laY8S8fN4EqjArqk41T/qp+Xw735ZkvVK7qOh5KW+xxMjyvDJ1VMCtVVS/FU4vCu 6 | sVDMhK++tgPaQUeOwSFsgP2TbPCoREpqmtumd/dXPrHL1HcRmcy5XN3hxJbVC6FC 7 | ry95glDgU9UVVZaf6KLMzHg9waWUpxWzgGt8qjw7l4mVy6X3nMdtWAf0e38QYXrw 8 | +KDABZStAgMBAAECggEAT73/sdaSGsJhzKxm328bFXt8dv40VcvKN/kuW1Ce45hq 9 | WNo+epaLHH0q0j7M/qZNelFQ0awisWHttRK1fL8b+LPZ6bq72uoOoJ9ZZ3pQoYee 10 | EKRVJvC8SZOexhFakcNJ/696u/pfQmcF9gBbveX8aDL5ZjXzhXN4TT2MbBZQ4vnv 11 | Xq04qQEkrtrDx3qZMToiKahjG9jJH6WAYsZLP7nChxUTAfmCxj1jKgwWxAj622ED 12 | 2HPJBO0BB2FIiOW+0LUXl3PAY9zYU5Px5ikAGhF6LR35LRa/DEi8dj9YwIwknmYb 13 | orgk4+BxORNuLcTvx04HYGNJLLIAHFOKS78HPYHRIQKBgQDYq9GuCDgW6RRRt7IV 14 | rzgNtDue/3LnA8PM8l/5LKdDSkG2leMPWyY4tk/mKJOav90sRyL8a4EKwpLqM8jF 15 | 3hGh9dsI08OsFdJwhELEJhiieo0WNN1zJW4WnQYP9T4IHFS2ps97Gp4noz93quoe 16 | Jbax8HxF4E5vR/n7l7TrlPegOQKBgQDDezQTfiaW//s1tMSzwRhNTvX4Z/yck7yD 17 | sy+7eRWYNoGHHgdyFBv82y/tCZRh7I2rY8wl3UA49qcxclc+38ebgJvn8QksjYo9 18 | muCnPhnjtG4m3+LqY66lYkrkrGudtXDWESiZNbI1LfMb4nFylXsEQxdxph9LI2W/ 19 | +wWFbYDwFQKBgAeYFhRMc3LSHoUytAowhv1r+L784xEXv7AaOqToHMCuBJmarUen 20 | gTJxqWE+wNWmreDUaXSBbBdtdGrC/+F3hBSyIkgv6+bHKQYKjLCFSU3Aj9tcZPqZ 21 | MD+Yp1K93Lu6CnoQZKtC5pIrFZljIyuFVN7tt91XHEioNCnOSmgLY5Z5AoGAIlct 22 | cdMygkpb3jZwa8ebNlGNwmK6LOODNXuwAfYmhgPlQ1BSLIc913DF/ZU2PPGqfZZd 23 | kbVJh/hErNoSW5hCX537RYbBftMqmuHvX1H4iFj1FN015sk2MBWRZJSpnx31wZVo 24 | FWoqcU8uKxLfrSp3XutOXge57aA9SrmVYbg383UCgYBo8P16iK0qSyctB1FIz0DP 25 | g4wOY7oC3/X2U8dXfuSqQvVq8VuFgBOpFyZz3IlBR58mjuRpqK08bkpPU1WKBuB6 26 | OTeivgL79r5KP705PxlHA50+z51rOW8Ge8YmrtkzxN4VuYNZWrf2Pl8B11826U4l 27 | eenPZZQ5HMuHP7YyrfwJQQ== 28 | -----END PRIVATE KEY----- 29 | -------------------------------------------------------------------------------- /app/local_proxy/node_modules/wikipedia-proxy/socks5.js: -------------------------------------------------------------------------------- 1 | const socks = require("socksv5") 2 | const https = require("https") 3 | const http = require("http") 4 | 5 | const random = function (min, max) { 6 | return Math.floor(Math.random() * (max - min + 1) + min) 7 | } 8 | 9 | // 创建 socks5 server 10 | const createServer = function (ssl, listener) { 11 | const host = "127.0.0.1" 12 | 13 | const httpsPort = random(20000, 30000) 14 | https.createServer(ssl, listener).listen(httpsPort, host) 15 | 16 | const httpPort = random(20000, 30000) 17 | http.createServer(listener).listen(httpPort, host) 18 | 19 | const server = socks.createServer(function (info, accept, deny) { 20 | info.dstAddr = host 21 | if (info.dstPort == 443) { 22 | info.dstPort = httpsPort 23 | } else { 24 | info.dstPort = httpPort 25 | } 26 | accept() 27 | }) 28 | 29 | server.useAuth(socks.auth.None()) 30 | 31 | return server 32 | } 33 | 34 | module.exports = { 35 | createServer 36 | } 37 | -------------------------------------------------------------------------------- /app/local_proxy/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "local_proxy", 3 | "version": "1.1.0", 4 | "description": "本地socksv5代理, 用于替换hosts", 5 | "main": "index.js", 6 | "dependencies": { 7 | "socksv5": "^0.0.6", 8 | "wikipedia-proxy": "github:Xmader/wikipedia-proxy" 9 | }, 10 | "author": "Xmader", 11 | "contributors": [ 12 | "Xmader", 13 | "angryjones" 14 | ], 15 | "license": "MIT" 16 | } 17 | -------------------------------------------------------------------------------- /app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mohu", 3 | "productName": "Mohu APP", 4 | "version": "3.2.2", 5 | "description": "膜乎APP", 6 | "main": "./main.js", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/Xmader/mohu" 10 | }, 11 | "author": "xmader", 12 | "scripts": { 13 | "dev": "electron . dev", 14 | "start": "electron .", 15 | "build-win32": "sh ./packager.sh win32 ia32", 16 | "build-win64": "sh ./packager.sh win32 x64", 17 | "build-darwin64": "sh ./packager.sh darwin x64 #只能在*unix系统上运行此打包脚本", 18 | "build-linux64": "sh ./packager.sh linux x64", 19 | "release": "npm version minor", 20 | "release-patch": "npm version patch" 21 | }, 22 | "devDependencies": { 23 | "electron": "^3.0.4", 24 | "electron-installer-zip": "^0.1.2", 25 | "electron-packager": "^12.1.2" 26 | }, 27 | "license": "MIT" 28 | } 29 | -------------------------------------------------------------------------------- /app/packager.sh: -------------------------------------------------------------------------------- 1 | platform=$1 # 操作系统名称: win32 或 linux 或 darwin 2 | if [ $2 ] 3 | then 4 | arch=$2 # 系统构架: x64 或 ia32 或 arm64 或 armv7l 5 | else 6 | arch=x64 7 | fi 8 | 9 | electron-packager . MohuAPP --app-copyright="Copyright (c) 2018-2019 Xmader" \ 10 | --platform=${platform} --arch=${arch} --electron-version 3.0.4 \ 11 | --out ../OutApp/ --overwrite \ 12 | --icon=./assets/logo.ico --ignore=packager.sh --ignore="^\/node_modules" \ 13 | --tmpdir=../OutApp/Temp/ --download.cache=../OutApp/Temp/ \ 14 | --download.mirror="https://npm.taobao.org/mirrors/electron/" 15 | 16 | cd ../OutApp/MohuAPP-${platform}-${arch} 17 | rm LICENSE LICENSES.chromium.html version 18 | cp ../../README.md ./ 19 | cp ../../LICENSE ./ 20 | 21 | cd ../ # 在OutApp文件夹 22 | cd "MohuAPP-${platform}-${arch}" 23 | 24 | if [ ${platform} = "darwin" ] 25 | then 26 | electron-installer-zip MohuAPP.app ../../dist/MohuAPP-${platform}-${arch}.zip 27 | elif [ ${platform} = "linux" ] 28 | then 29 | electron-installer-zip MohuAPP-${platform}-${arch} ../../dist/MohuAPP-${platform}-${arch}.zip 30 | else 31 | electron-installer-zip . ../../dist/MohuAPP-${platform}-${arch}.zip 32 | fi 33 | -------------------------------------------------------------------------------- /app/pages/bao/images/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/background.jpg -------------------------------------------------------------------------------- /app/pages/bao/images/flash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/flash.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/b1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/b1-1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/b1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/b1-2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/b1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/b1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/b2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/b2-1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/b2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/b2-2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/b2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/b2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/b3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/b3-1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/b3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/b3-2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/b3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/b3.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/b4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/b4-1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/b4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/b4-2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/b4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/b4.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/basiclaw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/basiclaw.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f1-1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f1-2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f2-1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f2-2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f3-1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f3-2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f3.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f4-1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f4-2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f4.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f5-1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f5-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f5-2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f5.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f6-1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f6-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f6-2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/f6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/f6.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/ferrari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/ferrari.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/gesar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/gesar.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/s1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/s1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/s2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/s2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/w1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/w1-1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/w1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/w1-2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/w1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/w1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/w2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/w2-1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/w2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/w2-2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/w2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/w2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/w3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/w3-1.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/w3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/w3-2.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/w3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/w3.png -------------------------------------------------------------------------------- /app/pages/bao/images/fruit/zy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/fruit/zy.png -------------------------------------------------------------------------------- /app/pages/bao/images/game-over.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/game-over.png -------------------------------------------------------------------------------- /app/pages/bao/images/home-mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/home-mask.png -------------------------------------------------------------------------------- /app/pages/bao/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/logo.png -------------------------------------------------------------------------------- /app/pages/bao/images/mistake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/mistake.png -------------------------------------------------------------------------------- /app/pages/bao/images/new-game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/new-game.png -------------------------------------------------------------------------------- /app/pages/bao/images/ninja.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/ninja.png -------------------------------------------------------------------------------- /app/pages/bao/images/shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/shadow.png -------------------------------------------------------------------------------- /app/pages/bao/images/x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/x.png -------------------------------------------------------------------------------- /app/pages/bao/images/xf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/xf.png -------------------------------------------------------------------------------- /app/pages/bao/images/xx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/xx.png -------------------------------------------------------------------------------- /app/pages/bao/images/xxf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/xxf.png -------------------------------------------------------------------------------- /app/pages/bao/images/xxx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/xxx.png -------------------------------------------------------------------------------- /app/pages/bao/images/xxxf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/images/xxxf.png -------------------------------------------------------------------------------- /app/pages/bao/scripts/animation.js: -------------------------------------------------------------------------------- 1 | define("scripts/animation.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | var layer = require("scripts/layer"); 5 | var timeline = require("scripts/timeline"); 6 | var tween = require("scripts/lib/tween"); 7 | 8 | var anim = tween.exponential.co; 9 | 10 | exports.translateX = function(object, from, to, duration, callback) { 11 | return timeline.createTask({ 12 | start: 0, 13 | duration: duration, 14 | object: object, 15 | 16 | onTimeUpdate: function(time) { 17 | object.attr({ 18 | x: anim(time, from, to - from, duration) 19 | }); 20 | }, 21 | 22 | onTimeEnd: callback 23 | }); 24 | }; 25 | 26 | exports.translateY = function(object, from, to, duration, callback) { 27 | return timeline.createTask({ 28 | start: 0, 29 | duration: duration, 30 | object: object, 31 | 32 | onTimeUpdate: function(time) { 33 | object.attr({ 34 | y: anim(time, from, to - from, duration) 35 | }); 36 | }, 37 | 38 | onTimeEnd: callback 39 | }); 40 | }; 41 | 42 | exports.scale = function(object, from, to, duration, callback) { 43 | return timeline.createTask({ 44 | start: 0, 45 | duration: duration, 46 | object: object, 47 | 48 | onTimeUpdate: function(time, zoom) { 49 | object.scale(zoom = anim(time, from, to - from, duration), zoom); 50 | }, 51 | 52 | onTimeEnd: callback 53 | }); 54 | }; 55 | 56 | }); 57 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/collision.js: -------------------------------------------------------------------------------- 1 | define("scripts/collision.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | /** 5 | * 碰撞检测 6 | */ 7 | 8 | exports.check = function(knife, fruit) { 9 | return lineInEllipse( 10 | knife.slice(0, 2), 11 | knife.slice(2, 4), 12 | [fruit.x, fruit.y], 13 | fruit.radius 14 | ); 15 | }; 16 | 17 | function sqr(x) { 18 | return x * x; 19 | } 20 | 21 | function sign(n) { 22 | return n < 0 ? -1 : (n > 0 ? 1 : 0); 23 | } 24 | 25 | function equation12(a, b, c) { 26 | if (a == 0) return; 27 | 28 | var delta = b * b - 4 * a * c; 29 | if (delta == 0) 30 | return [-1 * b / (2 * a), -1 * b / (2 * a)]; 31 | else if (delta > 0) 32 | return [(-1 * b + Math.sqrt(delta)) / (2 * a), (-1 * b - Math.sqrt(delta)) / (2 * a)]; 33 | } 34 | 35 | // 返回线段和椭圆的两个交点,如果不相交,返回 null 36 | function lineXEllipse(p1, p2, c, r, e) { 37 | // 线段:p1, p2 圆心:c 半径:r 离心率:e 38 | if (r <= 0) return; 39 | e = e === undefined ? 1 : e; 40 | var t1 = r, t2 = r * e, k, a, b; 41 | 42 | a = sqr(t2) * sqr(p1[0] - p2[0]) + sqr(t1) * sqr(p1[1] - p2[1]); 43 | 44 | if (a <= 0) return; 45 | 46 | b = 2 * sqr(t2) * (p2[0] - p1[0]) * (p1[0] - c[0]) + 2 * sqr(t1) * (p2[1] - p1[1]) * (p1[1] - c[1]); 47 | c = sqr(t2) * sqr(p1[0] - c[0]) + sqr(t1) * sqr(p1[1] - c[1]) - sqr(t1) * sqr(t2); 48 | 49 | if (!(k = equation12(a, b, c, t1, t2))) return; 50 | 51 | var result = [ 52 | [p1[0] + k[0] * (p2[0] - p1[0]), p1[1] + k[0] * (p2[1] - p1[1])], 53 | [p1[0] + k[1] * (p2[0] - p1[0]), p1[1] + k[1] * (p2[1] - p1[1])] 54 | ]; 55 | 56 | if (!((sign(result[0][0] - p1[0]) * sign(result[0][0] - p2[0]) <= 0) && 57 | (sign(result[0][1] - p1[1]) * sign(result[0][1] - p2[1]) <= 0))) 58 | result[0] = null; 59 | 60 | if (!((sign(result[1][0] - p1[0]) * sign(result[1][0] - p2[0]) <= 0) && 61 | (sign(result[1][1] - p1[1]) * sign(result[1][1] - p2[1]) <= 0))) 62 | result[1] = null; 63 | 64 | return result; 65 | } 66 | 67 | // 判断计算线段和椭圆是否相交 68 | function lineInEllipse(p1, p2, c, r, e) { 69 | var t = lineXEllipse(p1, p2, c, r, e); 70 | return t && (t[0] || t[1]); 71 | }; 72 | 73 | }); 74 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/flash.js: -------------------------------------------------------------------------------- 1 | define("scripts/flash.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | var layer = require("scripts/layer"); 5 | var timeline = require("scripts/timeline").use("flash").init(10); 6 | var tween = require("scripts/lib/tween"); 7 | 8 | var image; 9 | 10 | var anim = tween.quadratic.cio; 11 | var anims = []; 12 | var dur = 100; 13 | 14 | function createImage() { 15 | image = layer.createImage("flash", "images/flash.png", 0, 0, 358, 20).hide(); 16 | } 17 | 18 | function onTimeUpdate(time, a, b, z) { 19 | image.scale(z = anim(time, a, b - a, dur), z); 20 | } 21 | 22 | exports.showAt = function(x, y, an) { 23 | if (!image) 24 | createImage(); 25 | 26 | image.rotate(an, true).scale(1e-5, 1e-5).attr({ 27 | x: x, 28 | y: y 29 | }).show(); 30 | 31 | anims.clear && anims.clear(); 32 | 33 | timeline.createTask({ 34 | start: 0, 35 | duration: dur, 36 | data: [1e-5, 1], 37 | object: this, 38 | onTimeUpdate: onTimeUpdate, 39 | recycle: anims 40 | }); 41 | 42 | timeline.createTask({ 43 | start: dur, 44 | duration: dur, 45 | data: [1, 1e-5], 46 | object: this, 47 | onTimeUpdate: onTimeUpdate, 48 | recycle: anims 49 | }); 50 | }; 51 | 52 | }); 53 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/juice.js: -------------------------------------------------------------------------------- 1 | define("scripts/juice.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | /** 5 | * 果汁 6 | */ 7 | var tools = require("scripts/tools"); 8 | var layer = require("scripts/layer").getLayer("juice"); 9 | var timeline = require("scripts/timeline").use("juice").init(10); 10 | var tween = require("scripts/lib/tween"); 11 | 12 | var random = tools.randomNumber; 13 | var dur = 1500; 14 | var anim = tween.exponential.co; 15 | var dropAnim = tween.quadratic.co; 16 | var sin = Math.sin; 17 | var cos = Math.cos; 18 | 19 | var num = 10; 20 | var radius = 10; 21 | 22 | function ClassJuice(x, y, color) { 23 | this.x = x; 24 | this.y = y; 25 | this.color = color; 26 | 27 | this.distance = random(200) + 100; 28 | this.radius = radius; 29 | this.dir = random(360) * Math.PI / 180; 30 | } 31 | 32 | ClassJuice.prototype.render = function() { 33 | this.circle = layer.circle(this.x, this.y, this.radius).attr({ 34 | fill: this.color, 35 | stroke: "none" 36 | }); 37 | }; 38 | 39 | ClassJuice.prototype.sputter = function() { 40 | timeline.createTask({ 41 | start: 0, 42 | duration: dur, 43 | object: this, 44 | onTimeUpdate: this.onTimeUpdate, 45 | onTimeEnd: this.onTimeEnd 46 | }); 47 | }; 48 | 49 | ClassJuice.prototype.onTimeUpdate = function(time) { 50 | var distance, x, y, z; 51 | 52 | distance = anim(time, 0, this.distance, dur); 53 | x = this.x + distance * cos(this.dir); 54 | y = this.y + distance * sin(this.dir) + dropAnim(time, 0, 200, dur); 55 | z = anim(time, 1, -1, dur); 56 | 57 | this.circle.attr({ 58 | cx: x, 59 | cy: y 60 | }).scale(z, z); 61 | }; 62 | 63 | ClassJuice.prototype.onTimeEnd = function() { 64 | this.circle.remove(); 65 | tools.unsetObject(this); 66 | }; 67 | 68 | exports.create = function(x, y, color) { 69 | for (var i = 0; i < num; i++) 70 | this.createOne(x, y, color); 71 | }; 72 | 73 | exports.createOne = function(x, y, color) { 74 | if (!color) 75 | return; 76 | 77 | var juice = new ClassJuice(x, y, color); 78 | juice.render(); 79 | juice.sputter(); 80 | }; 81 | 82 | }); 83 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/knife.js: -------------------------------------------------------------------------------- 1 | define("scripts/knife.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | var timeline = require("scripts/timeline"); 5 | var layer = require("scripts/layer").getLayer("knife"); 6 | 7 | /** 8 | * 刀光模块 9 | */ 10 | 11 | var lastX = null, lastY = null; 12 | var abs = Math.abs; 13 | 14 | var life = 200; 15 | var stroke = 10; 16 | var color = "#cbd3db"; 17 | var anims = []; 18 | var knifes = []; 19 | 20 | function ClassKnifePart(conf) { 21 | this.sx = conf.sx; 22 | this.sy = conf.sy; 23 | this.ex = conf.ex; 24 | this.ey = conf.ey; 25 | 26 | knifes.push(this); 27 | } 28 | 29 | ClassKnifePart.prototype.set = function() { 30 | var sx, sy, ex, ey, dx, dy, ax, ay; 31 | 32 | sx = this.sx; 33 | sy = this.sy; 34 | ex = this.ex; 35 | ey = this.ey; 36 | 37 | dx = sx - ex; 38 | dy = sy - ey; 39 | ax = abs(dx); 40 | ay = abs(dy); 41 | 42 | if (ax > ay) 43 | sx += dx < 0 ? -1 : 1, 44 | sy += dy < 0 ? -(1 * ay / ax) : 1 * ay / ax; 45 | else 46 | sx += dx < 0 ? -(1 * ax / ay) : 1 * ax / ay, 47 | sy += dy < 0 ? -1 : 1; 48 | 49 | this.line = layer.path("M" + sx + "," + sy + "L" + ex + "," + ey).attr({ 50 | "stroke": color, 51 | "stroke-width": stroke + "px" 52 | }); 53 | 54 | timeline.createTask({ 55 | start: 0, 56 | duration: life, 57 | object: this, 58 | onTimeUpdate: this.update, 59 | onTimeEnd: this.end, 60 | recycle: anims 61 | }); 62 | return this; 63 | }; 64 | 65 | ClassKnifePart.prototype.update = function(time) { 66 | this.line.attr("stroke-width", stroke * (1 - time / life) + "px"); 67 | }; 68 | 69 | ClassKnifePart.prototype.end = function() { 70 | this.line.remove(); 71 | 72 | var index; 73 | if (index = knifes.indexOf(this)) 74 | knifes.splice(index, 1); 75 | }; 76 | 77 | exports.newKnife = function() { 78 | lastX = lastY = null; 79 | }; 80 | 81 | exports.through = function(x, y) { 82 | var ret = null; 83 | if (lastX !== null && (lastX != x || lastY != y)) { 84 | new ClassKnifePart({ 85 | sx: lastX, 86 | sy: lastY, 87 | ex: x, 88 | ey: y 89 | }).set(); 90 | ret = [lastX, lastY, x, y]; 91 | } 92 | 93 | lastX = x; 94 | lastY = y; 95 | return ret; 96 | }; 97 | 98 | }); 99 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/layer.js: -------------------------------------------------------------------------------- 1 | define("scripts/layer.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | /** 5 | * layer manager 6 | */ 7 | 8 | var Raphael = require("scripts/lib/raphael"); 9 | var layout = require("scripts/layout"); 10 | 11 | var layers = {}; 12 | var zIndexes = { 13 | "default": zi(), 14 | "light": zi(), 15 | "knife": zi(), 16 | "fruit": zi(), 17 | "juice": zi(), 18 | "flash": zi(), 19 | "mask": zi() 20 | }; 21 | 22 | 23 | var imageCache = {}; 24 | 25 | exports.preloadImage = function(src, callback) { 26 | var img = new Image(), canvas, ctx, error; 27 | //img.crossOrigin = "anonymous"; 28 | img.src = src; 29 | img.onload = function() { 30 | canvas = document.createElement('canvas'); 31 | canvas.height = img.naturalHeight; 32 | canvas.width = img.naturalWidth; 33 | ctx = canvas.getContext('2d'); 34 | ctx.drawImage(img, 0, 0); 35 | try { 36 | imageCache[src] = canvas.toDataURL(); 37 | } catch (e) { 38 | error = e; 39 | } 40 | callback(error); 41 | }; 42 | }; 43 | 44 | exports.replaceImage = function(image, src) { 45 | src = imageCache[src] || src; 46 | image.attr("src", src); 47 | }; 48 | 49 | exports.createImage = function(layer, src, x, y, w, h) { 50 | layer = this.getLayer(layer); 51 | src = imageCache[src] || src; 52 | return layer.image(src, x, y, w, h); 53 | }; 54 | 55 | exports.createText = function(layer, text, x, y, fill, size) { 56 | layer = this.getLayer(layer); 57 | 58 | return layer.text(x, y, text).attr({ 59 | fill: fill || "#fff", 60 | "font-size": size || "14px", 61 | "text-anchor": "start" 62 | }); 63 | }; 64 | 65 | exports.getLayer = function(name) { 66 | var p, layer; 67 | name = name || "default"; 68 | 69 | if (p = layers[name]) { 70 | return p; 71 | } else { 72 | layer = document.createElement("div"); 73 | layer.className = "layer"; 74 | layer.style.cssText = "z-index: " + (zIndexes[name] || 0) + ";"; 75 | 76 | document.getElementById("extra").appendChild(layer); 77 | p = layers[name] = Raphael(layer, layout.width(), layout.height()); 78 | return p; 79 | } 80 | }; 81 | 82 | function zi() { 83 | return zi.num = ++zi.num || 2; 84 | }; 85 | 86 | exports.resize = function() { 87 | for (var name in layers) { 88 | layers[name].setSize(layout.width(), layout.height()); 89 | } 90 | }; 91 | }); 92 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/layout.js: -------------------------------------------------------------------------------- 1 | define("scripts/layout.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | var elem = document.getElementById("container"); 5 | 6 | var minWidth = 240; 7 | var minHeight = 240; 8 | 9 | exports.x = function() { 10 | return elem.offsetLeft; 11 | }; 12 | 13 | exports.y = function() { 14 | return elem.offsetTop; 15 | }; 16 | 17 | exports.width = function() { 18 | var w = elem.offsetWidth; 19 | if (w < minWidth) 20 | w = minWidth; 21 | return w; 22 | }; 23 | 24 | exports.height = function() { 25 | var h = elem.offsetHeight; 26 | if (h < minHeight) 27 | h = minHeight; 28 | return h; 29 | }; 30 | 31 | exports.left = function(n) { 32 | n = n || 0; 33 | return n; 34 | }; 35 | 36 | exports.top = function(n) { 37 | n = n || 0; 38 | return n; 39 | }; 40 | 41 | exports.right = function(n, w) { 42 | n = n || 0; 43 | w = w || 0; 44 | return exports.width() - n - w; 45 | }; 46 | 47 | exports.bottom = function(n, h) { 48 | n = n || 0; 49 | h = h || 0; 50 | return exports.height() - n - h; 51 | }; 52 | 53 | exports.centerX = function(w) { 54 | w = w || 0; 55 | return (exports.width() >> 1) - (w >> 1); 56 | }; 57 | 58 | exports.centerY = function(h) { 59 | h = h || 0; 60 | return (exports.height() >> 1) - (h >> 1); 61 | }; 62 | 63 | }); 64 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/lib/tween.js: -------------------------------------------------------------------------------- 1 | define("scripts/lib/tween.js", function(exports, require, module){ 2 | "use strict"; 3 | 4 | exports.exponential = function(){}; 5 | exports.exponential.co = function(index, offset, target, framesNum){ return (index == framesNum) ? offset + target : target * (-Math.pow(2, -10 * index / framesNum) + 1) + offset; }; 6 | // exports.exponential.ci = function(index, offset, target, framesNum){ return (index == 0) ? offset : target * Math.pow(2, 10 * (index / framesNum - 1)) + offset; } 7 | 8 | exports.bounce = function(){}; 9 | exports.bounce.co = function(index, offset, target, framesNum){ if((index /= framesNum) < (1 / 2.75)) return target * (7.5625 * index * index) + offset; else if(index < (2 / 2.75)) return target * (7.5625 * (index -= (1.5 / 2.75)) * index + .75) + offset; else if(index < (2.5 / 2.75)) return target * (7.5625 * (index -= (2.25 / 2.75)) * index + .9375) + offset; else return target * (7.5625 * (index -= (2.625 / 2.75)) * index + .984375) + offset; }; 10 | 11 | exports.quadratic = function(){}; 12 | exports.quadratic.ci = function(index, offset, target, framesNum){ return target * (index /= framesNum) * index + offset; }; 13 | exports.quadratic.co = function(index, offset, target, framesNum){ return - target * (index /= framesNum) * (index - 2) + offset; } 14 | exports.quadratic.cio = function(index, offset, target, framesNum){ if((index /= framesNum / 2) < 1) return target / 2 * index * index + offset; else return - target / 2 * ((-- index) * (index - 2) - 1) + offset; }; 15 | 16 | exports.circular = function(index, offset, target, framesNum){ if((index /= framesNum / 2) < 1) return - target / 2 * (Math.sqrt(1 - index * index) - 1) + offset; else return target / 2 * (Math.sqrt(1 - (index -= 2) * index) + 1) + offset; } 17 | 18 | exports.linear = function(index, offset, target, framesNum){ return target * index / framesNum + offset; }; 19 | 20 | exports.back = function(){}; 21 | exports.back.ci = function(index, offset, target, framesNum, s){ s = 1.70158; return target * (index /= framesNum) * index * ((s + 1) * index - s) + offset; }; 22 | exports.back.co = function(index, offset, target, framesNum, s){ s = 1.70158; return target * ((index = index / framesNum - 1) * index * ((s + 1) * index + s) + 1) + offset; }; 23 | 24 | }); 25 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/light.js: -------------------------------------------------------------------------------- 1 | define("scripts/light.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | /** 5 | * 炸弹爆炸时的光线 6 | */ 7 | 8 | var layer = require("scripts/layer"); 9 | 10 | var maskLayer = layer.getLayer("mask"); 11 | layer = layer.getLayer("light"); 12 | 13 | var tools = require("scripts/tools"); 14 | var timeline = require("scripts/timeline"); 15 | var layout = require("scripts/layout"); 16 | 17 | var random = tools.randomNumber; 18 | 19 | var pi = Math.PI; 20 | var sin = Math.sin; 21 | var cos = Math.cos; 22 | 23 | var lights = []; 24 | var indexes = []; 25 | var lightsNum = 10; 26 | 27 | for (var i = 0; i < lightsNum; i++) 28 | indexes[i] = i; 29 | 30 | function removeLights() { 31 | for (var i = 0, l = lights.length; i < l; i++) 32 | lights[i].remove(); 33 | lights.length = 0; 34 | } 35 | 36 | function build(x, y, r, color) { 37 | var l = layout.width() + layout.height(); 38 | var a1, a2, x1, y1, x2, y2; 39 | 40 | a1 = r * 36 + random(10); 41 | a2 = a1 + 5; 42 | 43 | a1 = pi * a1 / 180; 44 | a2 = pi * a2 / 180; 45 | 46 | x1 = x + l * cos(a1); 47 | y1 = y + l * sin(a1); 48 | 49 | x2 = x + l * cos(a2); 50 | y2 = y + l * sin(a2); 51 | 52 | var light = layer.path(["M", x, y, "L", x1, y1, "L", x2, y2, "Z"]).attr({ 53 | stroke: "none", 54 | fill: color 55 | }); 56 | 57 | lights.push(light); 58 | } 59 | 60 | exports.start = function(fruit, callback) { 61 | var x = fruit.x, 62 | y = fruit.y, 63 | time = 0, 64 | idx = tools.randomArray(indexes); 65 | 66 | var i = lightsNum, 67 | b = function() { 68 | build(x, y, idx[this], fruit.color); 69 | }; 70 | 71 | while (i--) 72 | setTimeout(b.bind(i), time += 100); 73 | 74 | setTimeout(function() { 75 | removeLights(); 76 | callback(); 77 | }, time + 100); 78 | }; 79 | 80 | exports.showWhiteLight = function(callback) { 81 | var dur = 4e3; 82 | var mask = maskLayer.rect(0, 0, layout.width(), layout.height()).attr({ 83 | fill: "#fff", 84 | stroke: "none" 85 | }); 86 | var control = { 87 | onTimeUpdate: function(time) { 88 | mask.attr("opacity", 1 - time / dur); 89 | }, 90 | 91 | onTimeEnd: function() { 92 | mask.remove(); 93 | if (callback) 94 | callback(); 95 | } 96 | }; 97 | 98 | timeline.createTask({ 99 | start: 0, 100 | duration: dur, 101 | object: control, 102 | onTimeUpdate: control.onTimeUpdate, 103 | onTimeEnd: control.onTimeEnd 104 | }); 105 | }; 106 | 107 | }); 108 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/main.js: -------------------------------------------------------------------------------- 1 | define("scripts/main.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | var scene = require("scripts/scene"); 5 | var layer = require("scripts/layer"); 6 | var soundManager = require("scripts/sound-manager"); 7 | var fruitManager = require("scripts/fruit-manager"); 8 | 9 | var imageList = [ 10 | "images/flash.png", 11 | "images/game-over.png", 12 | "images/home-mask.png", 13 | "images/logo.png", 14 | "images/mistake.png", 15 | "images/new-game.png", 16 | "images/ninja.png", 17 | "images/shadow.png", 18 | "images/x.png", 19 | "images/xf.png", 20 | "images/xx.png", 21 | "images/xxf.png", 22 | "images/xxx.png", 23 | "images/xxxf.png" 24 | ]; 25 | 26 | function preloadImages(callback) { 27 | for (var i = 0; i < imageList.length; i++) { 28 | layer.preloadImage(imageList[i], callback); 29 | } 30 | return imageList.length; 31 | } 32 | 33 | function preload(text, callback) { 34 | var info = "正在加载 %d/%d"; 35 | info += "\n请打开声音..."; 36 | 37 | var num = 0, count = 0; 38 | var onload = function() { 39 | num++; 40 | text.attr("text", info.replace("%d", num).replace("%d", count)); 41 | if (num >= count) { 42 | callback(); 43 | } 44 | }; 45 | 46 | count += fruitManager.preloadImages(onload); 47 | count += preloadImages(onload); 48 | } 49 | 50 | exports.start = function() { 51 | soundManager.init(); 52 | 53 | var text = layer.createText("default", "", 16, 20); 54 | preload(text, function() { 55 | setTimeout(function() { 56 | text.remove(); 57 | scene.init(); 58 | scene.switchScene("home-menu"); 59 | }, 1000); 60 | }); 61 | }; 62 | 63 | }); 64 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/object/background.js: -------------------------------------------------------------------------------- 1 | define("scripts/object/background.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | var layer = require("scripts/layer"); 5 | var layout = require("scripts/layout"); 6 | var random = require("scripts/tools").randomNumber; 7 | 8 | var image, timer; 9 | 10 | exports.set = function() { 11 | image = layer.createImage("default", "images/background.jpg", 0, 0, layout.width(), layout.height()); 12 | }; 13 | 14 | exports.resize = function() { 15 | image.attr({ 16 | width: layout.width(), 17 | height: layout.height() 18 | }); 19 | }; 20 | 21 | exports.wobble = function() { 22 | if (timer) 23 | return; 24 | timer = setInterval(wobble, 50); 25 | }; 26 | 27 | exports.stop = function() { 28 | clearInterval(timer); 29 | timer = null; 30 | image.attr({ 31 | x: 0, 32 | y: 0 33 | }); 34 | }; 35 | 36 | function wobble() { 37 | var x, y; 38 | x = random(12) - 6; 39 | y = random(12) - 6; 40 | image.attr({ 41 | x: x, 42 | y: y 43 | }); 44 | }; 45 | 46 | }); 47 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/object/game-over.js: -------------------------------------------------------------------------------- 1 | define("scripts/object/game-over.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | var layer = require("scripts/layer"); 5 | var layout = require("scripts/layout"); 6 | var scale = require("scripts/animation").scale; 7 | 8 | var image; 9 | 10 | exports.set = function() { 11 | image = layer.createImage("default", "images/game-over.png", 12 | layout.centerX(490), layout.centerY(85), 490, 85).hide().scale(1e-5, 1e-5); 13 | }; 14 | 15 | exports.show = function() { 16 | image.show(); 17 | scale(image, 1e-5, 1, 500); 18 | }; 19 | 20 | exports.hide = function() { 21 | scale(image, 1, 1e-5, 500, image.hide); 22 | }; 23 | 24 | exports.resize = function() { 25 | image.attr({ 26 | "x": layout.centerX(image.attrs.width), 27 | "y": layout.centerY(image.attrs.height) 28 | }); 29 | }; 30 | 31 | }); 32 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/object/logo.js: -------------------------------------------------------------------------------- 1 | define("scripts/object/logo.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | var layer = require("scripts/layer"); 5 | var layout = require("scripts/layout"); 6 | var translateY = require("scripts/animation").translateY; 7 | 8 | var homeMask, logo, ninja; 9 | var width = [0, 150, 240]; 10 | var height = [183, 126, 90]; 11 | 12 | var x = [0, 0, 0]; 13 | var y = [-183, -182, -140]; 14 | var y2 = [0, 10, 20]; 15 | 16 | function getPos() { 17 | width[0] = layout.width(); 18 | x[1] = layout.centerX(width[1]) - 125; 19 | x[2] = x[1] + 160; 20 | } 21 | 22 | function createImage(imageSrc, x, y, width, height) { 23 | return layer.createImage("default", imageSrc, x, y, width, height).hide(); 24 | } 25 | 26 | exports.set = function() { 27 | getPos(); 28 | homeMask = createImage("images/home-mask.png", x[0], y[0], width[0], height[0]); 29 | logo = createImage("images/logo.png", x[1], y[1], width[1], height[1]); 30 | ninja = createImage("images/ninja.png", x[2], y[2], width[2], height[2]); 31 | }; 32 | 33 | exports.show = function() { 34 | homeMask.show(); 35 | logo.show(); 36 | ninja.show(); 37 | translateY(homeMask, y[0], y2[0], 1000); 38 | translateY(logo, y[1], y2[1], 1000); 39 | translateY(ninja, y[2], y2[2], 1000); 40 | }; 41 | 42 | exports.hide = function() { 43 | translateY(homeMask, y2[0], y[0], 1000, homeMask.hide); 44 | translateY(logo, y2[1], y[1], 1000, logo.hide); 45 | translateY(ninja, y2[2], y[2], 1000, ninja.hide); 46 | }; 47 | 48 | exports.resize = function() { 49 | getPos(); 50 | homeMask.attr({width: width[0]}); 51 | logo.attr({x: x[1]}); 52 | ninja.attr({x: x[2]}); 53 | }; 54 | }); 55 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/object/new-game.js: -------------------------------------------------------------------------------- 1 | define("scripts/object/new-game.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | var layer = require("scripts/layer"); 5 | var rotation = require("scripts/rotation"); 6 | var layout = require("scripts/layout"); 7 | var fruitManager = require("scripts/fruit-manager"); 8 | 9 | var image, component 10 | var sideLength = 195; 11 | var imageX, imageY; 12 | 13 | var icon, iconWidth, iconHeight, iconX, iconY; 14 | 15 | function getImageXY() { 16 | imageX = layout.centerX(sideLength); 17 | imageY = layout.bottom(50, sideLength); 18 | } 19 | 20 | function getIconXY() { 21 | iconX = layout.centerX(); 22 | iconY = layout.bottom(50, iconHeight); 23 | } 24 | 25 | exports.setIcon = function(groupName, w, h, callback) { 26 | if (icon) 27 | return; 28 | iconWidth = w; 29 | iconHeight = h; 30 | getIconXY(); 31 | icon = fruitManager.create(groupName, iconX, iconY, true); 32 | icon.onSlice = function(fruit, angle) { 33 | icon.break(angle); 34 | icon = null; 35 | callback(); 36 | } 37 | }; 38 | 39 | exports.set = function() { 40 | getImageXY(); 41 | image = layer.createImage("default", "images/new-game.png", imageX, imageY, sideLength, sideLength).hide(); 42 | component = rotation.create(image); 43 | }; 44 | 45 | exports.show = function() { 46 | component.show(); 47 | if (icon) { 48 | icon.show(); 49 | } 50 | }; 51 | 52 | exports.hide = function() { 53 | component.hide(); 54 | }; 55 | 56 | exports.resize = function() { 57 | getImageXY(); 58 | image.attr({ 59 | x: imageX, 60 | y: imageY 61 | }); 62 | 63 | if (icon) { 64 | getIconXY(); 65 | icon.setPos(iconX, iconY); 66 | } 67 | }; 68 | 69 | }); 70 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/object/score.js: -------------------------------------------------------------------------------- 1 | define("scripts/object/score.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | var layer = require("scripts/layer"); 5 | var translateX = require("scripts/animation").translateX; 6 | 7 | var score; 8 | 9 | exports.set = function() { 10 | score = layer.createText("default", "", -59, 24, "90-#fc7f0c-#ffec53", "30px").hide(); 11 | }; 12 | 13 | exports.show = function() { 14 | score.attr("text", "+0s"); 15 | score.show(); 16 | translateX(score, -59, 7, 500); 17 | }; 18 | 19 | exports.hide = function() { 20 | translateX(score, 7, -59, 500, score.hide); 21 | }; 22 | 23 | exports.resize = function() { 24 | 25 | }; 26 | 27 | exports.number = function(number) { 28 | score.attr("text", "+" + number + "s"); 29 | score.attr("font-size", "36px"); 30 | setTimeout(function() { 31 | score.attr("font-size", "30px"); 32 | }, 30); 33 | }; 34 | 35 | }); 36 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/require.js: -------------------------------------------------------------------------------- 1 | void function(global) { 2 | "use strict"; 3 | 4 | var modules = {}; 5 | 6 | var require = function(id) { 7 | if (!/\.js$/.test(id)) 8 | id += ".js"; 9 | var module = modules[id]; 10 | if (!module.exports) { 11 | module.exports = {}; 12 | module.call(this, module.exports, require, module); 13 | } 14 | return module.exports; 15 | }; 16 | 17 | global.define = function(id, func) { 18 | modules[id] = func; 19 | }; 20 | global.require = require; 21 | }(this); 22 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/rotation.js: -------------------------------------------------------------------------------- 1 | define("scripts/rotation.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | var timeline = require("scripts/timeline"); 5 | var randomNumber = require("scripts/tools").randomNumber; 6 | var tween = require("scripts/lib/tween"); 7 | 8 | var anim = tween.exponential.co; 9 | /** 10 | * 旋转类模块模型 11 | */ 12 | 13 | exports.create = function(object) { 14 | var module = {}; 15 | var rotateDire = [12, -12][randomNumber(2)]; 16 | var defaultAngle = randomNumber(360); 17 | 18 | module.anims = []; 19 | 20 | module.show = function() { 21 | object.rotate(defaultAngle, true); 22 | object.show(); 23 | 24 | timeline.createTask({ 25 | start: 0, 26 | duration: -1, 27 | object: this, 28 | onTimeUpdate: module.onRotating, 29 | recycle: this.anims 30 | }); 31 | }; 32 | 33 | module.hide = function() { 34 | this.anims.clear(); 35 | object.hide(); 36 | }; 37 | 38 | module.onRotating = function() { 39 | var lastTime = 0, 40 | an = defaultAngle; 41 | return function(time) { 42 | an = (an + (time - lastTime) / 1e3 * rotateDire) % 360; 43 | object.rotate(an, true); 44 | lastTime = time; 45 | } 46 | }(); 47 | 48 | return module; 49 | }; 50 | 51 | }); 52 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/sound-manager.js: -------------------------------------------------------------------------------- 1 | define("scripts/sound-manager.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | var sound = require("scripts/sound"); 5 | var random = require("scripts/tools").randomNumber; 6 | 7 | var soundArrays = { 8 | "basiclaw": 2, 9 | "shakespeare": 2, 10 | "gesar": 1, 11 | "winnie": 1, 12 | "ferrari": 6, 13 | "fault": 10, 14 | "frog": 4, 15 | "bun": 5, 16 | "gameover": 3 17 | }; 18 | 19 | function loadArrays() { 20 | var arr, count, src; 21 | for (var name in soundArrays) { 22 | arr = []; 23 | count = soundArrays[name]; 24 | for (var i = 0; i < count; i++) { 25 | arr.push(sound.create("sounds/" + name + (i + 1) + ".mp3")); 26 | } 27 | soundArrays[name] = arr; 28 | } 29 | } 30 | 31 | exports.init = function() { 32 | loadArrays(); 33 | }; 34 | 35 | exports.play = function(name) { 36 | var arr = soundArrays[name]; 37 | var len = arr.length; 38 | return arr[len == 1 ? 0 : random(len)].play(); 39 | }; 40 | 41 | }); 42 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/sound.js: -------------------------------------------------------------------------------- 1 | define("scripts/sound.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | function ClassSound(src) { 5 | this.sound = document.createElement("audio"); 6 | var source = document.createElement("source"); 7 | source.src = src; 8 | this.sound.appendChild(source); 9 | this.sound.preload = "auto"; 10 | this.sound.volume = 1; 11 | } 12 | 13 | ClassSound.prototype.play = function() { 14 | return this.sound.play(); 15 | }; 16 | 17 | exports.create = function(src, opts) { 18 | return new ClassSound(src, opts); 19 | }; 20 | 21 | }); 22 | -------------------------------------------------------------------------------- /app/pages/bao/scripts/tools.js: -------------------------------------------------------------------------------- 1 | define("scripts/tools.js", function(exports, require, module) { 2 | "use strict"; 3 | 4 | exports.unsetObject = function(object) { 5 | for (var i in object) 6 | if (object.hasOwnProperty(i) && typeof object[i] == "function") 7 | object[i] = function() {}; 8 | }; 9 | 10 | exports.getAngleByRadian = function(radian) { 11 | return radian * 180 / Math.PI; 12 | }; 13 | 14 | exports.pointToRadian = function(origin, point) { 15 | var PI = Math.PI; 16 | 17 | if (point[0] === origin[0]) { 18 | if (point[1] > origin[1]) 19 | return PI * 0.5; 20 | return PI * 1.5 21 | } else if (point[1] === origin[1]) { 22 | if (point[0] > origin[0]) 23 | return 0; 24 | return PI; 25 | } 26 | 27 | var t = Math.atan((origin[1] - point[1]) / (origin[0] - point[0])); 28 | 29 | if (point[0] > origin[0] && point[1] < origin[1]) 30 | return t + 2 * PI; 31 | 32 | if (point[0] > origin[0] && point[1] > origin[1]) 33 | return t; 34 | 35 | return t + PI; 36 | }; 37 | 38 | exports.randomNumber = function(num) { 39 | return Math.floor(Math.random() * num); 40 | }; 41 | 42 | exports.randomArray = function(arr) { 43 | arr = arr.slice(0); 44 | var ret = [], i = arr.length; 45 | while( i -- ) 46 | ret.push( arr.splice( exports.randomNumber( i + 1 ), 1 )[0] ); 47 | return ret; 48 | }; 49 | 50 | exports.addEvent = function(target, name, fn) { 51 | var call = function() { 52 | fn.apply(target, arguments); 53 | }; 54 | if (window.attachEvent) { 55 | target.attachEvent("on" + name, call); 56 | } else if (window.addEventListener) { 57 | target.addEventListener(name, call, false); 58 | } else { 59 | target["on" + name] = call; 60 | } 61 | return call; 62 | }; 63 | 64 | exports.delEvent = function(target, name, fn) { 65 | if (window.detachEvent) { 66 | target.detachEvent("on" + name, fn); 67 | } else if (window.removeEventListener) { 68 | target.removeEventListener(name, fn, false); 69 | } else if (target["on" + name] == fn) { 70 | target["on" + name] = null; 71 | } 72 | }; 73 | 74 | }); 75 | -------------------------------------------------------------------------------- /app/pages/bao/sounds/basiclaw1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/basiclaw1.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/basiclaw2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/basiclaw2.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/bun1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/bun1.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/bun2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/bun2.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/bun3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/bun3.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/bun4.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/bun4.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/bun5.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/bun5.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/fault1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/fault1.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/fault10.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/fault10.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/fault2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/fault2.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/fault3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/fault3.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/fault4.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/fault4.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/fault5.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/fault5.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/fault6.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/fault6.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/fault7.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/fault7.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/fault8.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/fault8.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/fault9.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/fault9.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/ferrari1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/ferrari1.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/ferrari2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/ferrari2.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/ferrari3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/ferrari3.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/ferrari4.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/ferrari4.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/ferrari5.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/ferrari5.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/ferrari6.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/ferrari6.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/frog1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/frog1.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/frog2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/frog2.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/frog3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/frog3.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/frog4.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/frog4.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/gameover1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/gameover1.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/gameover2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/gameover2.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/gameover3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/gameover3.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/gesar1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/gesar1.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/shakespeare1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/shakespeare1.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/shakespeare2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/shakespeare2.mp3 -------------------------------------------------------------------------------- /app/pages/bao/sounds/winnie1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/bao/sounds/winnie1.mp3 -------------------------------------------------------------------------------- /app/pages/clock/clock.css: -------------------------------------------------------------------------------- 1 | .right { 2 | float: right; 3 | } 4 | 5 | .left { 6 | float: left; 7 | } 8 | 9 | .clear { 10 | clear: both; 11 | } 12 | 13 | body { 14 | text-align: center; 15 | } 16 | 17 | .h1, 18 | h1 { 19 | font-size: 2.5rem; 20 | font-family: "Microsoft YaHei", 微软雅黑; 21 | font-weight: 500; 22 | line-height: 1.1; 23 | text-align: center; 24 | color: #6c757d; 25 | margin-bottom: 0px; 26 | margin-top: 0px; 27 | } 28 | 29 | .btn-danger { 30 | color: #fff; 31 | background-color: #d9534f; 32 | border-color: #d9534f; 33 | } 34 | 35 | .btn { 36 | display: inline-block; 37 | font-weight: 400; 38 | line-height: 1.25; 39 | text-align: center; 40 | white-space: nowrap; 41 | vertical-align: middle; 42 | -webkit-user-select: none; 43 | -moz-user-select: none; 44 | -ms-user-select: none; 45 | user-select: none; 46 | border: 1px solid transparent; 47 | border-top-color: transparent; 48 | border-right-color: transparent; 49 | border-bottom-color: transparent; 50 | border-left-color: transparent; 51 | padding: .5rem 1rem; 52 | font-size: 1rem; 53 | border-radius: .25rem; 54 | -webkit-transition: all .2s ease-in-out; 55 | -o-transition: all .2s ease-in-out; 56 | transition: all .2s ease-in-out; 57 | } 58 | 59 | .form-control { 60 | background-image: linear-gradient(0deg, #499EF3 2px, rgba(0, 150, 136, 0) 0), linear-gradient(0deg, rgba(0, 0, 0, .26) 1px, transparent 0); 61 | } 62 | 63 | body { 64 | background: #ffffff; 65 | } 66 | 67 | .inline { 68 | margin-top: -44px; 69 | margin-right: 1em; 70 | } 71 | 72 | small { 73 | font-family: "Microsoft YaHei", 微软雅黑; 74 | color: #6c757d; 75 | margin-left: 0.5em; 76 | } -------------------------------------------------------------------------------- /app/pages/clock/clock.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 续命时钟 8 | 9 | 10 | 11 | 12 |
13 | 每分钟为长者献上你的1s的同时,切身感受到时间流逝变慢,你也可以点击红色的按钮手动+1s 14 |
15 |
16 |
17 |
18 | 19 |
20 |

21 |
22 | 23 |
24 | 累计已续命: 25 |
26 |

???s (获取中, 请稍后)

27 | +1s 28 |
29 | 30 | 31 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/pages/clock/clock.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 续命时钟 3 | * @author Xmader 4 | * @copyright Copyright (c) 2018-2019 Xmader 5 | */ 6 | 7 | const now = new Date() 8 | 9 | const add_0 = (i) => { 10 | if (i < 10) { i = "0" + i } 11 | return i 12 | } 13 | 14 | const update_clock = () => { 15 | const y = add_0(now.getFullYear()) 16 | const mo = add_0(now.getMonth()) 17 | const d = add_0(now.getDate()) 18 | 19 | const h = add_0(now.getHours()) 20 | const m = add_0(now.getMinutes()) 21 | const s = add_0(now.getSeconds()) 22 | 23 | if (s == 58) { 24 | now.setTime(now.getTime() + 1000) 25 | increase_time() 26 | } 27 | document.getElementById("clock").innerHTML = y + "-" + mo + "-" + d + " " + h + ":" + m + ":" + s 28 | 29 | now.setTime(now.getTime() + 1000) // 单位: 毫秒 30 | } 31 | 32 | update_clock() 33 | setInterval(update_clock, 60000 / 59) 34 | setInterval(increase_time, 1000, true) 35 | -------------------------------------------------------------------------------- /app/pages/clock/xuming.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Xmader 3 | * @copyright Copyright (c) 2018-2019 Xmader 4 | */ 5 | 6 | /** 7 | * 格式化已续命时间 8 | * @param {number} t - 已续命时间 (单位:秒) 9 | * 10 | * 代码来自: https://angry.im/ 11 | */ 12 | const formatTime = (t) => { 13 | if (t == 0) return "0s" 14 | let ret = "" 15 | if (t > 60 * 60 * 24 * 30 * 12) { 16 | ret += Math.floor(t / (60 * 60 * 24 * 30 * 12)) + "y " 17 | t = t % (60 * 60 * 24 * 30 * 12) 18 | } 19 | 20 | if (t > 60 * 60 * 24 * 30) { 21 | ret += Math.floor(t / (60 * 60 * 24 * 30)) + "mo " 22 | t = t % (60 * 60 * 24 * 30) 23 | } 24 | 25 | if (t > 60 * 60 * 24) { 26 | ret += Math.floor(t / (60 * 60 * 24)) + "d " 27 | t = t % (60 * 60 * 24) 28 | } 29 | 30 | if (t > 60 * 60) { 31 | ret += Math.floor(t / (60 * 60)) + "h " 32 | t = t % (60 * 60) 33 | } 34 | 35 | if (t > 60) { 36 | ret += Math.floor(t / (60)) + "m " 37 | t = t % (60) 38 | } 39 | 40 | if (t > 0) { 41 | ret += Math.floor(t) + "s" 42 | t = 0 43 | } 44 | 45 | return ret.trim() 46 | } 47 | 48 | /** 49 | * 续命1s,并获取已续命时间 (单位:秒) 50 | * @param {boolean} get_only - 是否只获取已续命时间,不续命1s 51 | * @see 续命API: https://angry.im/ 52 | */ 53 | const increase_time = async (get_only = false) => { 54 | try { 55 | const res = get_only ? await fetch("https://angry.im/l/life", { 56 | method: "GET", 57 | mode: "cors" 58 | }) : await fetch("https://angry.im/p/life", { 59 | method: "POST", 60 | mode: "cors" 61 | }) 62 | const time = await res.text() | 0 63 | document.getElementById("time").innerText = formatTime(time) 64 | } 65 | catch (e) { 66 | console.error(e) 67 | console.error("你们这样子啊, 是不行的!") 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /app/pages/flappy_frog/icons/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/icons/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /app/pages/flappy_frog/icons/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/icons/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /app/pages/flappy_frog/icons/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/icons/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /app/pages/flappy_frog/icons/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/icons/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /app/pages/flappy_frog/icons/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/icons/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /app/pages/flappy_frog/icons/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/icons/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /app/pages/flappy_frog/icons/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/icons/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /app/pages/flappy_frog/icons/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/icons/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /app/pages/flappy_frog/icons/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/icons/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /app/pages/flappy_frog/images/clouds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/images/clouds.png -------------------------------------------------------------------------------- /app/pages/flappy_frog/images/frog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/images/frog.png -------------------------------------------------------------------------------- /app/pages/flappy_frog/images/ground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/images/ground.png -------------------------------------------------------------------------------- /app/pages/flappy_frog/images/pipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/images/pipe.png -------------------------------------------------------------------------------- /app/pages/flappy_frog/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Flappy Frog 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 46 | 47 | 48 |
49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /app/pages/flappy_frog/js/clouds.js: -------------------------------------------------------------------------------- 1 | require.register('clouds.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | var utils = require('utils'); 6 | var preloadSpritesheet = utils.preloadSpritesheet; 7 | 8 | var settings = global.settings; 9 | 10 | var cloudGroup; 11 | 12 | var spawnTime = Math.random(), timeElapsed = 0; 13 | 14 | function resetCloud(cloud) { 15 | cloud.x = global.phaserGame.width; 16 | cloud.y = Math.random() * global.phaserGame.height / 2; 17 | cloud.frame = Math.floor(4 * Math.random()); 18 | var cloudScale = 2 + 2 * Math.random(); 19 | cloud.alpha = 2 / cloudScale; 20 | if (cloud.alpha > 0.7) 21 | cloud.alpha = 0.7; 22 | cloud.scale.setTo(cloudScale, cloudScale); 23 | cloud.body.velocity.x = -settings.speed / cloudScale; 24 | } 25 | 26 | function spawn() { 27 | var cloud = cloudGroup.getFirstDead(); 28 | if (cloud) { 29 | cloud.revive(); 30 | } else { 31 | cloud = cloudGroup.create(global.phaserGame.width, global.phaserGame.height, 'clouds'); 32 | } 33 | resetCloud(cloud); 34 | } 35 | 36 | exports.update = function() { 37 | cloudGroup.forEachAlive(function(cloud) { 38 | if (cloud.x + cloud.width < global.phaserGame.world.bounds.left) { 39 | cloud.kill(); 40 | } 41 | }); 42 | 43 | timeElapsed += global.phaserGame.time.physicsElapsed; 44 | if (timeElapsed >= spawnTime) { 45 | spawnTime = 4 * Math.random(); 46 | timeElapsed = 0; 47 | spawn(); 48 | } 49 | 50 | //console.log(cloudGroup.length); 51 | }; 52 | 53 | exports.preload = function() { 54 | preloadSpritesheet('clouds', 128, 64); 55 | }; 56 | 57 | exports.create = function() { 58 | cloudGroup = global.phaserGame.add.group(); 59 | }; 60 | 61 | }); 62 | -------------------------------------------------------------------------------- /app/pages/flappy_frog/js/global.js: -------------------------------------------------------------------------------- 1 | require.register('global.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | exports.font = '"Segoe UI", "Microsoft YaHei", 宋体, sans-serif'; 5 | 6 | exports.settings = { 7 | gravity: 40, 8 | flap: 620, 9 | speed: 390, 10 | spacing: 468, 11 | gap: 300, 12 | ceiling: false, 13 | canvas: true, 14 | antialias: false, 15 | debug: false, 16 | scoreSounds: 43, 17 | hurtSounds: 21 18 | }; 19 | 20 | }); 21 | -------------------------------------------------------------------------------- /app/pages/flappy_frog/js/main.js: -------------------------------------------------------------------------------- 1 | require.register('main.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | var sounds = require('sounds'); 6 | var scene = require('scene'); 7 | var utils = require('utils'); 8 | 9 | var settings = global.settings; 10 | 11 | function preload() { 12 | global.phaserGame.stage.scaleMode = Phaser.StageScaleMode.SHOW_ALL; 13 | global.phaserGame.stage.scale.setScreenSize(true); 14 | 15 | sounds.preload(); 16 | scene.preload(); 17 | } 18 | 19 | function create() { 20 | sounds.create(); 21 | scene.create(); 22 | scene.shift('title'); 23 | } 24 | 25 | function update() { 26 | scene.update(); 27 | } 28 | 29 | function render() { 30 | scene.render(); 31 | } 32 | 33 | exports.run = function() { 34 | utils.loadSettingsFromUrl(); 35 | 36 | var width = 480; 37 | var height = 700; 38 | 39 | var availWidth = document.body.offsetWidth; 40 | var availHeight = document.body.offsetHeight; 41 | if (availWidth > availHeight) { 42 | var w = availWidth; 43 | availWidth = availHeight; 44 | availHeight = w; 45 | } 46 | 47 | var device = new Phaser.Device(); 48 | if (availWidth >= 320 && availHeight >= 480 && availHeight <= 1280) { 49 | if (!device.desktop || settings.mobile) { 50 | width = availWidth; 51 | height = availHeight; 52 | } 53 | } 54 | console.log(device.desktop ? 'desktop' : 'mobile', width, 'x', height); 55 | 56 | global.phaserGame = new Phaser.Game( 57 | width, 58 | height, 59 | settings.canvas ? Phaser.CANVAS : Phaser.AUTO, 60 | document.getElementById('game'), 61 | { 62 | preload: preload, 63 | create: create, 64 | update: update, 65 | render: render 66 | }, 67 | false, 68 | settings.antialias 69 | ); 70 | }; 71 | 72 | }); 73 | -------------------------------------------------------------------------------- /app/pages/flappy_frog/js/require.js: -------------------------------------------------------------------------------- 1 | (function(global) { 2 | 'use strict'; 3 | 4 | var modules = {}; 5 | 6 | var require = function(id) { 7 | if (!/\.js$/.test(id)) 8 | id += '.js'; 9 | var module = modules[id]; 10 | if (!module.exports) { 11 | module.exports = {}; 12 | module.call(this, module.exports, require, module); 13 | } 14 | return module.exports; 15 | }; 16 | 17 | require.register = function(id, func) { 18 | modules[id] = func; 19 | }; 20 | 21 | global.require = require; 22 | })(this); 23 | -------------------------------------------------------------------------------- /app/pages/flappy_frog/js/sounds.js: -------------------------------------------------------------------------------- 1 | require.register('sounds.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | var utils = require('utils'); 6 | var preloadAudio = utils.preloadAudio; 7 | var settings = global.settings; 8 | 9 | function SoundArray(name, opts) { 10 | this.sounds = []; 11 | this.name = name; 12 | this.count = opts.count || 0; 13 | this.currentIndex = 0; 14 | this.recentIndex = 0; 15 | this.loop = !!opts.loop; 16 | this.playing = false; 17 | this.manuallyStopped = false; 18 | } 19 | 20 | SoundArray.prototype.preload = function() { 21 | if (!this.count) { 22 | preloadAudio(this.name); 23 | return; 24 | } 25 | 26 | var key, name = this.name; 27 | for (var i = 0, l = this.count; i < l; i++) { 28 | key = name + '/' + (i + 1); 29 | preloadAudio(key); 30 | } 31 | }; 32 | 33 | SoundArray.prototype.createSound = function(key) { 34 | var sound = global.phaserGame.add.audio(key); 35 | sound.onStop.add(this.onStop, this); 36 | return sound; 37 | }; 38 | 39 | SoundArray.prototype.create = function() { 40 | if (!this.count) { 41 | this.sounds[0] = this.createSound(this.name); 42 | this.count = 1; 43 | return; 44 | } 45 | 46 | var key, name = this.name; 47 | for (var i = 0, l = this.count; i < l; i++) { 48 | key = name + '/' + (i + 1); 49 | this.sounds[i] = this.createSound(key); 50 | } 51 | }; 52 | 53 | SoundArray.prototype.random = function() { 54 | if (this.count === 1) { 55 | return; 56 | } 57 | var index = Math.floor(Math.random() * this.count); 58 | if (this.count < 5) { 59 | this.currentIndex = index; 60 | return; 61 | } 62 | if ( (index !== this.currentIndex && index !== this.recentIndex) || 63 | (index === this.currentIndex && index === this.recentIndex) ) { 64 | this.recentIndex = this.currentIndex; 65 | this.currentIndex = index; 66 | return; 67 | } 68 | return this.random(); 69 | } 70 | 71 | SoundArray.prototype.getSound = function() { 72 | return this.sounds[this.currentIndex]; 73 | }; 74 | 75 | SoundArray.prototype.isPlaying = function() { 76 | return this.playing; 77 | }; 78 | 79 | SoundArray.prototype.onStop = function() { 80 | if (this.loop && !this.manuallyStopped) { 81 | this.play(); 82 | return; 83 | } 84 | this.playing = false; 85 | }; 86 | 87 | SoundArray.prototype.playSound = function() { 88 | this.playing = true; 89 | this.getSound().play(); 90 | }; 91 | 92 | SoundArray.prototype.play = function() { 93 | this.manuallyStopped = false; 94 | this.random(); 95 | this.playSound(); 96 | if (settings.debug) 97 | console.log('sound', this.name, this.currentIndex + 1); 98 | }; 99 | 100 | SoundArray.prototype.playCustom = function(id) { 101 | this.manuallyStopped = true; 102 | this.currentIndex = id - 1; 103 | this.playSound(); 104 | }; 105 | 106 | SoundArray.prototype.stop = function() { 107 | this.manuallyStopped = true; 108 | this.getSound().stop(); 109 | }; 110 | 111 | SoundArray.prototype.toggle = function() { 112 | this.playing ? this.stop() : this.play(); 113 | }; 114 | 115 | var sounds; 116 | 117 | exports = function(name) { 118 | return sounds[name]; 119 | }; 120 | 121 | exports.preload = function() { 122 | sounds = { 123 | 'bgm': {loop: true}, 124 | 'crash': {}, 125 | 'flap': {}, 126 | 'ha': {}, 127 | 'hurt': {count: settings.hurtSounds}, 128 | 'score': {count: settings.scoreSounds} 129 | }; 130 | 131 | var opts; 132 | for (var name in sounds) { 133 | opts = sounds[name]; 134 | sounds[name] = new SoundArray(name, opts); 135 | sounds[name].preload(); 136 | } 137 | }; 138 | 139 | exports.create = function() { 140 | for (var name in sounds) { 141 | sounds[name].create(); 142 | } 143 | }; 144 | 145 | module.exports = exports; 146 | 147 | }); 148 | -------------------------------------------------------------------------------- /app/pages/flappy_frog/js/utils.js: -------------------------------------------------------------------------------- 1 | require.register('utils.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | 6 | exports.preloadImage = function(key) { 7 | var path = 'images/' + key + '.png'; 8 | global.phaserGame.load.image(key, path); 9 | }; 10 | 11 | exports.preloadSpritesheet = function(key, w, h) { 12 | var path = 'images/' + key + '.png'; 13 | global.phaserGame.load.spritesheet(key, path, w, h); 14 | }; 15 | 16 | exports.preloadAudio = function(key) { 17 | var path = 'sounds/' + key + '.mp3'; 18 | global.phaserGame.load.audio(key, path); 19 | }; 20 | 21 | exports.overlapAABB = function(left1, top1, right1, bottom1, left2, top2, right2, bottom2) { 22 | return left1 < right2 && 23 | right1 > left2 && 24 | top1 < bottom2 && 25 | bottom1 > top2; 26 | }; 27 | 28 | // https://goo.gl/7K7WLu 29 | exports.unlockAudioContext = function() { 30 | var context = global.phaserGame.sound.context; 31 | if (context && context.state === 'suspended') { 32 | context.resume(); 33 | } 34 | }; 35 | 36 | 37 | exports.parseQueryString = function(qs){ 38 | var result = {}, pairs = qs.split('&'), keyValue; 39 | for(var i = 0, l = pairs.length; i < l; i++) { 40 | keyValue = pairs[i].split('='); 41 | result[keyValue[0]] = decodeURIComponent(keyValue[1]); 42 | } 43 | return result; 44 | }; 45 | 46 | exports.loadSettingsFromUrl = function() { 47 | var qs = window.location.search.substr(1); 48 | if (!qs) 49 | return; 50 | 51 | qs = exports.parseQueryString(qs); 52 | var settings = global.settings, k, v; 53 | 54 | for (k in qs) { 55 | v = qs[k]; 56 | if (!v.length) 57 | continue; 58 | else if (v === 'undefined') 59 | v = undefined; 60 | else if (v === 'null') 61 | v = null; 62 | else if (v === 'true') 63 | v = true; 64 | else if (v === 'false') 65 | v = false; 66 | else if (v[0] === "'" && v[v.length - 1] === "'") 67 | v = v.substring(1, v.length - 1); 68 | else 69 | v = Number(v); 70 | 71 | settings[k] = v; 72 | } 73 | }; 74 | 75 | }); 76 | -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/bgm.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/bgm.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/crash.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/crash.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/flap.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/flap.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/ha.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/ha.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/1.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/10.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/10.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/11.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/11.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/12.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/12.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/13.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/13.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/14.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/14.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/15.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/15.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/16.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/16.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/17.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/17.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/18.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/18.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/19.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/19.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/2.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/20.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/20.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/21.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/21.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/3.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/4.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/4.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/5.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/5.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/6.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/6.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/7.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/7.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/8.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/8.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/hurt/9.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/hurt/9.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/1.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/10.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/10.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/11.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/11.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/12.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/12.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/13.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/13.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/14.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/14.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/15.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/15.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/16.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/16.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/17.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/17.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/18.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/18.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/19.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/19.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/2.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/20.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/20.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/21.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/21.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/22.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/22.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/23.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/23.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/24.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/24.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/25.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/25.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/26.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/26.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/27.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/27.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/28.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/28.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/29.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/29.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/3.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/30.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/30.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/31.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/31.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/32.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/32.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/33.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/33.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/34.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/34.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/35.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/35.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/36.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/36.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/37.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/37.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/38.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/38.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/39.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/39.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/4.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/4.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/40.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/40.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/41.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/41.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/42.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/42.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/43.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/43.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/5.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/5.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/6.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/6.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/7.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/7.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/8.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/8.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_frog/sounds/score/9.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_frog/sounds/score/9.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/icons/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/icons/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/icons/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/icons/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/icons/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/icons/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/icons/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/icons/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/icons/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/icons/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/icons/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/icons/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/icons/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/icons/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/icons/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/icons/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/icons/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/icons/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/images/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/images/background.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/images/gameover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/images/gameover.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/images/ground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/images/ground.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/images/pipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/images/pipe.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/images/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/images/play.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/images/restart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/images/restart.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/images/scoreboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/images/scoreboard.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/images/winnie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/images/winnie.png -------------------------------------------------------------------------------- /app/pages/flappy_winnie/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Flappy Winnie 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 46 | 47 | 48 |
49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /app/pages/flappy_winnie/js/global.js: -------------------------------------------------------------------------------- 1 | require.register('global.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | exports.settings = { 5 | gravity: 1000, 6 | flap: 300, 7 | speed: 200, 8 | spacing: 350, 9 | gapMin: 220, 10 | gapMax: 260, 11 | canvas: true, 12 | antialias: false, 13 | debug: false, 14 | scoreSounds: 27 15 | }; 16 | 17 | }); 18 | -------------------------------------------------------------------------------- /app/pages/flappy_winnie/js/main.js: -------------------------------------------------------------------------------- 1 | require.register('main.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | var sounds = require('sounds'); 6 | var scene = require('scene'); 7 | var utils = require('utils'); 8 | 9 | var settings = global.settings; 10 | 11 | function preload() { 12 | global.phaserGame.stage.scaleMode = Phaser.StageScaleMode.SHOW_ALL; 13 | global.phaserGame.stage.scale.setScreenSize(true); 14 | 15 | sounds.preload(); 16 | scene.preload(); 17 | } 18 | 19 | function create() { 20 | sounds.create(); 21 | scene.create(); 22 | scene.shift('title'); 23 | } 24 | 25 | function update() { 26 | scene.update(); 27 | } 28 | 29 | function render() { 30 | scene.render(); 31 | } 32 | 33 | exports.run = function() { 34 | utils.loadSettingsFromUrl(); 35 | 36 | var width = 600; 37 | var height = 800; 38 | 39 | var availWidth = document.body.offsetWidth; 40 | var availHeight = document.body.offsetHeight; 41 | if (availWidth > availHeight) { 42 | var w = availWidth; 43 | availWidth = availHeight; 44 | availHeight = w; 45 | } 46 | 47 | var device = new Phaser.Device(); 48 | if (availWidth >= 320 && availHeight >= 480 && availHeight <= 1280) { 49 | if (!device.desktop) { 50 | width = availWidth; 51 | height = availHeight; 52 | } 53 | } 54 | console.log(device.desktop ? 'desktop' : 'mobile', width, 'x', height); 55 | 56 | global.phaserGame = new Phaser.Game( 57 | width, 58 | height, 59 | settings.canvas ? Phaser.CANVAS : Phaser.AUTO, 60 | document.getElementById('game'), 61 | { 62 | preload: preload, 63 | create: create, 64 | update: update, 65 | render: render 66 | }, 67 | false, 68 | settings.antialias 69 | ); 70 | }; 71 | 72 | }); 73 | -------------------------------------------------------------------------------- /app/pages/flappy_winnie/js/require.js: -------------------------------------------------------------------------------- 1 | (function(global) { 2 | 'use strict'; 3 | 4 | var modules = {}; 5 | 6 | var require = function(id) { 7 | if (!/\.js$/.test(id)) 8 | id += '.js'; 9 | var module = modules[id]; 10 | if (!module.exports) { 11 | module.exports = {}; 12 | module.call(this, module.exports, require, module); 13 | } 14 | return module.exports; 15 | }; 16 | 17 | require.register = function(id, func) { 18 | modules[id] = func; 19 | }; 20 | 21 | global.require = require; 22 | })(this); 23 | -------------------------------------------------------------------------------- /app/pages/flappy_winnie/js/sounds.js: -------------------------------------------------------------------------------- 1 | require.register('sounds.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | var preloadAudio = require('utils').preloadAudio; 6 | var settings = global.settings; 7 | 8 | function SoundArray(name, opts) { 9 | this.sounds = []; 10 | this.name = name; 11 | this.count = opts.count; 12 | this.currentIndex = 0; 13 | this.recentIndex = 0; 14 | } 15 | 16 | SoundArray.prototype.preload = function() { 17 | var key, name = this.name; 18 | for (var i = 0, l = this.count; i < l; i++) { 19 | key = name + (i + 1); 20 | preloadAudio(key); 21 | } 22 | } 23 | 24 | SoundArray.prototype.create = function() { 25 | var key, name = this.name; 26 | for (var i = 0, l = this.count; i < l; i++) { 27 | key = name + (i + 1); 28 | this.sounds[i] = global.phaserGame.add.audio(key); 29 | } 30 | } 31 | 32 | SoundArray.prototype.random = function() { 33 | if (this.count === 1) { 34 | return; 35 | } 36 | var index = Math.floor(Math.random() * this.count); 37 | if (this.count < 5) { 38 | this.currentIndex = index; 39 | return; 40 | } 41 | if (index !== this.currentIndex && index !== this.recentIndex) { 42 | this.recentIndex = this.currentIndex; 43 | this.currentIndex = index; 44 | return; 45 | } 46 | return this.random(); 47 | } 48 | 49 | SoundArray.prototype.getSound = function() { 50 | return this.sounds[this.currentIndex]; 51 | } 52 | 53 | SoundArray.prototype.isPlaying = function() { 54 | return this.getSound().isPlaying; 55 | } 56 | 57 | SoundArray.prototype.play = function() { 58 | this.random(); 59 | this.getSound().play(); 60 | } 61 | 62 | SoundArray.prototype.stop = function() { 63 | this.getSound().stop(); 64 | } 65 | 66 | function Sound(name) { 67 | this.sound; 68 | this.name = name; 69 | } 70 | 71 | Sound.prototype.preload = function() { 72 | preloadAudio(this.name); 73 | } 74 | 75 | Sound.prototype.create = function() { 76 | this.sound = global.phaserGame.add.audio(this.name); 77 | } 78 | 79 | Sound.prototype.getSound = function() { 80 | return this.sound; 81 | } 82 | 83 | Sound.prototype.isPlaying = function() { 84 | return this.getSound().isPlaying; 85 | } 86 | 87 | Sound.prototype.play = function() { 88 | this.getSound().play(); 89 | } 90 | 91 | Sound.prototype.stop = function() { 92 | this.getSound().stop(); 93 | } 94 | 95 | var sounds; 96 | 97 | exports = function(name) { 98 | return sounds[name]; 99 | }; 100 | 101 | exports.preload = function() { 102 | sounds = { 103 | 'crash': {}, 104 | 'ouch': {}, 105 | 'flap': {}, 106 | 'gameover': {}, 107 | 'score': {count: settings.scoreSounds} 108 | }; 109 | 110 | var opts; 111 | for (var name in sounds) { 112 | opts = sounds[name]; 113 | if (opts.count) 114 | sounds[name] = new SoundArray(name, opts); 115 | else 116 | sounds[name] = new Sound(name); 117 | sounds[name].preload(); 118 | } 119 | }; 120 | 121 | exports.create = function() { 122 | for (var name in sounds) { 123 | sounds[name].create(); 124 | } 125 | }; 126 | 127 | module.exports = exports; 128 | 129 | }); 130 | -------------------------------------------------------------------------------- /app/pages/flappy_winnie/js/utils.js: -------------------------------------------------------------------------------- 1 | require.register('utils.js', function(exports, require, module) { 2 | 'use strict'; 3 | 4 | var global = require('global'); 5 | 6 | exports.preloadImage = function(key) { 7 | var path = 'images/' + key + '.png'; 8 | global.phaserGame.load.image(key, path); 9 | }; 10 | 11 | exports.preloadAudio = function(key) { 12 | var path = 'sounds/' + key + '.mp3'; 13 | global.phaserGame.load.audio(key, path); 14 | }; 15 | 16 | exports.overlapAABB = function(left1, top1, right1, bottom1, left2, top2, right2, bottom2) { 17 | return left1 < right2 && 18 | right1 > left2 && 19 | top1 < bottom2 && 20 | bottom1 > top2; 21 | }; 22 | 23 | // https://goo.gl/7K7WLu 24 | exports.unlockAudioContext = function() { 25 | var context = global.phaserGame.sound.context; 26 | if (context && context.state === 'suspended') { 27 | context.resume(); 28 | } 29 | }; 30 | 31 | 32 | exports.parseQueryString = function(qs){ 33 | var result = {}, pairs = qs.split('&'), keyValue; 34 | for(var i = 0, l = pairs.length; i < l; i++) { 35 | keyValue = pairs[i].split('='); 36 | result[keyValue[0]] = decodeURIComponent(keyValue[1]); 37 | } 38 | return result; 39 | }; 40 | 41 | exports.loadSettingsFromUrl = function() { 42 | var qs = window.location.search.substr(1); 43 | if (!qs) 44 | return; 45 | 46 | qs = exports.parseQueryString(qs); 47 | var settings = global.settings, k, v; 48 | 49 | for (k in qs) { 50 | v = qs[k]; 51 | if (!v.length) 52 | continue; 53 | else if (v === 'undefined') 54 | v = undefined; 55 | else if (v === 'null') 56 | v = null; 57 | else if (v === 'true') 58 | v = true; 59 | else if (v === 'false') 60 | v = false; 61 | else if (v[0] === "'" && v[v.length - 1] === "'") 62 | v = v.substring(1, v.length - 1); 63 | else 64 | v = Number(v); 65 | 66 | settings[k] = v; 67 | } 68 | }; 69 | 70 | }); 71 | -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/crash.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/crash.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/flap.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/flap.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/gameover.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/gameover.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/ouch.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/ouch.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score1.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score10.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score10.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score11.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score11.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score12.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score12.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score13.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score13.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score14.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score14.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score15.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score15.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score16.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score16.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score17.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score17.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score18.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score18.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score19.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score19.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score2.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score20.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score20.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score21.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score21.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score22.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score22.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score23.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score23.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score24.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score24.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score25.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score25.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score26.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score26.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score27.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score27.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score3.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score4.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score4.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score5.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score5.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score6.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score6.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score7.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score7.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score8.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score8.mp3 -------------------------------------------------------------------------------- /app/pages/flappy_winnie/sounds/score9.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Xmader/mohu/ca657ccba3b11670d67ee8d53d60f61e29f0e777/app/pages/flappy_winnie/sounds/score9.mp3 -------------------------------------------------------------------------------- /app/pages/landing.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 膜乎APP 7 | 12 | 13 | 14 | 15 |
16 | 17 |
18 |
19 |
20 |
21 |
22 |
23 | 24 |
25 | 膜乎APP 26 |
27 | 28 | 31 | 32 |
33 | 74 | 75 | 126 | 127 | 128 | -------------------------------------------------------------------------------- /app/pre.js: -------------------------------------------------------------------------------- 1 | /** 2 | * pre.js - 用于外部页面的预加载脚本 3 | * @author Xmader 4 | * @copyright Copyright (c) 2018-2019 Xmader 5 | */ 6 | 7 | const { ipcRenderer } = require("electron") 8 | const protocol = location.protocol 9 | 10 | // 判断是否是外部页面 11 | if (protocol.startsWith("http")) { 12 | // 判断是否是膜法指南或乳包指南页面 13 | const is_manual_page = location.href.includes("manual") && location.host.includes("github.io") 14 | 15 | // 添加右键菜单 16 | window.addEventListener("contextmenu", (e) => { 17 | e.preventDefault() 18 | ipcRenderer.send("right_btn", is_manual_page) 19 | }) 20 | } 21 | 22 | if (location.host.includes("zh.wikipedia.org")) { 23 | document.addEventListener("DOMContentLoaded", () => { 24 | document.body.style.fontFamily = '"Helvetica Neue", "STHeiti", "微软雅黑", "Microsoft YaHei", Helvetica, Arial, sans-serif' 25 | }, { once: true }) 26 | } 27 | -------------------------------------------------------------------------------- /app/src/check_update.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 检查更新 3 | * @author Xmader 4 | * @copyright Copyright (c) 2018-2019 Xmader 5 | */ 6 | 7 | const fetch = require("../libs/node-fetch") 8 | const path = require("path") 9 | const { dialog, shell, app } = require("electron") 10 | 11 | const platform = process.platform 12 | let arch = process.arch 13 | if (arch == "x32") arch = "ia32" 14 | 15 | const versionCheckApi = "https://raw.githubusercontent.com/Xmader/mohu/master/app/package.json" 16 | const getReleasesApi = "https://api.github.com/repos/Xmader/mohu/releases/latest" 17 | 18 | /** 19 | * @param {string} version 20 | * @param {string} new_version 21 | */ 22 | const found_new_version = (version, new_version) => { 23 | shell.beep() // 播放提示音 24 | dialog.showMessageBox({ 25 | type: "question", 26 | buttons: ["下载", "取消"], 27 | defaultId: 0, 28 | cancelId: 1, 29 | title: "发现新版本!", 30 | message: "是否要下载新版本?", 31 | detail: `当前版本: v${version} ,\n新版本: v${new_version} `, 32 | icon: path.join(__dirname, "../assets/logo.png"), 33 | }, (response) => { 34 | if (response == 0) { 35 | const DownloadUrl = `https://github.com/Xmader/mohu/releases/download/v${new_version}/MohuAPP-${platform}-${arch}.zip` 36 | shell.openExternal(DownloadUrl) 37 | } 38 | }) 39 | } 40 | 41 | /** 42 | * 检查更新 43 | */ 44 | const check_update = async (manual = false) => { 45 | const req = await fetch(versionCheckApi) 46 | const data = await req.json() 47 | 48 | const version = app.getVersion() // 当前版本号, 在package.json中定义 49 | const version_formatted = format_version(version) 50 | 51 | const new_version = data["version"] 52 | const new_version_formatted = format_version(new_version) 53 | 54 | if (version_formatted < new_version_formatted) { 55 | try { 56 | const releases = await (await fetch(getReleasesApi)).json() 57 | if (releases.name != `v${new_version}` || releases.assets.length != 4) { 58 | return manual && dialog.showMessageBox({ 59 | type: "warning", 60 | buttons: ["重试", "取消"], 61 | defaultId: 0, 62 | cancelId: 1, 63 | title: "膜乎APP", 64 | message: `已发现新版本, 但最新版本 v${new_version} 正在构建中, 请耐心等候...` 65 | }, (response) => { 66 | if (response == 0) { 67 | check_update(true) 68 | } 69 | }) 70 | } 71 | } 72 | catch (e) { 73 | console.error("访问GithubAPI失败") 74 | } 75 | 76 | found_new_version(version, new_version) 77 | } else if (manual) { 78 | dialog.showMessageBox({ 79 | type: "warning", 80 | buttons: ["确定"], 81 | defaultId: 0, 82 | cancelId: 1, 83 | title: "没有更新的版本", 84 | message: `当前版本 v${version} 是最新版本!` 85 | }) 86 | } 87 | } 88 | 89 | /** 90 | * @param {string} e - 需要被格式化的版本号字符串 91 | */ 92 | const format_version = (e) => { 93 | return e.split(".").map((e) => +e) 94 | } 95 | 96 | module.exports = check_update 97 | 98 | -------------------------------------------------------------------------------- /app/src/context_menu.js: -------------------------------------------------------------------------------- 1 | const { BrowserWindow, Menu } = require("electron") 2 | 3 | //给文本框增加右键菜单 4 | const contextMenuTemplate = [ 5 | { 6 | label: "转到上一页", 7 | id: "context_goBack", 8 | enabled: false, 9 | click: () => { 10 | BrowserWindow.getFocusedWindow().webContents.goBack() 11 | } 12 | }, 13 | { 14 | label: "转到下一页", 15 | id: "context_goForward", 16 | enabled: false, 17 | click: () => { 18 | BrowserWindow.getFocusedWindow().webContents.goForward() 19 | } 20 | }, 21 | { type: "separator" }, //分隔线 22 | { label: "剪切", role: "cut" }, //Cut菜单项 23 | { label: "复制", role: "copy" }, //Copy菜单项 24 | { label: "粘贴", role: "paste" }, //Paste菜单项 25 | { label: "删除", role: "delete" }, //Delete菜单项 26 | { type: "separator" }, //分隔线 27 | { label: "全选", role: "selectall" } //Select All菜单项 28 | ] 29 | 30 | const contextMenu = Menu.buildFromTemplate(contextMenuTemplate) 31 | const manualPageContextMenu = Menu.buildFromTemplate(contextMenuTemplate.slice(3)) 32 | 33 | module.exports = { 34 | contextMenu, 35 | manualPageContextMenu 36 | } -------------------------------------------------------------------------------- /app/src/copy_current_url.js: -------------------------------------------------------------------------------- 1 | /** 2 | * copy_current_url.js - 复制当前URL到剪贴板 3 | * @author Xmader 4 | * @copyright Copyright (c) 2018-2019 Xmader 5 | */ 6 | 7 | const { dialog, BrowserWindow, clipboard } = require("electron") 8 | 9 | module.exports = () => { 10 | const url = decodeURI(BrowserWindow.getFocusedWindow().webContents.getURL()) 11 | 12 | clipboard.writeText(url) 13 | 14 | dialog.showMessageBox({ 15 | type: "info", 16 | buttons: ["确定"], 17 | defaultId: 0, 18 | title: "复制成功", 19 | message: `已复制 '${ 20 | new Array(Math.ceil(url.length / 50)).fill(null).map((x, i) => url.slice(i * 50, (i + 1) * 50)).join("\n") // 每50个字符换行,否则会显示不完整 21 | }' 到剪贴板`, 22 | }) 23 | } -------------------------------------------------------------------------------- /app/src/menu.js: -------------------------------------------------------------------------------- 1 | const { BrowserWindow } = require("electron") 2 | 3 | const { contextMenu, manualPageContextMenu } = require("./context_menu") 4 | const { menu } = require("./app_menu") 5 | 6 | const refresh_menu = () => { 7 | const mainWindow = BrowserWindow.fromId(2) 8 | menu.getMenuItemById("goBack").enabled = mainWindow.webContents.canGoBack() 9 | menu.getMenuItemById("goForward").enabled = mainWindow.webContents.canGoForward() 10 | contextMenu.getMenuItemById("context_goBack").enabled = mainWindow.webContents.canGoBack() 11 | contextMenu.getMenuItemById("context_goForward").enabled = mainWindow.webContents.canGoForward() 12 | } 13 | 14 | const showContextMenu = (event, is_manual_page) => { 15 | const context_menu = is_manual_page ? manualPageContextMenu : contextMenu 16 | refresh_menu() 17 | context_menu.popup({}) 18 | } 19 | 20 | module.exports = { 21 | menu, 22 | refresh_menu, 23 | showContextMenu 24 | } -------------------------------------------------------------------------------- /update_history.md: -------------------------------------------------------------------------------- 1 | # 更新历史 2 | 3 | > 一个软件的命运啊,当然要靠自我奋斗,但是也要考虑到历史的行程 4 | 5 | ## v3.2.2 6 | 7 | * 增加 品葱备份计划 的链接 8 | 9 | ## v3.2.1 10 | 11 | * 继续增加可供免fq访问的网站 12 | 13 | ## v3.2.0 14 | 15 | * 更新内置的 wikipedia-proxy 16 | * 增加可供免fq访问的网站(实际上没有被封IP的所有https网站理论上都可以) 17 | 18 | ## v3.1.2 19 | 20 | * 更新内置的 Flappy Winnie 小游戏 21 | 22 | ## v3.1.1 23 | 24 | * 删除失效的链接 (旧品葱、膜乎在2018年10月30日和11月8日相继关闭,R.I.P. ) 25 | 26 | ## v3.1.0 27 | 28 | * 全局化绕过SNI检测和DNS污染,支持免fq访问几乎所有没有被封锁IP的网站 29 | 30 | ## v3.0.2 - v3.0.5 31 | 32 | * 优化检查更新的方式 33 | 34 | ## v3.0.1 35 | 36 | * 实现绕过SNI检测,免fq访问reddit 37 | 38 | ## v3.0.0 39 | 40 | * 实现绕过SNI检测,免fq访问中文维基百科 (使用[wikipedia-proxy本地反代服务器](https://github.com/Xmader/wikipedia-proxy)) 41 | * 大幅优化代码 42 | * 改为用CI自动化构建 (是的,我很懒) 43 | 44 | ## v2.2.2 45 | 46 | * 滋磁免 番羽土啬 访问端点星计划 (在GitHub上搭建的一个用于备份微信、微博等平台被删文章的站点) 47 | 48 | ## v2.2.1 49 | 50 | * 滋磁免 番羽土啬 浏览辱乎、品葱和中文维基百科 51 | 52 | ## v2.2.0 53 | 54 | * 滋磁缩放页面 55 | 56 | ## v2.1.0 57 | 58 | * 增加乳包指南 59 | * 江内置的膜法指南改为在线版,和[膜法指南网页版](https://xmader.github.io/mogicians_manual)同步更新 60 | 61 | > 膜法指南的加载速度可能会下降,请耐心等候。如果出现无法访问的问题,请尽快在[这里](https://github.com/Xmader/mohu/issues)向我反馈 62 | 63 | ## v2.0.0 64 | 65 | * 无需修改hosts文件, 无需root/sudo/管理员权限实现免 番羽土啬 浏览膜乎 66 | 67 | ## v1.2.1 68 | 69 | * 膜法指南 增加 `逗`, 保持和原版 (膜法指南 安卓客户端) 一致 70 | 71 | ## v1.2.0 72 | 73 | * 内置了一个 好几百个教授一致通过 的 膜法指南 74 | 75 | ## v1.1.1 76 | 77 | * 增加 暴力续命 78 | 79 | ## v1.1.0 80 | 81 | * 增加 续命时钟, 续命的同时切身感受到时间流逝变慢, 理论上不会和真实时间相差超过2秒 82 | 83 | -------------------------------------------------------------------------------- /Θ..Θ-+1s-green.svg: -------------------------------------------------------------------------------- 1 | Θ..ΘΘ..Θ+1s+1s --------------------------------------------------------------------------------