├── .gitignore ├── topbar.png ├── src ├── icon.png ├── qq-face │ ├── 0.gif │ ├── 1.gif │ ├── 10.gif │ ├── 11.gif │ ├── 12.gif │ ├── 13.gif │ ├── 14.gif │ ├── 15.gif │ ├── 16.gif │ ├── 18.gif │ ├── 19.gif │ ├── 2.gif │ ├── 20.gif │ ├── 21.gif │ ├── 22.gif │ ├── 23.gif │ ├── 24.gif │ ├── 25.gif │ ├── 26.gif │ ├── 27.gif │ ├── 28.gif │ ├── 29.gif │ ├── 3.gif │ ├── 30.gif │ ├── 31.gif │ ├── 32.gif │ ├── 33.gif │ ├── 34.gif │ ├── 35.gif │ ├── 36.gif │ ├── 37.gif │ ├── 38.gif │ ├── 39.gif │ ├── 4.gif │ ├── 41.gif │ ├── 42.gif │ ├── 43.gif │ ├── 46.gif │ ├── 49.gif │ ├── 5.gif │ ├── 53.gif │ ├── 54.gif │ ├── 55.gif │ ├── 56.gif │ ├── 57.gif │ ├── 59.gif │ ├── 6.gif │ ├── 60.gif │ ├── 61.gif │ ├── 62.gif │ ├── 63.gif │ ├── 64.gif │ ├── 66.gif │ ├── 67.gif │ ├── 69.gif │ ├── 7.gif │ ├── 72.gif │ ├── 74.gif │ ├── 75.gif │ ├── 76.gif │ ├── 77.gif │ ├── 78.gif │ ├── 79.gif │ ├── 8.gif │ ├── 85.gif │ ├── 86.gif │ ├── 89.gif │ ├── 9.gif │ ├── 90.gif │ ├── 91.gif │ ├── 96.gif │ ├── 97.gif │ ├── 98.gif │ ├── 99.gif │ ├── 100.gif │ ├── 101.gif │ ├── 102.gif │ ├── 103.gif │ ├── 104.gif │ ├── 105.gif │ ├── 106.gif │ ├── 107.gif │ ├── 108.gif │ ├── 109.gif │ ├── 110.gif │ ├── 111.gif │ ├── 112.gif │ ├── 113.gif │ ├── 114.gif │ ├── 115.gif │ ├── 116.gif │ ├── 117.gif │ ├── 118.gif │ ├── 119.gif │ ├── 120.gif │ ├── 121.gif │ ├── 122.gif │ ├── 123.gif │ ├── 124.gif │ ├── 125.gif │ ├── 126.gif │ ├── 127.gif │ ├── 128.gif │ ├── 129.gif │ ├── 130.gif │ ├── 131.gif │ ├── 132.gif │ ├── 133.gif │ ├── 134.gif │ ├── 135.gif │ ├── 136.gif │ ├── 137.gif │ ├── 138.gif │ ├── 139.gif │ ├── 140.gif │ ├── 141.gif │ ├── 142.gif │ ├── 143.gif │ ├── 144.gif │ ├── 145.gif │ ├── 146.gif │ ├── 147.gif │ ├── 148.gif │ ├── 149.gif │ ├── 150.gif │ ├── 151.gif │ ├── 152.gif │ ├── 153.gif │ ├── 154.gif │ ├── 155.gif │ ├── 156.gif │ ├── 157.gif │ ├── 158.gif │ ├── 159.gif │ ├── 160.gif │ ├── 161.gif │ ├── 162.gif │ ├── 163.gif │ ├── 164.gif │ ├── 165.gif │ ├── 166.gif │ ├── 167.gif │ ├── 168.gif │ ├── 169.gif │ ├── 170.gif │ ├── 171.gif │ ├── 172.gif │ ├── 173.gif │ ├── 174.gif │ ├── 175.gif │ ├── 176.gif │ ├── 177.gif │ ├── 178.gif │ ├── 179.gif │ ├── 180.gif │ ├── 181.gif │ ├── 182.gif │ ├── 183.gif │ ├── 184.gif │ ├── 185.gif │ ├── 186.gif │ ├── 187.gif │ ├── 188.gif │ ├── 189.gif │ ├── 190.gif │ ├── 191.gif │ ├── 192.gif │ ├── 193.gif │ ├── 194.gif │ ├── 195.gif │ ├── 196.gif │ ├── 197.gif │ ├── 198.gif │ ├── 199.gif │ ├── 200.gif │ ├── 201.gif │ ├── 202.gif │ ├── 203.gif │ ├── 204.gif │ ├── 205.gif │ ├── 206.gif │ ├── 207.gif │ ├── 208.gif │ ├── 209.gif │ ├── 210.gif │ ├── 211.gif │ ├── 212.gif │ ├── 213.gif │ ├── 214.gif │ ├── 215.gif │ ├── 216.gif │ ├── 217.gif │ ├── 218.gif │ ├── 219.gif │ ├── 220.gif │ ├── 221.gif │ ├── 222.gif │ ├── 223.gif │ ├── 224.gif │ ├── 225.gif │ ├── 226.gif │ ├── 227.gif │ ├── 228.gif │ ├── 229.gif │ ├── 230.gif │ ├── 231.gif │ ├── 232.gif │ ├── 233.gif │ ├── 234.gif │ ├── 235.gif │ ├── 236.gif │ ├── 237.gif │ ├── 238.gif │ ├── 239.gif │ ├── 240.gif │ ├── 241.gif │ ├── 242.gif │ ├── 243.gif │ ├── 244.gif │ ├── 245.gif │ ├── 246.gif │ ├── 247.gif │ ├── 260.gif │ ├── 261.gif │ ├── 262.gif │ ├── 263.gif │ ├── 264.gif │ ├── 265.gif │ ├── 266.gif │ ├── 267.gif │ ├── 268.gif │ ├── 269.gif │ ├── 270.gif │ ├── 271.gif │ ├── 272.gif │ ├── 273.gif │ ├── 274.gif │ ├── 277.gif │ ├── 278.gif │ ├── 279.gif │ ├── 280.gif │ ├── 281.gif │ ├── 282.gif │ ├── 283.gif │ ├── 284.gif │ ├── 285.gif │ ├── 286.gif │ ├── 287.gif │ ├── 288.gif │ ├── 289.gif │ ├── 290.gif │ ├── 291.gif │ ├── 292.gif │ ├── 293.gif │ ├── 294.gif │ ├── 295.gif │ ├── 296.gif │ ├── 297.gif │ ├── 298.gif │ ├── 299.gif │ ├── 300.gif │ ├── 301.gif │ ├── 302.gif │ ├── 303.gif │ ├── 304.gif │ ├── 305.gif │ ├── 306.gif │ ├── 307.gif │ ├── 308.gif │ ├── 309.gif │ ├── 310.gif │ ├── 311.gif │ ├── 312.gif │ ├── 313.gif │ ├── 314.gif │ ├── 315.gif │ ├── 316.gif │ ├── 317.gif │ ├── 318.gif │ ├── 319.gif │ ├── 320.gif │ ├── 321.gif │ ├── 322.gif │ └── 323.gif ├── icon-maskable.png ├── readme │ ├── QWL_end.png │ ├── oicq_end.png │ ├── QWL_connect.png │ ├── fist_run_oicq.png │ └── oicq_config.png ├── icon-for-fuck-apple.png ├── js │ ├── workbox │ │ ├── workbox-cacheable-response.prod.js │ │ ├── workbox-navigation-preload.prod.js │ │ ├── workbox-sw.js │ │ ├── workbox-broadcast-update.prod.js │ │ ├── workbox-streams.prod.js │ │ ├── workbox-range-requests.prod.js │ │ ├── workbox-offline-ga.prod.js │ │ ├── workbox-recipes.prod.js │ │ ├── workbox-core.prod.js │ │ ├── workbox-window.prod.mjs │ │ ├── workbox-routing.prod.js │ │ ├── workbox-navigation-preload.dev.js │ │ ├── workbox-navigation-preload.prod.js.map │ │ ├── workbox-navigation-preload.dev.js.map │ │ ├── workbox-window.prod.es5.mjs │ │ ├── workbox-window.prod.umd.js │ │ ├── workbox-expiration.prod.js │ │ ├── workbox-strategies.prod.js │ │ ├── workbox-precaching.prod.js │ │ ├── workbox-cacheable-response.prod.js.map │ │ ├── workbox-cacheable-response.dev.js │ │ ├── workbox-sw.js.map │ │ ├── workbox-background-sync.prod.js │ │ └── workbox-offline-ga.dev.js │ ├── workbox-sw.js │ └── clipboard.min.js └── icon.svg ├── js ├── var.js ├── impl │ ├── oicq_api.js │ └── gocqhttp_api.js ├── util.js └── ws.js ├── .github └── ISSUE_TEMPLATE │ └── ----.md ├── css ├── color │ ├── color-dark.css │ └── color-light.css └── msg.css ├── manifest.json ├── sw.js └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # 临时记录更新日志的文件 2 | updateCache.txt 3 | .vscode/launch.json 4 | -------------------------------------------------------------------------------- /topbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/topbar.png -------------------------------------------------------------------------------- /src/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/icon.png -------------------------------------------------------------------------------- /src/qq-face/0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/0.gif -------------------------------------------------------------------------------- /src/qq-face/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/1.gif -------------------------------------------------------------------------------- /src/qq-face/10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/10.gif -------------------------------------------------------------------------------- /src/qq-face/11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/11.gif -------------------------------------------------------------------------------- /src/qq-face/12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/12.gif -------------------------------------------------------------------------------- /src/qq-face/13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/13.gif -------------------------------------------------------------------------------- /src/qq-face/14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/14.gif -------------------------------------------------------------------------------- /src/qq-face/15.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/15.gif -------------------------------------------------------------------------------- /src/qq-face/16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/16.gif -------------------------------------------------------------------------------- /src/qq-face/18.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/18.gif -------------------------------------------------------------------------------- /src/qq-face/19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/19.gif -------------------------------------------------------------------------------- /src/qq-face/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/2.gif -------------------------------------------------------------------------------- /src/qq-face/20.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/20.gif -------------------------------------------------------------------------------- /src/qq-face/21.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/21.gif -------------------------------------------------------------------------------- /src/qq-face/22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/22.gif -------------------------------------------------------------------------------- /src/qq-face/23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/23.gif -------------------------------------------------------------------------------- /src/qq-face/24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/24.gif -------------------------------------------------------------------------------- /src/qq-face/25.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/25.gif -------------------------------------------------------------------------------- /src/qq-face/26.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/26.gif -------------------------------------------------------------------------------- /src/qq-face/27.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/27.gif -------------------------------------------------------------------------------- /src/qq-face/28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/28.gif -------------------------------------------------------------------------------- /src/qq-face/29.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/29.gif -------------------------------------------------------------------------------- /src/qq-face/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/3.gif -------------------------------------------------------------------------------- /src/qq-face/30.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/30.gif -------------------------------------------------------------------------------- /src/qq-face/31.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/31.gif -------------------------------------------------------------------------------- /src/qq-face/32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/32.gif -------------------------------------------------------------------------------- /src/qq-face/33.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/33.gif -------------------------------------------------------------------------------- /src/qq-face/34.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/34.gif -------------------------------------------------------------------------------- /src/qq-face/35.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/35.gif -------------------------------------------------------------------------------- /src/qq-face/36.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/36.gif -------------------------------------------------------------------------------- /src/qq-face/37.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/37.gif -------------------------------------------------------------------------------- /src/qq-face/38.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/38.gif -------------------------------------------------------------------------------- /src/qq-face/39.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/39.gif -------------------------------------------------------------------------------- /src/qq-face/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/4.gif -------------------------------------------------------------------------------- /src/qq-face/41.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/41.gif -------------------------------------------------------------------------------- /src/qq-face/42.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/42.gif -------------------------------------------------------------------------------- /src/qq-face/43.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/43.gif -------------------------------------------------------------------------------- /src/qq-face/46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/46.gif -------------------------------------------------------------------------------- /src/qq-face/49.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/49.gif -------------------------------------------------------------------------------- /src/qq-face/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/5.gif -------------------------------------------------------------------------------- /src/qq-face/53.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/53.gif -------------------------------------------------------------------------------- /src/qq-face/54.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/54.gif -------------------------------------------------------------------------------- /src/qq-face/55.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/55.gif -------------------------------------------------------------------------------- /src/qq-face/56.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/56.gif -------------------------------------------------------------------------------- /src/qq-face/57.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/57.gif -------------------------------------------------------------------------------- /src/qq-face/59.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/59.gif -------------------------------------------------------------------------------- /src/qq-face/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/6.gif -------------------------------------------------------------------------------- /src/qq-face/60.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/60.gif -------------------------------------------------------------------------------- /src/qq-face/61.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/61.gif -------------------------------------------------------------------------------- /src/qq-face/62.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/62.gif -------------------------------------------------------------------------------- /src/qq-face/63.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/63.gif -------------------------------------------------------------------------------- /src/qq-face/64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/64.gif -------------------------------------------------------------------------------- /src/qq-face/66.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/66.gif -------------------------------------------------------------------------------- /src/qq-face/67.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/67.gif -------------------------------------------------------------------------------- /src/qq-face/69.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/69.gif -------------------------------------------------------------------------------- /src/qq-face/7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/7.gif -------------------------------------------------------------------------------- /src/qq-face/72.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/72.gif -------------------------------------------------------------------------------- /src/qq-face/74.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/74.gif -------------------------------------------------------------------------------- /src/qq-face/75.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/75.gif -------------------------------------------------------------------------------- /src/qq-face/76.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/76.gif -------------------------------------------------------------------------------- /src/qq-face/77.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/77.gif -------------------------------------------------------------------------------- /src/qq-face/78.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/78.gif -------------------------------------------------------------------------------- /src/qq-face/79.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/79.gif -------------------------------------------------------------------------------- /src/qq-face/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/8.gif -------------------------------------------------------------------------------- /src/qq-face/85.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/85.gif -------------------------------------------------------------------------------- /src/qq-face/86.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/86.gif -------------------------------------------------------------------------------- /src/qq-face/89.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/89.gif -------------------------------------------------------------------------------- /src/qq-face/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/9.gif -------------------------------------------------------------------------------- /src/qq-face/90.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/90.gif -------------------------------------------------------------------------------- /src/qq-face/91.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/91.gif -------------------------------------------------------------------------------- /src/qq-face/96.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/96.gif -------------------------------------------------------------------------------- /src/qq-face/97.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/97.gif -------------------------------------------------------------------------------- /src/qq-face/98.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/98.gif -------------------------------------------------------------------------------- /src/qq-face/99.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/99.gif -------------------------------------------------------------------------------- /src/qq-face/100.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/100.gif -------------------------------------------------------------------------------- /src/qq-face/101.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/101.gif -------------------------------------------------------------------------------- /src/qq-face/102.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/102.gif -------------------------------------------------------------------------------- /src/qq-face/103.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/103.gif -------------------------------------------------------------------------------- /src/qq-face/104.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/104.gif -------------------------------------------------------------------------------- /src/qq-face/105.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/105.gif -------------------------------------------------------------------------------- /src/qq-face/106.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/106.gif -------------------------------------------------------------------------------- /src/qq-face/107.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/107.gif -------------------------------------------------------------------------------- /src/qq-face/108.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/108.gif -------------------------------------------------------------------------------- /src/qq-face/109.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/109.gif -------------------------------------------------------------------------------- /src/qq-face/110.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/110.gif -------------------------------------------------------------------------------- /src/qq-face/111.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/111.gif -------------------------------------------------------------------------------- /src/qq-face/112.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/112.gif -------------------------------------------------------------------------------- /src/qq-face/113.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/113.gif -------------------------------------------------------------------------------- /src/qq-face/114.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/114.gif -------------------------------------------------------------------------------- /src/qq-face/115.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/115.gif -------------------------------------------------------------------------------- /src/qq-face/116.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/116.gif -------------------------------------------------------------------------------- /src/qq-face/117.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/117.gif -------------------------------------------------------------------------------- /src/qq-face/118.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/118.gif -------------------------------------------------------------------------------- /src/qq-face/119.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/119.gif -------------------------------------------------------------------------------- /src/qq-face/120.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/120.gif -------------------------------------------------------------------------------- /src/qq-face/121.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/121.gif -------------------------------------------------------------------------------- /src/qq-face/122.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/122.gif -------------------------------------------------------------------------------- /src/qq-face/123.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/123.gif -------------------------------------------------------------------------------- /src/qq-face/124.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/124.gif -------------------------------------------------------------------------------- /src/qq-face/125.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/125.gif -------------------------------------------------------------------------------- /src/qq-face/126.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/126.gif -------------------------------------------------------------------------------- /src/qq-face/127.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/127.gif -------------------------------------------------------------------------------- /src/qq-face/128.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/128.gif -------------------------------------------------------------------------------- /src/qq-face/129.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/129.gif -------------------------------------------------------------------------------- /src/qq-face/130.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/130.gif -------------------------------------------------------------------------------- /src/qq-face/131.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/131.gif -------------------------------------------------------------------------------- /src/qq-face/132.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/132.gif -------------------------------------------------------------------------------- /src/qq-face/133.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/133.gif -------------------------------------------------------------------------------- /src/qq-face/134.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/134.gif -------------------------------------------------------------------------------- /src/qq-face/135.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/135.gif -------------------------------------------------------------------------------- /src/qq-face/136.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/136.gif -------------------------------------------------------------------------------- /src/qq-face/137.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/137.gif -------------------------------------------------------------------------------- /src/qq-face/138.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/138.gif -------------------------------------------------------------------------------- /src/qq-face/139.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/139.gif -------------------------------------------------------------------------------- /src/qq-face/140.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/140.gif -------------------------------------------------------------------------------- /src/qq-face/141.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/141.gif -------------------------------------------------------------------------------- /src/qq-face/142.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/142.gif -------------------------------------------------------------------------------- /src/qq-face/143.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/143.gif -------------------------------------------------------------------------------- /src/qq-face/144.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/144.gif -------------------------------------------------------------------------------- /src/qq-face/145.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/145.gif -------------------------------------------------------------------------------- /src/qq-face/146.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/146.gif -------------------------------------------------------------------------------- /src/qq-face/147.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/147.gif -------------------------------------------------------------------------------- /src/qq-face/148.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/148.gif -------------------------------------------------------------------------------- /src/qq-face/149.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/149.gif -------------------------------------------------------------------------------- /src/qq-face/150.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/150.gif -------------------------------------------------------------------------------- /src/qq-face/151.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/151.gif -------------------------------------------------------------------------------- /src/qq-face/152.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/152.gif -------------------------------------------------------------------------------- /src/qq-face/153.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/153.gif -------------------------------------------------------------------------------- /src/qq-face/154.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/154.gif -------------------------------------------------------------------------------- /src/qq-face/155.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/155.gif -------------------------------------------------------------------------------- /src/qq-face/156.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/156.gif -------------------------------------------------------------------------------- /src/qq-face/157.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/157.gif -------------------------------------------------------------------------------- /src/qq-face/158.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/158.gif -------------------------------------------------------------------------------- /src/qq-face/159.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/159.gif -------------------------------------------------------------------------------- /src/qq-face/160.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/160.gif -------------------------------------------------------------------------------- /src/qq-face/161.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/161.gif -------------------------------------------------------------------------------- /src/qq-face/162.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/162.gif -------------------------------------------------------------------------------- /src/qq-face/163.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/163.gif -------------------------------------------------------------------------------- /src/qq-face/164.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/164.gif -------------------------------------------------------------------------------- /src/qq-face/165.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/165.gif -------------------------------------------------------------------------------- /src/qq-face/166.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/166.gif -------------------------------------------------------------------------------- /src/qq-face/167.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/167.gif -------------------------------------------------------------------------------- /src/qq-face/168.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/168.gif -------------------------------------------------------------------------------- /src/qq-face/169.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/169.gif -------------------------------------------------------------------------------- /src/qq-face/170.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/170.gif -------------------------------------------------------------------------------- /src/qq-face/171.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/171.gif -------------------------------------------------------------------------------- /src/qq-face/172.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/172.gif -------------------------------------------------------------------------------- /src/qq-face/173.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/173.gif -------------------------------------------------------------------------------- /src/qq-face/174.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/174.gif -------------------------------------------------------------------------------- /src/qq-face/175.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/175.gif -------------------------------------------------------------------------------- /src/qq-face/176.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/176.gif -------------------------------------------------------------------------------- /src/qq-face/177.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/177.gif -------------------------------------------------------------------------------- /src/qq-face/178.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/178.gif -------------------------------------------------------------------------------- /src/qq-face/179.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/179.gif -------------------------------------------------------------------------------- /src/qq-face/180.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/180.gif -------------------------------------------------------------------------------- /src/qq-face/181.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/181.gif -------------------------------------------------------------------------------- /src/qq-face/182.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/182.gif -------------------------------------------------------------------------------- /src/qq-face/183.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/183.gif -------------------------------------------------------------------------------- /src/qq-face/184.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/184.gif -------------------------------------------------------------------------------- /src/qq-face/185.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/185.gif -------------------------------------------------------------------------------- /src/qq-face/186.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/186.gif -------------------------------------------------------------------------------- /src/qq-face/187.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/187.gif -------------------------------------------------------------------------------- /src/qq-face/188.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/188.gif -------------------------------------------------------------------------------- /src/qq-face/189.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/189.gif -------------------------------------------------------------------------------- /src/qq-face/190.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/190.gif -------------------------------------------------------------------------------- /src/qq-face/191.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/191.gif -------------------------------------------------------------------------------- /src/qq-face/192.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/192.gif -------------------------------------------------------------------------------- /src/qq-face/193.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/193.gif -------------------------------------------------------------------------------- /src/qq-face/194.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/194.gif -------------------------------------------------------------------------------- /src/qq-face/195.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/195.gif -------------------------------------------------------------------------------- /src/qq-face/196.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/196.gif -------------------------------------------------------------------------------- /src/qq-face/197.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/197.gif -------------------------------------------------------------------------------- /src/qq-face/198.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/198.gif -------------------------------------------------------------------------------- /src/qq-face/199.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/199.gif -------------------------------------------------------------------------------- /src/qq-face/200.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/200.gif -------------------------------------------------------------------------------- /src/qq-face/201.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/201.gif -------------------------------------------------------------------------------- /src/qq-face/202.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/202.gif -------------------------------------------------------------------------------- /src/qq-face/203.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/203.gif -------------------------------------------------------------------------------- /src/qq-face/204.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/204.gif -------------------------------------------------------------------------------- /src/qq-face/205.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/205.gif -------------------------------------------------------------------------------- /src/qq-face/206.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/206.gif -------------------------------------------------------------------------------- /src/qq-face/207.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/207.gif -------------------------------------------------------------------------------- /src/qq-face/208.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/208.gif -------------------------------------------------------------------------------- /src/qq-face/209.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/209.gif -------------------------------------------------------------------------------- /src/qq-face/210.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/210.gif -------------------------------------------------------------------------------- /src/qq-face/211.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/211.gif -------------------------------------------------------------------------------- /src/qq-face/212.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/212.gif -------------------------------------------------------------------------------- /src/qq-face/213.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/213.gif -------------------------------------------------------------------------------- /src/qq-face/214.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/214.gif -------------------------------------------------------------------------------- /src/qq-face/215.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/215.gif -------------------------------------------------------------------------------- /src/qq-face/216.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/216.gif -------------------------------------------------------------------------------- /src/qq-face/217.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/217.gif -------------------------------------------------------------------------------- /src/qq-face/218.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/218.gif -------------------------------------------------------------------------------- /src/qq-face/219.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/219.gif -------------------------------------------------------------------------------- /src/qq-face/220.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/220.gif -------------------------------------------------------------------------------- /src/qq-face/221.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/221.gif -------------------------------------------------------------------------------- /src/qq-face/222.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/222.gif -------------------------------------------------------------------------------- /src/qq-face/223.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/223.gif -------------------------------------------------------------------------------- /src/qq-face/224.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/224.gif -------------------------------------------------------------------------------- /src/qq-face/225.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/225.gif -------------------------------------------------------------------------------- /src/qq-face/226.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/226.gif -------------------------------------------------------------------------------- /src/qq-face/227.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/227.gif -------------------------------------------------------------------------------- /src/qq-face/228.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/228.gif -------------------------------------------------------------------------------- /src/qq-face/229.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/229.gif -------------------------------------------------------------------------------- /src/qq-face/230.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/230.gif -------------------------------------------------------------------------------- /src/qq-face/231.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/231.gif -------------------------------------------------------------------------------- /src/qq-face/232.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/232.gif -------------------------------------------------------------------------------- /src/qq-face/233.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/233.gif -------------------------------------------------------------------------------- /src/qq-face/234.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/234.gif -------------------------------------------------------------------------------- /src/qq-face/235.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/235.gif -------------------------------------------------------------------------------- /src/qq-face/236.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/236.gif -------------------------------------------------------------------------------- /src/qq-face/237.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/237.gif -------------------------------------------------------------------------------- /src/qq-face/238.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/238.gif -------------------------------------------------------------------------------- /src/qq-face/239.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/239.gif -------------------------------------------------------------------------------- /src/qq-face/240.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/240.gif -------------------------------------------------------------------------------- /src/qq-face/241.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/241.gif -------------------------------------------------------------------------------- /src/qq-face/242.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/242.gif -------------------------------------------------------------------------------- /src/qq-face/243.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/243.gif -------------------------------------------------------------------------------- /src/qq-face/244.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/244.gif -------------------------------------------------------------------------------- /src/qq-face/245.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/245.gif -------------------------------------------------------------------------------- /src/qq-face/246.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/246.gif -------------------------------------------------------------------------------- /src/qq-face/247.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/247.gif -------------------------------------------------------------------------------- /src/qq-face/260.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/260.gif -------------------------------------------------------------------------------- /src/qq-face/261.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/261.gif -------------------------------------------------------------------------------- /src/qq-face/262.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/262.gif -------------------------------------------------------------------------------- /src/qq-face/263.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/263.gif -------------------------------------------------------------------------------- /src/qq-face/264.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/264.gif -------------------------------------------------------------------------------- /src/qq-face/265.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/265.gif -------------------------------------------------------------------------------- /src/qq-face/266.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/266.gif -------------------------------------------------------------------------------- /src/qq-face/267.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/267.gif -------------------------------------------------------------------------------- /src/qq-face/268.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/268.gif -------------------------------------------------------------------------------- /src/qq-face/269.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/269.gif -------------------------------------------------------------------------------- /src/qq-face/270.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/270.gif -------------------------------------------------------------------------------- /src/qq-face/271.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/271.gif -------------------------------------------------------------------------------- /src/qq-face/272.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/272.gif -------------------------------------------------------------------------------- /src/qq-face/273.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/273.gif -------------------------------------------------------------------------------- /src/qq-face/274.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/274.gif -------------------------------------------------------------------------------- /src/qq-face/277.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/277.gif -------------------------------------------------------------------------------- /src/qq-face/278.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/278.gif -------------------------------------------------------------------------------- /src/qq-face/279.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/279.gif -------------------------------------------------------------------------------- /src/qq-face/280.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/280.gif -------------------------------------------------------------------------------- /src/qq-face/281.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/281.gif -------------------------------------------------------------------------------- /src/qq-face/282.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/282.gif -------------------------------------------------------------------------------- /src/qq-face/283.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/283.gif -------------------------------------------------------------------------------- /src/qq-face/284.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/284.gif -------------------------------------------------------------------------------- /src/qq-face/285.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/285.gif -------------------------------------------------------------------------------- /src/qq-face/286.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/286.gif -------------------------------------------------------------------------------- /src/qq-face/287.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/287.gif -------------------------------------------------------------------------------- /src/qq-face/288.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/288.gif -------------------------------------------------------------------------------- /src/qq-face/289.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/289.gif -------------------------------------------------------------------------------- /src/qq-face/290.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/290.gif -------------------------------------------------------------------------------- /src/qq-face/291.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/291.gif -------------------------------------------------------------------------------- /src/qq-face/292.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/292.gif -------------------------------------------------------------------------------- /src/qq-face/293.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/293.gif -------------------------------------------------------------------------------- /src/qq-face/294.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/294.gif -------------------------------------------------------------------------------- /src/qq-face/295.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/295.gif -------------------------------------------------------------------------------- /src/qq-face/296.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/296.gif -------------------------------------------------------------------------------- /src/qq-face/297.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/297.gif -------------------------------------------------------------------------------- /src/qq-face/298.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/298.gif -------------------------------------------------------------------------------- /src/qq-face/299.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/299.gif -------------------------------------------------------------------------------- /src/qq-face/300.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/300.gif -------------------------------------------------------------------------------- /src/qq-face/301.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/301.gif -------------------------------------------------------------------------------- /src/qq-face/302.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/302.gif -------------------------------------------------------------------------------- /src/qq-face/303.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/303.gif -------------------------------------------------------------------------------- /src/qq-face/304.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/304.gif -------------------------------------------------------------------------------- /src/qq-face/305.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/305.gif -------------------------------------------------------------------------------- /src/qq-face/306.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/306.gif -------------------------------------------------------------------------------- /src/qq-face/307.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/307.gif -------------------------------------------------------------------------------- /src/qq-face/308.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/308.gif -------------------------------------------------------------------------------- /src/qq-face/309.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/309.gif -------------------------------------------------------------------------------- /src/qq-face/310.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/310.gif -------------------------------------------------------------------------------- /src/qq-face/311.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/311.gif -------------------------------------------------------------------------------- /src/qq-face/312.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/312.gif -------------------------------------------------------------------------------- /src/qq-face/313.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/313.gif -------------------------------------------------------------------------------- /src/qq-face/314.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/314.gif -------------------------------------------------------------------------------- /src/qq-face/315.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/315.gif -------------------------------------------------------------------------------- /src/qq-face/316.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/316.gif -------------------------------------------------------------------------------- /src/qq-face/317.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/317.gif -------------------------------------------------------------------------------- /src/qq-face/318.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/318.gif -------------------------------------------------------------------------------- /src/qq-face/319.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/319.gif -------------------------------------------------------------------------------- /src/qq-face/320.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/320.gif -------------------------------------------------------------------------------- /src/qq-face/321.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/321.gif -------------------------------------------------------------------------------- /src/qq-face/322.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/322.gif -------------------------------------------------------------------------------- /src/qq-face/323.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/qq-face/323.gif -------------------------------------------------------------------------------- /src/icon-maskable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/icon-maskable.png -------------------------------------------------------------------------------- /src/readme/QWL_end.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/readme/QWL_end.png -------------------------------------------------------------------------------- /src/readme/oicq_end.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/readme/oicq_end.png -------------------------------------------------------------------------------- /src/icon-for-fuck-apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/icon-for-fuck-apple.png -------------------------------------------------------------------------------- /src/readme/QWL_connect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/readme/QWL_connect.png -------------------------------------------------------------------------------- /src/readme/fist_run_oicq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/readme/fist_run_oicq.png -------------------------------------------------------------------------------- /src/readme/oicq_config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/HEAD/src/readme/oicq_config.png -------------------------------------------------------------------------------- /js/var.js: -------------------------------------------------------------------------------- 1 | // 把一些信息存起来,减少和服务器的通信 2 | 3 | // 存好友 {"qq_num": {}, ...} 4 | window.friends = {} 5 | // 存群信息 {"group_id": {..., members: []}, ...} 6 | window.groups = {} 7 | 8 | function getGroupMemberList(group_id) { 9 | return window.groups[''+group_id].members 10 | } -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/----.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 错误提交 3 | about: 快速创建一个错误提交议题 4 | title: "[错误]" 5 | labels: ":bug: 错误" 6 | assignees: Stapxs 7 | 8 | --- 9 | 10 | 13 | 14 | **描述错误** 15 | 清晰简洁地描述错误是什么 16 | 17 | **复现流程** 18 | 如果你可以重现这个 BUG,你可以在下面留下操作流程 19 | 20 | **截图** 21 | 如果有附加的截图,可以添加在下面 22 | 23 | **版本信息** 24 | 我需要知道 Stapxs QQ Lite 的版本和浏览器的信息,你可以在设置的最底下看见版本信息。 25 | - Stapxs QQ Lite 版本: 26 | - 浏览器: 27 | - 浏览器版本: 28 | 29 | **更多** 30 | 还有别的要说吗? 31 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-cacheable-response.prod.js: -------------------------------------------------------------------------------- 1 | this.workbox=this.workbox||{},this.workbox.cacheableResponse=function(s){"use strict";try{self["workbox:cacheable-response:6.5.2"]&&_()}catch(s){}class t{constructor(s={}){this.O=s.statuses,this._=s.headers}isResponseCacheable(s){let t=!0;return this.O&&(t=this.O.includes(s.status)),this._&&t&&(t=Object.keys(this._).some((t=>s.headers.get(t)===this._[t]))),t}}return s.CacheableResponse=t,s.CacheableResponsePlugin=class{constructor(s){this.cacheWillUpdate=async({response:s})=>this.G.isResponseCacheable(s)?s:null,this.G=new t(s)}},s}({}); 2 | //# sourceMappingURL=workbox-cacheable-response.prod.js.map 3 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-navigation-preload.prod.js: -------------------------------------------------------------------------------- 1 | this.workbox=this.workbox||{},this.workbox.navigationPreload=function(t){"use strict";try{self["workbox:navigation-preload:6.5.2"]&&_()}catch(t){}function e(){return Boolean(self.registration&&self.registration.navigationPreload)}return t.disable=function(){e()&&self.addEventListener("activate",(t=>{t.waitUntil(self.registration.navigationPreload.disable().then((()=>{})))}))},t.enable=function(t){e()&&self.addEventListener("activate",(e=>{e.waitUntil(self.registration.navigationPreload.enable().then((()=>{t&&self.registration.navigationPreload.setHeaderValue(t)})))}))},t.isSupported=e,t}({}); 2 | //# sourceMappingURL=workbox-navigation-preload.prod.js.map 3 | -------------------------------------------------------------------------------- /css/color/color-dark.css: -------------------------------------------------------------------------------- 1 | :root { 2 | /* 卡片颜色 */ 3 | --color-bg: #2D2D2D; 4 | --color-card: #3A3A3A; 5 | --color-card-1: #494949; 6 | --color-card-2: #5F5F5F; 7 | 8 | --color-bg-rgb: 45, 45, 45; 9 | --color-card-rgb: 58, 58, 58; 10 | 11 | /* 字体颜色 */ 12 | --color-font: #FFFFFF; 13 | --color-font-1: #CFCFCF; 14 | --color-font-2: #B0B0B0; 15 | 16 | /* 字体颜色(反转) */ 17 | --color-font-r: var(--color-bg); 18 | --color-font-1-r: var(--color-card); 19 | 20 | /* 阴影颜色 */ 21 | --color-shader: #1010109c; 22 | 23 | /* 主题色 */ 24 | --color-main: #606E7A; 25 | 26 | /* 内置主题色*/ 27 | --color-main-0: #c8e5ff; 28 | --color-main-1: #d4ffcf; 29 | --color-main-2: #ffafaa; 30 | --color-main-3: #cdb7ff; 31 | --color-main-4: #f9d27d; 32 | --color-main-5: #bcbfc7; 33 | } -------------------------------------------------------------------------------- /css/color/color-light.css: -------------------------------------------------------------------------------- 1 | :root { 2 | /* 卡片颜色 */ 3 | --color-bg: #F8F9FA; 4 | --color-card: #FFFFFF; 5 | --color-card-1: #F1F3F5; 6 | --color-card-2: #e3e8ec; 7 | 8 | --color-bg-rgb: 248, 249, 250; 9 | --color-card-rgb: 255, 255, 255; 10 | 11 | /* 字体颜色 */ 12 | --color-font: #50534F; 13 | --color-font-1: #5c5f5a; 14 | --color-font-2: #7d817c; 15 | 16 | /* 字体颜色(反转) */ 17 | --color-font-r: var(--color-bg); 18 | --color-font-1-r: var(--color-card); 19 | 20 | /* 阴影颜色 */ 21 | --color-shader: #72727240; 22 | 23 | /* 主题色 */ 24 | --color-main: #606E7A; 25 | 26 | /* 内置主题色*/ 27 | --color-main-0: #606E7A; 28 | --color-main-1: #92aa8a; 29 | --color-main-2: #f0a1a8; 30 | --color-main-3: #8076a3; 31 | --color-main-4: #f9a633; 32 | --color-main-5: #50534f; 33 | } -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Stapxs QQ Lite", 3 | "short_name": "SS QQ Web", 4 | "description": "这是个兼容 OICQ/OneBot 的 QQ 网页版。", 5 | "lang": "zh_CN", 6 | "theme_color": "#99B3DB", 7 | "background_color": "#F8F9FA", 8 | "display": "standalone", 9 | "start_url": "./", 10 | "icons": [ 11 | { 12 | "src": "src/icon.svg", 13 | "sizes": "1080x1080", 14 | "purpose": "any" 15 | }, 16 | { 17 | "src": "src/icon.png", 18 | "type": "image/png", 19 | "sizes": "512x512" 20 | } 21 | , 22 | { 23 | "src": "src/icon-maskable.png", 24 | "sizes": "1024x1024", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | } 28 | ], 29 | "related_applications": [ 30 | { 31 | "platform": "play", 32 | "url": "https://play.google.com/store/apps/details?id=com.tencent.mobileqq", 33 | "id": "com.tencent.mobileqq" 34 | } 35 | ], 36 | "share_target": { 37 | "action": "/share-target/", 38 | "method": "GET", 39 | "params": { 40 | "title": "title", 41 | "text": "text", 42 | "url": "url" 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /src/js/workbox-sw.js: -------------------------------------------------------------------------------- 1 | !function(){"use strict";try{self["workbox:sw:4.2.0"]&&_()}catch(t){}const t="https://storage.googleapis.com/workbox-cdn/releases/4.2.0",e={backgroundSync:"background-sync",broadcastUpdate:"broadcast-update",cacheableResponse:"cacheable-response",core:"core",expiration:"expiration",googleAnalytics:"offline-ga",navigationPreload:"navigation-preload",precaching:"precaching",rangeRequests:"range-requests",routing:"routing",strategies:"strategies",streams:"streams"};self.workbox=new class{constructor(){return this.v={},this.t={debug:"localhost"===self.location.hostname,modulePathPrefix:null,modulePathCb:null},this.s=this.t.debug?"dev":"prod",this.o=!1,new Proxy(this,{get(t,s){if(t[s])return t[s];const o=e[s];return o&&t.loadModule(`workbox-${o}`),t[s]}})}setConfig(t={}){if(this.o)throw new Error("Config must be set before accessing workbox.* modules");Object.assign(this.t,t),this.s=this.t.debug?"dev":"prod"}loadModule(t){const e=this.i(t);try{importScripts(e),this.o=!0}catch(s){throw console.error(`Unable to import module '${t}' from '${e}'.`),s}}i(e){if(this.t.modulePathCb)return this.t.modulePathCb(e,this.t.debug);let s=[t];const o=`${e}.${this.s}.js`,r=this.t.modulePathPrefix;return r&&""===(s=r.split("/"))[s.length-1]&&s.splice(s.length-1,1),s.push(o),s.join("/")}}}(); 2 | //# sourceMappingURL=workbox-sw.js.map 3 | -------------------------------------------------------------------------------- /js/impl/oicq_api.js: -------------------------------------------------------------------------------- 1 | // 构造 API 传参 JSON 2 | const oicqApi = { 3 | name: "oicq", 4 | parseMsg: function (msg) { 5 | switch (msg.post_type) { 6 | case "message": updateMsg(msg); break // 通知消息 7 | case "notice": runNotice(msg); break // 服务端通知 8 | } 9 | }, 10 | createApi: function (action, params = {}, echo) { 11 | let apiObj = {} 12 | switch (action) { 13 | case "get_chat_history": msg_id = params["message_id"]; params = { "message_id": msg_id }; break // 不清楚 oicq 能否解析有多余参数的情况,先去除多余参数 14 | } 15 | apiObj.action = action 16 | apiObj.params = params 17 | if (echo == null) { 18 | apiObj.echo = action 19 | } else { 20 | apiObj.echo = echo 21 | } 22 | return JSON.stringify(apiObj) 23 | }, 24 | // 发送消息封装 25 | sendWs: function (action, params, echo) { 26 | let str = this.createApi(action, params, echo) 27 | window.ws.send(str) 28 | showLog("7abb7e", "fff", "PUT", str) 29 | }, 30 | sortMsg: function (msg) { 31 | return msg 32 | }, 33 | convertMsg: function (msg) { // 消息转成 oicq 的形式 34 | return msg 35 | } 36 | } -------------------------------------------------------------------------------- /src/js/workbox/workbox-sw.js: -------------------------------------------------------------------------------- 1 | !function(){"use strict";try{self["workbox:sw:6.5.3"]&&_()}catch(t){}const t={backgroundSync:"background-sync",broadcastUpdate:"broadcast-update",cacheableResponse:"cacheable-response",core:"core",expiration:"expiration",googleAnalytics:"offline-ga",navigationPreload:"navigation-preload",precaching:"precaching",rangeRequests:"range-requests",routing:"routing",strategies:"strategies",streams:"streams",recipes:"recipes"};self.workbox=new class{constructor(){return this.v={},this.Pt={debug:"localhost"===self.location.hostname,modulePathPrefix:null,modulePathCb:null},this.$t=this.Pt.debug?"dev":"prod",this.Ct=!1,new Proxy(this,{get(e,s){if(e[s])return e[s];const o=t[s];return o&&e.loadModule("workbox-"+o),e[s]}})}setConfig(t={}){if(this.Ct)throw new Error("Config must be set before accessing workbox.* modules");Object.assign(this.Pt,t),this.$t=this.Pt.debug?"dev":"prod"}loadModule(t){const e=this.jt(t);try{importScripts(e),this.Ct=!0}catch(s){throw console.error(`Unable to import module '${t}' from '${e}'.`),s}}jt(t){if(this.Pt.modulePathCb)return this.Pt.modulePathCb(t,this.Pt.debug);let e=["https://storage.googleapis.com/workbox-cdn/releases/6.5.3"];const s=`${t}.${this.$t}.js`,o=this.Pt.modulePathPrefix;return o&&(e=o.split("/"),""===e[e.length-1]&&e.splice(e.length-1,1)),e.push(s),e.join("/")}}}(); 2 | //# sourceMappingURL=workbox-sw.js.map 3 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-broadcast-update.prod.js: -------------------------------------------------------------------------------- 1 | this.workbox=this.workbox||{},this.workbox.broadcastUpdate=function(t,s,a,e){"use strict";try{self["workbox:broadcast-update:6.5.2"]&&_()}catch(t){}const n=(t,s,a)=>!a.some((a=>t.headers.has(a)&&s.headers.has(a)))||a.every((a=>{const e=t.headers.has(a)===s.headers.has(a),n=t.headers.get(a)===s.headers.get(a);return e&&n})),i=["content-length","etag","last-modified"],o=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);function c(t){return{cacheName:t.cacheName,updatedURL:t.request.url}}class r{constructor({generatePayload:t,headersToCheck:s,notifyAllClients:a}={}){this.C=s||i,this.A=t||c,this.U=null==a||a}async notifyIfUpdated(t){if(t.oldResponse&&!n(t.oldResponse,t.newResponse,this.C)){const e={type:"CACHE_UPDATED",meta:"workbox-broadcast-update",payload:this.A(t)};if("navigate"===t.request.mode){let e;t.event instanceof FetchEvent&&(e=t.event.resultingClientId);await a.resultingClientExists(e)&&!o||await s.timeout(3500)}if(this.U){const t=await self.clients.matchAll({type:"window"});for(const s of t)s.postMessage(e)}else if(t.event instanceof FetchEvent){const s=await self.clients.get(t.event.clientId);null==s||s.postMessage(e)}}}}return t.BroadcastCacheUpdate=r,t.BroadcastUpdatePlugin=class{constructor(t){this.cacheDidUpdate=async t=>{e.dontWaitFor(this.F.notifyIfUpdated(t))},this.F=new r(t)}},t.responsesAreSame=n,t}({},workbox.core._private,workbox.core._private,workbox.core._private); 2 | //# sourceMappingURL=workbox-broadcast-update.prod.js.map 3 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-streams.prod.js: -------------------------------------------------------------------------------- 1 | this.workbox=this.workbox||{},this.workbox.streams=function(e,n,t,r){"use strict";try{self["workbox:streams:6.5.2"]&&_()}catch(e){}function s(e){const r=e.map((e=>Promise.resolve(e).then((e=>function(e){if(e instanceof Response){if(e.body)return e.body.getReader();throw new t.WorkboxError("opaque-streams-source",{type:e.type})}return e instanceof ReadableStream?e.getReader():new Response(e).body.getReader()}(e))))),s=new n.Deferred;let o=0;const a=new ReadableStream({pull(e){return r[o].then((e=>e.read())).then((n=>{if(n.done)return o++,o>=r.length?(e.close(),void s.resolve()):this.pull(e);e.enqueue(n.value)})).catch((e=>{throw s.reject(e),e}))},cancel(){s.resolve()}});return{done:s.promise,stream:a}}function o(e={}){const n=new Headers(e);return n.has("content-type")||n.set("content-type","text/html"),n}function a(e,n){const{done:t,stream:r}=s(e),a=o(n);return{done:t,response:new Response(r,{headers:a})}}function c(){return r.canConstructReadableStream()}return e.concatenate=s,e.concatenateToResponse=a,e.isSupported=c,e.strategy=function(e,n){return async({event:t,request:r,url:s,params:u})=>{const i=e.map((e=>Promise.resolve(e({event:t,request:r,url:s,params:u}))));if(c()){const{done:e,response:r}=a(i,n);return t&&t.waitUntil(e),r}const w=i.map((async e=>{const n=await e;return n instanceof Response?n.blob():new Response(n).blob()})),f=await Promise.all(w),p=o(n);return new Response(new Blob(f),{headers:p})}},e}({},workbox.core._private,workbox.core._private,workbox.core._private); 2 | //# sourceMappingURL=workbox-streams.prod.js.map 3 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-range-requests.prod.js: -------------------------------------------------------------------------------- 1 | this.workbox=this.workbox||{},this.workbox.rangeRequests=function(t,e,n){"use strict";try{self["workbox:range-requests:6.5.2"]&&_()}catch(t){}async function r(t,n){try{if(206===n.status)return n;const r=t.headers.get("range");if(!r)throw new e.WorkboxError("no-range-header");const s=function(t){const n=t.trim().toLowerCase();if(!n.startsWith("bytes="))throw new e.WorkboxError("unit-must-be-bytes",{normalizedRangeHeader:n});if(n.includes(","))throw new e.WorkboxError("single-range-only",{normalizedRangeHeader:n});const r=/(\d*)-(\d*)/.exec(n);if(!r||!r[1]&&!r[2])throw new e.WorkboxError("invalid-range-values",{normalizedRangeHeader:n});return{start:""===r[1]?void 0:Number(r[1]),end:""===r[2]?void 0:Number(r[2])}}(r),a=await n.blob(),o=function(t,n,r){const s=t.size;if(r&&r>s||n&&n<0)throw new e.WorkboxError("range-not-satisfiable",{size:s,end:r,start:n});let a,o;return void 0!==n&&void 0!==r?(a=n,o=r+1):void 0!==n&&void 0===r?(a=n,o=s):void 0!==r&&void 0===n&&(a=s-r,o=s),{start:a,end:o}}(a,s.start,s.end),i=a.slice(o.start,o.end),d=i.size,u=new Response(i,{status:206,statusText:"Partial Content",headers:n.headers});return u.headers.set("Content-Length",String(d)),u.headers.set("Content-Range",`bytes ${o.start}-${o.end-1}/`+a.size),u}catch(t){return new Response("",{status:416,statusText:"Range Not Satisfiable"})}}return t.RangeRequestsPlugin=class{constructor(){this.cachedResponseWillBeUsed=async({request:t,cachedResponse:e})=>e&&t.headers.has("range")?await r(t,e):e}},t.createPartialResponse=r,t}({},workbox.core._private,workbox.core._private); 2 | //# sourceMappingURL=workbox-range-requests.prod.js.map 3 | -------------------------------------------------------------------------------- /js/impl/gocqhttp_api.js: -------------------------------------------------------------------------------- 1 | // gocqhttp, message_id = global_id 2 | const gocqhttpApi = { 3 | name: "gocqhttp", 4 | parseMsg: function (msg) { 5 | if (msg.post_type !== 'meta_event') { 6 | console.log('GET:') 7 | console.log(msg) 8 | } 9 | switch (msg.post_type) { 10 | case "message": updateMsg(msg); break // 通知消息 11 | case "notice": runNotice(msg); break // 服务端通知 12 | // gocqhttp 13 | case "meta_event": metaEvent(msg); break 14 | case "message_sent": updateMsg(msg); break 15 | } 16 | }, 17 | createApi: function (action, params = {}, echo) { 18 | let apiObj = {} 19 | switch (action) { 20 | case "get_chat_history": action = "get_msg_history"; break 21 | case "send_msg": action = "send_msg"; echo = 'send_not_msgback'; break // 不产生回调 22 | } 23 | apiObj.action = action 24 | apiObj.params = params 25 | if (echo == null) { 26 | apiObj.echo = action 27 | } else { 28 | apiObj.echo = echo 29 | } 30 | return JSON.stringify(apiObj) 31 | }, 32 | sendWs: function (action, params, echo) { // 发送消息封装 33 | str = this.createApi(action, params, echo) 34 | console.log('PUT:'+str) 35 | window.ws.send(str) 36 | showLog("7abb7e", "fff", "PUT", str) 37 | }, 38 | sortMsg: function (msgs) { 39 | return msgs.reverse() 40 | }, 41 | convertMsg: function (msg) { // 消息转成 oicq 的形式 42 | return msg 43 | } 44 | } -------------------------------------------------------------------------------- /js/util.js: -------------------------------------------------------------------------------- 1 | function formatBytes(a,b=2,k=1024){with(Math){let d=floor(log(a)/log(k));return 0==a?"0 Bytes":parseFloat((a/pow(k,d)).toFixed(max(0,b)))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][d]}} 2 | 3 | function gitmojiToEmoji(name){return {":zap:":"⚡️",":art:":"🎨",":fire:":"🔥",":bug:":"🐛",":ambulance:":"🚑️",":sparkles:":"✨",":memo:":"📝",":rocket:":"🚀",":lipstick:":"💄",":tada:":"🎉",":white-check-mark:":"✅",":lock:":"🔒️",":closed-lock-with-key:":"🔐",":bookmark:":"🔖",":rotating-light:":"🚨",":construction:":"🚧",":green-heart:":"💚",":arrow-down:":"⬇️",":arrow-up:":"⬆️",":pushpin:":"📌",":construction-worker:":"👷",":chart-with-upwards-trend:":"📈",":recycle:":"♻️",":heavy-plus-sign:":"➕",":heavy-minus-sign:":"➖",":wrench:":"🔧",":hammer:":"🔨",":globe-with-meridians:":"🌐",":pencil2:":"✏️",":poop:":"💩",":rewind:":"⏪️",":twisted-rightwards-arrows:":"🔀",":package:":"📦️",":alien:":"👽️",":truck:":"🚚",":page-facing-up:":"📄",":boom:":"💥",":bento:":"🍱",":wheelchair:":"♿️",":bulb:":"💡",":beers:":"🍻",":speech-balloon:":"💬",":card-file-box:":"🗃️",":loud-sound:":"🔊",":mute:":"🔇",":busts-in-silhouette:":"👥",":children-crossing:":"🚸",":building-construction:":"🏗️",":iphone:":"📱",":clown-face:":"🤡",":egg:":"🥚",":see-no-evil:":"🙈",":camera-flash:":"📸",":alembic:":"⚗️",":mag:":"🔍️",":label:":"🏷️",":seedling:":"🌱",":triangular-flag-on-post:":"🚩",":goal-net:":"🥅",":animation:":"💫",":wastebasket:":"🗑️",":passport-control:":"🛂",":adhesive-bandage:":"🩹",":monocle-face:":"🧐",":coffin:":"⚰️",":test-tube:":"🧪",":necktie:":"👔",":stethoscope:":"🩺",":bricks:":"🧱",":technologist:":"🧑‍💻"}[name]} 4 | 5 | function randomNum(minNum,maxNum){switch(arguments.length){case 1:return parseInt(Math.random()*minNum+1,10);case 2: return parseInt(Math.random()*(maxNum-minNum+1)+minNum,10); default: return 0;} 6 | } -------------------------------------------------------------------------------- /src/js/workbox/workbox-offline-ga.prod.js: -------------------------------------------------------------------------------- 1 | this.workbox=this.workbox||{},this.workbox.googleAnalytics=function(t,e,o,n,r,c,a,w,s){"use strict";try{self["workbox:google-analytics:6.5.2"]&&_()}catch(t){}const i="www.google-analytics.com",l="www.googletagmanager.com",u=/^\/(\w+\/)?collect/,m=t=>{const e=({url:t})=>t.hostname===i&&u.test(t.pathname),o=new s.NetworkOnly({plugins:[t]});return[new c.Route(e,o,"GET"),new c.Route(e,o,"POST")]},g=t=>{const e=new w.NetworkFirst({cacheName:t});return new c.Route((({url:t})=>t.hostname===i&&"/analytics.js"===t.pathname),e,"GET")},h=t=>{const e=new w.NetworkFirst({cacheName:t});return new c.Route((({url:t})=>t.hostname===l&&"/gtag/js"===t.pathname),e,"GET")},b=t=>{const e=new w.NetworkFirst({cacheName:t});return new c.Route((({url:t})=>t.hostname===l&&"/gtm.js"===t.pathname),e,"GET")};return t.initialize=(t={})=>{const n=o.cacheNames.getGoogleAnalyticsName(t.cacheName),r=new e.BackgroundSyncPlugin("workbox-google-analytics",{maxRetentionTime:2880,onSync:(c=t,async({queue:t})=>{let e;for(;e=await t.shiftRequest();){const{request:o,timestamp:n}=e,r=new URL(o.url);try{const t="POST"===o.method?new URLSearchParams(await o.clone().text()):r.searchParams,e=n-(Number(t.get("qt"))||0),a=Date.now()-e;if(t.set("qt",String(a)),c.parameterOverrides)for(const e of Object.keys(c.parameterOverrides)){const o=c.parameterOverrides[e];t.set(e,o)}"function"==typeof c.hitFilter&&c.hitFilter.call(null,t),await fetch(new Request(r.origin+r.pathname,{body:t.toString(),method:"POST",mode:"cors",credentials:"omit",headers:{"Content-Type":"text/plain"}}))}catch(o){throw await t.unshiftRequest(e),o}}})});var c;const w=[b(n),g(n),h(n),...m(r)],s=new a.Router;for(const t of w)s.registerRoute(t);s.addFetchListener()},t}({},workbox.backgroundSync,workbox.core._private,workbox.core._private,workbox.core._private,workbox.routing,workbox.routing,workbox.strategies,workbox.strategies); 2 | //# sourceMappingURL=workbox-offline-ga.prod.js.map 3 | -------------------------------------------------------------------------------- /src/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 16 | 22 | 25 | 28 | 30 | 31 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-recipes.prod.js: -------------------------------------------------------------------------------- 1 | this.workbox=this.workbox||{},this.workbox.recipes=function(e,s,t,n,o,a,c,r,i){"use strict";try{self["workbox:recipes:6.5.2"]&&_()}catch(e){}function u(e){self.addEventListener("install",(s=>{const t=e.urls.map((t=>e.strategy.handleAll({event:s,request:new Request(t)})[1]));s.waitUntil(Promise.all(t))}))}return e.googleFontsCache=function(e={}){const c=(e.cachePrefix||"google-fonts")+"-stylesheets",r=(e.cachePrefix||"google-fonts")+"-webfonts",i=e.maxAgeSeconds||31536e3,u=e.maxEntries||30;s.registerRoute((({url:e})=>"https://fonts.googleapis.com"===e.origin),new t.StaleWhileRevalidate({cacheName:c})),s.registerRoute((({url:e})=>"https://fonts.gstatic.com"===e.origin),new n.CacheFirst({cacheName:r,plugins:[new o.CacheableResponsePlugin({statuses:[0,200]}),new a.ExpirationPlugin({maxAgeSeconds:i,maxEntries:u})]}))},e.imageCache=function(e={}){const t=e.cacheName||"images",c=e.matchCallback||(({request:e})=>"image"===e.destination),r=e.maxAgeSeconds||2592e3,i=e.maxEntries||60,w=e.plugins||[];w.push(new o.CacheableResponsePlugin({statuses:[0,200]})),w.push(new a.ExpirationPlugin({maxEntries:i,maxAgeSeconds:r}));const l=new n.CacheFirst({cacheName:t,plugins:w});s.registerRoute(c,l),e.warmCache&&u({urls:e.warmCache,strategy:l})},e.offlineFallback=function(e={}){const s=e.pageFallback||"offline.html",t=e.imageFallback||!1,n=e.fontFallback||!1;self.addEventListener("install",(e=>{const o=[s];t&&o.push(t),n&&o.push(n),e.waitUntil(self.caches.open("workbox-offline-fallbacks").then((e=>e.addAll(o))))})),r.setCatchHandler((async e=>{const o=e.request.destination,a=await self.caches.open("workbox-offline-fallbacks");if("document"===o){return await i.matchPrecache(s)||await a.match(s)||Response.error()}if("image"===o&&!1!==t){return await i.matchPrecache(t)||await a.match(t)||Response.error()}if("font"===o&&!1!==n){return await i.matchPrecache(n)||await a.match(n)||Response.error()}return Response.error()}))},e.pageCache=function(e={}){const t=e.cacheName||"pages",n=e.matchCallback||(({request:e})=>"navigate"===e.mode),a=e.networkTimeoutSeconds||3,r=e.plugins||[];r.push(new o.CacheableResponsePlugin({statuses:[0,200]}));const i=new c.NetworkFirst({networkTimeoutSeconds:a,cacheName:t,plugins:r});s.registerRoute(n,i),e.warmCache&&u({urls:e.warmCache,strategy:i})},e.staticResourceCache=function(e={}){const n=e.cacheName||"static-resources",a=e.matchCallback||(({request:e})=>"style"===e.destination||"script"===e.destination||"worker"===e.destination),c=e.plugins||[];c.push(new o.CacheableResponsePlugin({statuses:[0,200]}));const r=new t.StaleWhileRevalidate({cacheName:n,plugins:c});s.registerRoute(a,r),e.warmCache&&u({urls:e.warmCache,strategy:r})},e.warmStrategyCache=u,e}({},workbox.routing,workbox.strategies,workbox.strategies,workbox.cacheableResponse,workbox.expiration,workbox.strategies,workbox.routing,workbox.precaching); 2 | //# sourceMappingURL=workbox-recipes.prod.js.map 3 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-core.prod.js: -------------------------------------------------------------------------------- 1 | this.workbox=this.workbox||{},this.workbox.core=function(t){"use strict";try{self["workbox:core:6.5.2"]&&_()}catch(t){}const e=(t,...e)=>{let n=t;return e.length>0&&(n+=" :: "+JSON.stringify(e)),n};class n extends Error{constructor(t,n){super(e(t,n)),this.name=t,this.details=n}}const r=new Set;const o={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},s=t=>[o.prefix,t,o.suffix].filter((t=>t&&t.length>0)).join("-"),i={updateDetails:t=>{(t=>{for(const e of Object.keys(o))t(e)})((e=>{"string"==typeof t[e]&&(o[e]=t[e])}))},getGoogleAnalyticsName:t=>t||s(o.googleAnalytics),getPrecacheName:t=>t||s(o.precache),getPrefix:()=>o.prefix,getRuntimeName:t=>t||s(o.runtime),getSuffix:()=>o.suffix};function c(t,e){const n=new URL(t);for(const t of e)n.searchParams.delete(t);return n.href}let a,u;function f(){if(void 0===u){const t=new Response("");if("body"in t)try{new Response(t.body),u=!0}catch(t){u=!1}u=!1}return u}function l(t){return new Promise((e=>setTimeout(e,t)))}var g=Object.freeze({__proto__:null,assert:null,cacheMatchIgnoreParams:async function(t,e,n,r){const o=c(e.url,n);if(e.url===o)return t.match(e,r);const s=Object.assign(Object.assign({},r),{ignoreSearch:!0}),i=await t.keys(e,s);for(const e of i){if(o===c(e.url,n))return t.match(e,r)}},cacheNames:i,canConstructReadableStream:function(){if(void 0===a)try{new ReadableStream({start(){}}),a=!0}catch(t){a=!1}return a},canConstructResponseFromBodyStream:f,dontWaitFor:function(t){t.then((()=>{}))},Deferred:class{constructor(){this.promise=new Promise(((t,e)=>{this.resolve=t,this.reject=e}))}},executeQuotaErrorCallbacks:async function(){for(const t of r)await t()},getFriendlyURL:t=>new URL(String(t),location.href).href.replace(new RegExp("^"+location.origin),""),logger:null,resultingClientExists:async function(t){if(!t)return;let e=await self.clients.matchAll({type:"window"});const n=new Set(e.map((t=>t.id)));let r;const o=performance.now();for(;performance.now()-o<2e3&&(e=await self.clients.matchAll({type:"window"}),r=e.find((e=>t?e.id===t:!n.has(e.id))),!r);)await l(100);return r},timeout:l,waitUntil:function(t,e){const n=e();return t.waitUntil(n),n},WorkboxError:n});const w={get googleAnalytics(){return i.getGoogleAnalyticsName()},get precache(){return i.getPrecacheName()},get prefix(){return i.getPrefix()},get runtime(){return i.getRuntimeName()},get suffix(){return i.getSuffix()}};return t._private=g,t.cacheNames=w,t.clientsClaim=function(){self.addEventListener("activate",(()=>self.clients.claim()))},t.copyResponse=async function(t,e){let r=null;if(t.url){r=new URL(t.url).origin}if(r!==self.location.origin)throw new n("cross-origin-copy-response",{origin:r});const o=t.clone(),s={headers:new Headers(o.headers),status:o.status,statusText:o.statusText},i=e?e(s):s,c=f()?o.body:await o.blob();return new Response(c,i)},t.registerQuotaErrorCallback=function(t){r.add(t)},t.setCacheNameDetails=function(t){i.updateDetails(t)},t.skipWaiting=function(){self.skipWaiting()},t}({}); 2 | //# sourceMappingURL=workbox-core.prod.js.map 3 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-window.prod.mjs: -------------------------------------------------------------------------------- 1 | try{self["workbox:window:6.5.2"]&&_()}catch(t){}function t(t,s){return new Promise((i=>{const e=new MessageChannel;e.port1.onmessage=t=>{i(t.data)},t.postMessage(s,[e.port2])}))}try{self["workbox:core:6.5.2"]&&_()}catch(t){}class s{constructor(){this.promise=new Promise(((t,s)=>{this.resolve=t,this.reject=s}))}}function i(t,s){const{href:i}=location;return new URL(t,i).href===new URL(s,i).href}class e{constructor(t,s){this.type=t,Object.assign(this,s)}}const h={type:"SKIP_WAITING"};class n extends class{constructor(){this.St=new Map}addEventListener(t,s){this.Lt(t).add(s)}removeEventListener(t,s){this.Lt(t).delete(s)}dispatchEvent(t){t.target=this;const s=this.Lt(t.type);for(const i of s)i(t)}Lt(t){return this.St.has(t)||this.St.set(t,new Set),this.St.get(t)}}{constructor(t,h={}){super(),this.It={},this.Bt=0,this.Tt=new s,this.Mt=new s,this.At=new s,this.Gt=0,this.Kt=new Set,this.Nt=()=>{const t=this.zt,s=t.installing;this.Bt>0||!i(s.scriptURL,this.Dt.toString())||performance.now()>this.Gt+6e4?(this.Ft=s,t.removeEventListener("updatefound",this.Nt)):(this.Ht=s,this.Kt.add(s),this.Tt.resolve(s)),++this.Bt,s.addEventListener("statechange",this.Jt)},this.Jt=t=>{const s=this.zt,i=t.target,{state:h}=i,n=i===this.Ft,a={sw:i,isExternal:n,originalEvent:t};!n&&this.Qt&&(a.isUpdate=!0),this.dispatchEvent(new e(h,a)),"installed"===h?this.Vt=self.setTimeout((()=>{"installed"===h&&s.waiting===i&&this.dispatchEvent(new e("waiting",a))}),200):"activating"===h&&(clearTimeout(this.Vt),n||this.Mt.resolve(i))},this.Xt=t=>{const s=this.Ht,i=s!==navigator.serviceWorker.controller;this.dispatchEvent(new e("controlling",{isExternal:i,originalEvent:t,sw:s,isUpdate:this.Qt})),i||this.At.resolve(s)},this.Yt=async t=>{const{data:s,ports:i,source:h}=t;await this.getSW(),this.Kt.has(h)&&this.dispatchEvent(new e("message",{data:s,originalEvent:t,ports:i,sw:h}))},this.Dt=t,this.It=h,navigator.serviceWorker.addEventListener("message",this.Yt)}async register({immediate:t=!1}={}){t||"complete"===document.readyState||await new Promise((t=>window.addEventListener("load",t))),this.Qt=Boolean(navigator.serviceWorker.controller),this.Zt=this.ts(),this.zt=await this.ss(),this.Zt&&(this.Ht=this.Zt,this.Mt.resolve(this.Zt),this.At.resolve(this.Zt),this.Zt.addEventListener("statechange",this.Jt,{once:!0}));const s=this.zt.waiting;return s&&i(s.scriptURL,this.Dt.toString())&&(this.Ht=s,Promise.resolve().then((()=>{this.dispatchEvent(new e("waiting",{sw:s,wasWaitingBeforeRegister:!0}))})).then((()=>{}))),this.Ht&&(this.Tt.resolve(this.Ht),this.Kt.add(this.Ht)),this.zt.addEventListener("updatefound",this.Nt),navigator.serviceWorker.addEventListener("controllerchange",this.Xt),this.zt}async update(){this.zt&&await this.zt.update()}get active(){return this.Mt.promise}get controlling(){return this.At.promise}getSW(){return void 0!==this.Ht?Promise.resolve(this.Ht):this.Tt.promise}async messageSW(s){return t(await this.getSW(),s)}messageSkipWaiting(){this.zt&&this.zt.waiting&&t(this.zt.waiting,h)}ts(){const t=navigator.serviceWorker.controller;return t&&i(t.scriptURL,this.Dt.toString())?t:void 0}async ss(){try{const t=await navigator.serviceWorker.register(this.Dt,this.It);return this.Gt=performance.now(),t}catch(t){throw t}}}export{n as Workbox,e as WorkboxEvent,t as messageSW}; 2 | //# sourceMappingURL=workbox-window.prod.mjs.map 3 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-routing.prod.js: -------------------------------------------------------------------------------- 1 | this.workbox=this.workbox||{},this.workbox.routing=function(t,e){"use strict";try{self["workbox:routing:6.5.2"]&&_()}catch(t){}const s=t=>t&&"object"==typeof t?t:{handle:t};class r{constructor(t,e,r="GET"){this.handler=s(e),this.match=t,this.method=r}setCatchHandler(t){this.catchHandler=s(t)}}class n extends r{constructor(t,e,s){super((({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)}),e,s)}}class i{constructor(){this.ut=new Map,this.ft=new Map}get routes(){return this.ut}addFetchListener(){self.addEventListener("fetch",(t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)}))}addCacheListener(){self.addEventListener("message",(t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map((e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})})));t.waitUntil(s),t.ports&&t.ports[0]&&s.then((()=>t.ports[0].postMessage(!0)))}}))}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const r=s.origin===location.origin,{params:n,route:i}=this.findMatchingRoute({event:e,request:t,sameOrigin:r,url:s});let o=i&&i.handler;const u=t.method;if(!o&&this.ft.has(u)&&(o=this.ft.get(u)),!o)return;let c;try{c=o.handle({url:s,request:t,event:e,params:n})}catch(t){c=Promise.reject(t)}const a=i&&i.catchHandler;return c instanceof Promise&&(this.dt||a)&&(c=c.catch((async r=>{if(a)try{return await a.handle({url:s,request:t,event:e,params:n})}catch(t){t instanceof Error&&(r=t)}if(this.dt)return this.dt.handle({url:s,request:t,event:e});throw r}))),c}findMatchingRoute({url:t,sameOrigin:e,request:s,event:r}){const n=this.ut.get(s.method)||[];for(const i of n){let n;const o=i.match({url:t,sameOrigin:e,request:s,event:r});if(o)return n=o,(Array.isArray(n)&&0===n.length||o.constructor===Object&&0===Object.keys(o).length||"boolean"==typeof o)&&(n=void 0),{route:i,params:n}}return{}}setDefaultHandler(t,e="GET"){this.ft.set(e,s(t))}setCatchHandler(t){this.dt=s(t)}registerRoute(t){this.ut.has(t.method)||this.ut.set(t.method,[]),this.ut.get(t.method).push(t)}unregisterRoute(t){if(!this.ut.has(t.method))throw new e.WorkboxError("unregister-route-but-not-found-with-method",{method:t.method});const s=this.ut.get(t.method).indexOf(t);if(!(s>-1))throw new e.WorkboxError("unregister-route-route-not-registered");this.ut.get(t.method).splice(s,1)}}let o;const u=()=>(o||(o=new i,o.addFetchListener(),o.addCacheListener()),o);return t.NavigationRoute=class extends r{constructor(t,{allowlist:e=[/./],denylist:s=[]}={}){super((t=>this.wt(t)),t),this.gt=e,this.qt=s}wt({url:t,request:e}){if(e&&"navigate"!==e.mode)return!1;const s=t.pathname+t.search;for(const t of this.qt)if(t.test(s))return!1;return!!this.gt.some((t=>t.test(s)))}},t.RegExpRoute=n,t.Route=r,t.Router=i,t.registerRoute=function(t,s,i){let o;if("string"==typeof t){const e=new URL(t,location.href);o=new r((({url:t})=>t.href===e.href),s,i)}else if(t instanceof RegExp)o=new n(t,s,i);else if("function"==typeof t)o=new r(t,s,i);else{if(!(t instanceof r))throw new e.WorkboxError("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});o=t}return u().registerRoute(o),o},t.setCatchHandler=function(t){u().setCatchHandler(t)},t.setDefaultHandler=function(t){u().setDefaultHandler(t)},t}({},workbox.core._private); 2 | //# sourceMappingURL=workbox-routing.prod.js.map 3 | -------------------------------------------------------------------------------- /sw.js: -------------------------------------------------------------------------------- 1 | const version = 'v1.4.1' 2 | 3 | // SW 设置 4 | const maxEntries = 100 5 | const maxEntriesPic = 1000 6 | 7 | // 引用 workbox-sw 8 | importScripts('src/js/workbox/workbox-sw.js') 9 | workbox.setConfig({modulePathPrefix: 'src/js/workbox/'}) 10 | workbox.core.setCacheNameDetails({ 11 | prefix: 'sql-', 12 | suffix: version 13 | }) 14 | 15 | // sw.js 本体不进行缓存 16 | workbox.routing.registerRoute(new RegExp("sw.js"), new workbox.strategies.NetworkOnly()) 17 | 18 | // js、html 和 css 进行优先网络的缓存 19 | workbox.routing.registerRoute( 20 | new RegExp(".(js|html|css|json)|src/.(png|svg)"), 21 | new workbox.strategies.NetworkFirst({ 22 | // cache storage 名称和版本号 23 | cacheName: 'main-' + version, 24 | plugins: [ 25 | // 使用 expiration 插件实现缓存条目数目和时间控制 26 | new workbox.expiration.ExpirationPlugin({ 27 | // 最大保存项目 28 | maxEntries, 29 | // 缓存 30 天 30 | maxAgeSeconds: 30 * 24 * 60 * 60, 31 | }), 32 | // 使用 cacheableResponse 插件缓存状态码为 0 的请求 33 | new workbox.cacheableResponse.CacheableResponsePlugin({ 34 | statuses: [0, 200], 35 | }), 36 | ], 37 | }) 38 | ); 39 | 40 | // QQ 表情进行缓存优先缓存 41 | workbox.routing.registerRoute( 42 | new RegExp("src/qq-face/.*"), 43 | new workbox.strategies.CacheFirst({ 44 | // cache storage 名称和版本号 45 | cacheName: 'src', 46 | plugins: [ 47 | // 使用 expiration 插件实现缓存条目数目和时间控制 48 | new workbox.expiration.ExpirationPlugin({ 49 | // 最大保存项目 50 | maxEntriesPic, 51 | // 缓存 30 天 52 | maxAgeSeconds: 30 * 24 * 60 * 60, 53 | }), 54 | // 使用 cacheableResponse 插件缓存状态码为 0 的请求 55 | new workbox.cacheableResponse.CacheableResponsePlugin({ 56 | statuses: [0, 200], 57 | }), 58 | ], 59 | }) 60 | ); 61 | 62 | // QQ 头像、群头像进行缓存优先缓存 63 | workbox.routing.registerRoute( 64 | new RegExp("https://p\.qlogo\.cn/gh/\d*/\d*/0|https://q1\.qlogo\.cn/g?b=qq&s=0&nk=\d*"), 65 | new workbox.strategies.CacheFirst({ 66 | // cache storage 名称和版本号 67 | cacheName: 'avatar', 68 | plugins: [ 69 | // 使用 expiration 插件实现缓存条目数目和时间控制 70 | new workbox.expiration.ExpirationPlugin({ 71 | // 最大保存项目 72 | maxEntriesPic, 73 | // 缓存 7 天 74 | maxAgeSeconds: 7 * 24 * 60 * 60, 75 | }), 76 | // 使用 cacheableResponse 插件缓存状态码为 0 的请求 77 | new workbox.cacheableResponse.CacheableResponsePlugin({ 78 | statuses: [0, 200], 79 | }), 80 | ], 81 | }) 82 | ); 83 | 84 | // Github 头像进行缓存优先缓存 85 | workbox.routing.registerRoute( 86 | new RegExp("https://avatars.githubusercontent.com/.*"), 87 | new workbox.strategies.CacheFirst({ 88 | // cache storage 名称和版本号 89 | cacheName: 'avatar', 90 | plugins: [ 91 | // 使用 expiration 插件实现缓存条目数目和时间控制 92 | new workbox.expiration.ExpirationPlugin({ 93 | // 最大保存项目 94 | maxEntriesPic, 95 | // 缓存 7 天 96 | maxAgeSeconds: 7 * 24 * 60 * 60, 97 | }), 98 | // 使用 cacheableResponse 插件缓存状态码为 0 的请求 99 | new workbox.cacheableResponse.CacheableResponsePlugin({ 100 | statuses: [0, 200], 101 | }), 102 | ], 103 | }) 104 | ); -------------------------------------------------------------------------------- /src/js/workbox/workbox-navigation-preload.dev.js: -------------------------------------------------------------------------------- 1 | this.workbox = this.workbox || {}; 2 | this.workbox.navigationPreload = (function (exports, logger_js) { 3 | 'use strict'; 4 | 5 | try { 6 | self['workbox:navigation-preload:6.5.2'] && _(); 7 | } catch (e) {} 8 | 9 | /* 10 | Copyright 2018 Google LLC 11 | 12 | Use of this source code is governed by an MIT-style 13 | license that can be found in the LICENSE file or at 14 | https://opensource.org/licenses/MIT. 15 | */ 16 | /** 17 | * @return {boolean} Whether or not the current browser supports enabling 18 | * navigation preload. 19 | * 20 | * @memberof workbox-navigation-preload 21 | */ 22 | 23 | function isSupported() { 24 | return Boolean(self.registration && self.registration.navigationPreload); 25 | } 26 | 27 | /* 28 | Copyright 2018 Google LLC 29 | 30 | Use of this source code is governed by an MIT-style 31 | license that can be found in the LICENSE file or at 32 | https://opensource.org/licenses/MIT. 33 | */ 34 | /** 35 | * If the browser supports Navigation Preload, then this will disable it. 36 | * 37 | * @memberof workbox-navigation-preload 38 | */ 39 | 40 | function disable() { 41 | if (isSupported()) { 42 | self.addEventListener('activate', event => { 43 | event.waitUntil(self.registration.navigationPreload.disable().then(() => { 44 | { 45 | logger_js.logger.log(`Navigation preload is disabled.`); 46 | } 47 | })); 48 | }); 49 | } else { 50 | { 51 | logger_js.logger.log(`Navigation preload is not supported in this browser.`); 52 | } 53 | } 54 | } 55 | 56 | /* 57 | Copyright 2018 Google LLC 58 | 59 | Use of this source code is governed by an MIT-style 60 | license that can be found in the LICENSE file or at 61 | https://opensource.org/licenses/MIT. 62 | */ 63 | /** 64 | * If the browser supports Navigation Preload, then this will enable it. 65 | * 66 | * @param {string} [headerValue] Optionally, allows developers to 67 | * [override](https://developers.google.com/web/updates/2017/02/navigation-preload#changing_the_header) 68 | * the value of the `Service-Worker-Navigation-Preload` header which will be 69 | * sent to the server when making the navigation request. 70 | * 71 | * @memberof workbox-navigation-preload 72 | */ 73 | 74 | function enable(headerValue) { 75 | if (isSupported()) { 76 | self.addEventListener('activate', event => { 77 | event.waitUntil(self.registration.navigationPreload.enable().then(() => { 78 | // Defaults to Service-Worker-Navigation-Preload: true if not set. 79 | if (headerValue) { 80 | void self.registration.navigationPreload.setHeaderValue(headerValue); 81 | } 82 | 83 | { 84 | logger_js.logger.log(`Navigation preload is enabled.`); 85 | } 86 | })); 87 | }); 88 | } else { 89 | { 90 | logger_js.logger.log(`Navigation preload is not supported in this browser.`); 91 | } 92 | } 93 | } 94 | 95 | exports.disable = disable; 96 | exports.enable = enable; 97 | exports.isSupported = isSupported; 98 | 99 | return exports; 100 | 101 | }({}, workbox.core._private)); 102 | //# sourceMappingURL=workbox-navigation-preload.dev.js.map 103 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-navigation-preload.prod.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"workbox-navigation-preload.prod.js","sources":["../_version.js","../isSupported.js","../disable.js","../enable.js"],"sourcesContent":["\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:navigation-preload:6.5.2'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport './_version.js';\n/**\n * @return {boolean} Whether or not the current browser supports enabling\n * navigation preload.\n *\n * @memberof workbox-navigation-preload\n */\nfunction isSupported() {\n return Boolean(self.registration && self.registration.navigationPreload);\n}\nexport { isSupported };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { isSupported } from './isSupported.js';\nimport './_version.js';\n/**\n * If the browser supports Navigation Preload, then this will disable it.\n *\n * @memberof workbox-navigation-preload\n */\nfunction disable() {\n if (isSupported()) {\n self.addEventListener('activate', (event) => {\n event.waitUntil(self.registration.navigationPreload.disable().then(() => {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is disabled.`);\n }\n }));\n });\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is not supported in this browser.`);\n }\n }\n}\nexport { disable };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { isSupported } from './isSupported.js';\nimport './_version.js';\n/**\n * If the browser supports Navigation Preload, then this will enable it.\n *\n * @param {string} [headerValue] Optionally, allows developers to\n * [override](https://developers.google.com/web/updates/2017/02/navigation-preload#changing_the_header)\n * the value of the `Service-Worker-Navigation-Preload` header which will be\n * sent to the server when making the navigation request.\n *\n * @memberof workbox-navigation-preload\n */\nfunction enable(headerValue) {\n if (isSupported()) {\n self.addEventListener('activate', (event) => {\n event.waitUntil(self.registration.navigationPreload.enable().then(() => {\n // Defaults to Service-Worker-Navigation-Preload: true if not set.\n if (headerValue) {\n void self.registration.navigationPreload.setHeaderValue(headerValue);\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is enabled.`);\n }\n }));\n });\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is not supported in this browser.`);\n }\n }\n}\nexport { enable };\n"],"names":["self","_","e","isSupported","Boolean","registration","navigationPreload","addEventListener","event","waitUntil","disable","then","headerValue","enable","setHeaderValue"],"mappings":"sFAEA,IACIA,KAAK,qCAAuCC,IAEhD,MAAOC,ICSP,SAASC,WACEC,QAAQJ,KAAKK,cAAgBL,KAAKK,aAAaC,oCCA1D,WACQH,KACAH,KAAKO,iBAAiB,YAAaC,IAC/BA,EAAMC,UAAUT,KAAKK,aAAaC,kBAAkBI,UAAUC,MAAK,uBCE/E,SAAgBC,GACRT,KACAH,KAAKO,iBAAiB,YAAaC,IAC/BA,EAAMC,UAAUT,KAAKK,aAAaC,kBAAkBO,SAASF,MAAK,KAE1DC,GACKZ,KAAKK,aAAaC,kBAAkBQ,eAAeF"} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Stapxs-QQ-Lite 2 | ### 去看看 2.0 版本吧 —— 3 | Stapxs QQ Lite 1.0 已停止维护,如果你对它感兴趣 —— 不如来看看 [2.0](https://github.com/Stapxs/Stapxs-QQ-Lite-2.0) 版本。 4 | 5 |
6 | 7 | ![logo](https://raw.githubusercontent.com/Stapxs/Stapxs-QQ-Lite/main/topbar.png) 8 | 9 |
10 |
11 | 12 | GitHub repo size 15 | 16 | 17 | GitHub release (latest by date including pre-releases) 20 | 21 | 22 | GitHub last commit 25 | 26 |
27 |
28 | 29 |
30 | 31 |
32 |

Stapxs QQ Lite

33 |

一个兼容 oicq-http 的非官方网页版 QQ 客户端



34 | 本网页仅供学习交流使用,请勿用于其他用途
35 | 版权争议请提出 issue 协商
36 | 本网页存在大量不规范的写法和操作
37 | 请不要使用此网页作为 JavaScript 开发参考 38 |
39 | 40 |
41 |
42 | 43 | ## 在线演示 44 | 45 | ### GitHub Pages 46 | 47 | 本仓库开启了 GitHub Pages, 你可以选择直接访问本仓库的页面来使用: 48 | 49 | ## 部署 50 | 51 | ### 克隆仓库 52 | 53 | 此项目为完整的纯前端静态页面,你可以克隆仓库,非常暴力的直接打开 `index.html` 来使用; 但是需要注意的是部分浏览器在使用 `file://` 协议的时候无法正常允许页面发起通知, 同时文件也无法唤起 PWA 功能进行 PWA APP 安装。 54 | 在 `v1.2.0` 版本之后,依赖 cookie 的功能也完全无法在文件打开时使用,敬请注意。 55 | 56 | 同样由于此项目是静态页面,你也可以将它部署在任何 Web 服务端或者静态页面托管服务上。 57 | 58 | ## 使用 59 | 60 | 本程序依赖 oicq-http v1 作为后端服务, 关于 oicq-http 可以参考 [此处](https://github.com/takayama-lily/oicq/tree/master/http-api)。 61 | 62 | ### 部署 OICQ 63 | 64 | 你可以参考 oicq-http 的简单教程部署 oicq-http Bot, 或者看下面。 65 | 66 | 1. 运行 oicq 需要依赖 Node.js (12.16+), 确保你已经安装了 Node.js (和 NPM), 执行如下指令安装 oicq-http: 67 | `npm i oicq@1 -g` 68 | 如果你使用 Yarn: 69 | `yarn global add oicq@1` 70 | 71 | 2. 接下来使用你的 QQ 号登录 oicq: 72 | `oicq < QQ 号 >` 73 | 74 | 3. 首次运行将生成配置文件, 需要修改配置文件来使 Web 可以交互: 75 | ![首次运行 oicq](src/readme/fist_run_oicq.png) 76 | 打开生成的配置文件修改一些东西, 确保启用了 ws 服务并设置了连接 token: 77 | ![设置 oicq](src/readme/oicq_config.png) 78 | 79 | 4. 再次使用你的 QQ 号登录 oicq, oicq-http 应当正常启动: 80 | ![启动 oicq](src/readme/oicq_end.png) 81 | 82 | ### 连接 OICQ 83 | 84 | 接下来就可以打开页面连接到 oicq-http 了; 如果在本地部署了 oicq-http 直接连接本地即可, 网络服务则建议开启 wss 并连接, 此处不过多累述。 85 | 86 | ![连接 oicq](src/readme/QWL_connect.png) 87 | 88 | ![结束](src/readme/QWL_end.png) 89 | 90 | ## 其他提醒 91 | 92 | ### 关于不安全连接 93 | - 当使用 https 页面连接 ws 服务(反之相同)的情况下,连接将会失败;这是由于其中某一者是不安全的。在这种情况下,你可以选择将 ws 提升为 wss 或者将 https 降级为 http(不安全)来解决问题,此处不提供解决方案。[#32](https://github.com/Stapxs/Stapxs-QQ-Lite/issues/32) 94 | 95 | ## 更多问题 96 | 97 | ### 我能使用其他 QQ Http Bot 吗 98 | 99 | - 如果它兼容 [OneBot 11 协议](), 你可以尝试连接它, 但是由于消息体格式和接口扩展的差异,大部分情况下都不能完全正常使用。以下是已经经过兼容的 Bot: 100 | 101 | - [oicq http v1](https://github.com/takayama-lily/oicq/tree/master/http-api):完全兼容 102 | - [go-cqhttp](https://github.com/Mrs4s/go-cqhttp):基本兼容,目前 @ 消息不能正常显示 103 | 104 | ### 使用 Bot 是否有风险 105 | 106 | - 如果你使用的是 oicq-http, 可以查看此处了解 [使用风险](), 如果你尝试使用其他 QQ Bot (参见上一条问题), 请自行参考它的文档。 107 | 108 | ### 我遇到了问题 109 | 110 | - 如果有什么奇奇怪怪的问题, 欢迎发起 [issue]() 询问! 如果有什么 BUG 和优化建议也可以哦! 111 | 112 | ## 依赖和许可声明 113 | 114 | 115 | | | | 116 | | ---- | ---- | 117 | | Stapxs QQ Lite | (C) Stapx Steve [ 林槐 ]. licensed under Apache 2.0 | 118 | | Border Card UI | (C) Stapx Steve [ 林槐 ]. licensed under Apache 2.0 | 119 | | Bootstrap | (C) Fathom. licensed under MIT | 120 | | Font Awesome | (C) Fonticons, Inc. licensed under SIL OFL 1.1 | 121 | | JQuery & JQuery UI | (C) OpenJS Foundation. licensed under MIT | 122 | | QFace | https://github.com/koishijs/QFace | 123 | 124 |
125 |
126 |
127 | README v1.3 128 |
129 | 林槐出品, 必属稽品 130 |
131 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-navigation-preload.dev.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"workbox-navigation-preload.dev.js","sources":["../_version.js","../isSupported.js","../disable.js","../enable.js"],"sourcesContent":["\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:navigation-preload:6.5.2'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport './_version.js';\n/**\n * @return {boolean} Whether or not the current browser supports enabling\n * navigation preload.\n *\n * @memberof workbox-navigation-preload\n */\nfunction isSupported() {\n return Boolean(self.registration && self.registration.navigationPreload);\n}\nexport { isSupported };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { isSupported } from './isSupported.js';\nimport './_version.js';\n/**\n * If the browser supports Navigation Preload, then this will disable it.\n *\n * @memberof workbox-navigation-preload\n */\nfunction disable() {\n if (isSupported()) {\n self.addEventListener('activate', (event) => {\n event.waitUntil(self.registration.navigationPreload.disable().then(() => {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is disabled.`);\n }\n }));\n });\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is not supported in this browser.`);\n }\n }\n}\nexport { disable };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { isSupported } from './isSupported.js';\nimport './_version.js';\n/**\n * If the browser supports Navigation Preload, then this will enable it.\n *\n * @param {string} [headerValue] Optionally, allows developers to\n * [override](https://developers.google.com/web/updates/2017/02/navigation-preload#changing_the_header)\n * the value of the `Service-Worker-Navigation-Preload` header which will be\n * sent to the server when making the navigation request.\n *\n * @memberof workbox-navigation-preload\n */\nfunction enable(headerValue) {\n if (isSupported()) {\n self.addEventListener('activate', (event) => {\n event.waitUntil(self.registration.navigationPreload.enable().then(() => {\n // Defaults to Service-Worker-Navigation-Preload: true if not set.\n if (headerValue) {\n void self.registration.navigationPreload.setHeaderValue(headerValue);\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is enabled.`);\n }\n }));\n });\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is not supported in this browser.`);\n }\n }\n}\nexport { enable };\n"],"names":["self","_","e","isSupported","Boolean","registration","navigationPreload","disable","addEventListener","event","waitUntil","then","logger","log","enable","headerValue","setHeaderValue"],"mappings":";;;;IAEA,IAAI;IACAA,EAAAA,IAAI,CAAC,kCAAD,CAAJ,IAA4CC,CAAC,EAA7C;IACH,CAFD,CAGA,OAAOC,CAAP,EAAU;;ICLV;IACA;AACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;;IACA,SAASC,WAAT,GAAuB;IACnB,SAAOC,OAAO,CAACJ,IAAI,CAACK,YAAL,IAAqBL,IAAI,CAACK,YAAL,CAAkBC,iBAAxC,CAAd;IACH;;IChBD;IACA;AACA;IACA;IACA;IACA;IACA;IAIA;IACA;IACA;IACA;IACA;;IACA,SAASC,OAAT,GAAmB;IACf,MAAIJ,WAAW,EAAf,EAAmB;IACfH,IAAAA,IAAI,CAACQ,gBAAL,CAAsB,UAAtB,EAAmCC,KAAD,IAAW;IACzCA,MAAAA,KAAK,CAACC,SAAN,CAAgBV,IAAI,CAACK,YAAL,CAAkBC,iBAAlB,CAAoCC,OAApC,GAA8CI,IAA9C,CAAmD,MAAM;IACrE,QAA2C;IACvCC,UAAAA,gBAAM,CAACC,GAAP,CAAY,iCAAZ;IACH;IACJ,OAJe,CAAhB;IAKH,KAND;IAOH,GARD,MASK;IACD,IAA2C;IACvCD,MAAAA,gBAAM,CAACC,GAAP,CAAY,sDAAZ;IACH;IACJ;IACJ;;IC9BD;IACA;AACA;IACA;IACA;IACA;IACA;IAIA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;IACA,SAASC,MAAT,CAAgBC,WAAhB,EAA6B;IACzB,MAAIZ,WAAW,EAAf,EAAmB;IACfH,IAAAA,IAAI,CAACQ,gBAAL,CAAsB,UAAtB,EAAmCC,KAAD,IAAW;IACzCA,MAAAA,KAAK,CAACC,SAAN,CAAgBV,IAAI,CAACK,YAAL,CAAkBC,iBAAlB,CAAoCQ,MAApC,GAA6CH,IAA7C,CAAkD,MAAM;IACpE;IACA,YAAII,WAAJ,EAAiB;IACb,eAAKf,IAAI,CAACK,YAAL,CAAkBC,iBAAlB,CAAoCU,cAApC,CAAmDD,WAAnD,CAAL;IACH;;IACD,QAA2C;IACvCH,UAAAA,gBAAM,CAACC,GAAP,CAAY,gCAAZ;IACH;IACJ,OARe,CAAhB;IASH,KAVD;IAWH,GAZD,MAaK;IACD,IAA2C;IACvCD,MAAAA,gBAAM,CAACC,GAAP,CAAY,sDAAZ;IACH;IACJ;IACJ;;;;;;;;;;;;"} -------------------------------------------------------------------------------- /src/js/workbox/workbox-window.prod.es5.mjs: -------------------------------------------------------------------------------- 1 | try{self["workbox:window:6.5.2"]&&_()}catch(n){}function n(n,t){return new Promise((function(r){var e=new MessageChannel;e.port1.onmessage=function(n){r(n.data)},n.postMessage(t,[e.port2])}))}function t(n,t){for(var r=0;rn.length)&&(t=n.length);for(var r=0,e=new Array(t);r=n.length?{done:!0}:{done:!1,value:n[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(e=n[Symbol.iterator]()).next.bind(e)}try{self["workbox:core:6.5.2"]&&_()}catch(n){}var i=function(){var n=this;this.promise=new Promise((function(t,r){n.resolve=t,n.reject=r}))};function o(n,t){var r=location.href;return new URL(n,r).href===new URL(t,r).href}var u=function(n,t){this.type=n,Object.assign(this,t)};function a(n,t,r){return r?t?t(n):n:(n&&n.then||(n=Promise.resolve(n)),t?n.then(t):n)}function c(){}var f={type:"SKIP_WAITING"};function s(n,t){if(!t)return n&&n.then?n.then(c):Promise.resolve()}var v=function(r){var e,c;function v(n,t){var e,c;return void 0===t&&(t={}),(e=r.call(this)||this).nn={},e.tn=0,e.rn=new i,e.en=new i,e.on=new i,e.un=0,e.an=new Set,e.cn=function(){var n=e.fn,t=n.installing;e.tn>0||!o(t.scriptURL,e.sn.toString())||performance.now()>e.un+6e4?(e.vn=t,n.removeEventListener("updatefound",e.cn)):(e.hn=t,e.an.add(t),e.rn.resolve(t)),++e.tn,t.addEventListener("statechange",e.ln)},e.ln=function(n){var t=e.fn,r=n.target,i=r.state,o=r===e.vn,a={sw:r,isExternal:o,originalEvent:n};!o&&e.mn&&(a.isUpdate=!0),e.dispatchEvent(new u(i,a)),"installed"===i?e.wn=self.setTimeout((function(){"installed"===i&&t.waiting===r&&e.dispatchEvent(new u("waiting",a))}),200):"activating"===i&&(clearTimeout(e.wn),o||e.en.resolve(r))},e.dn=function(n){var t=e.hn,r=t!==navigator.serviceWorker.controller;e.dispatchEvent(new u("controlling",{isExternal:r,originalEvent:n,sw:t,isUpdate:e.mn})),r||e.on.resolve(t)},e.gn=(c=function(n){var t=n.data,r=n.ports,i=n.source;return a(e.getSW(),(function(){e.an.has(i)&&e.dispatchEvent(new u("message",{data:t,originalEvent:n,ports:r,sw:i}))}))},function(){for(var n=[],t=0;tn.length)&&(t=n.length);for(var r=0,e=new Array(t);r=n.length?{done:!0}:{done:!1,value:n[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(r=n[Symbol.iterator]()).next.bind(r)}try{self["workbox:core:6.5.2"]&&_()}catch(n){}var o=function(){var n=this;this.promise=new Promise((function(t,r){n.resolve=t,n.reject=r}))};function u(n,t){var r=location.href;return new URL(n,r).href===new URL(t,r).href}var a=function(n,t){this.type=n,Object.assign(this,t)};function c(n,t,r){return r?t?t(n):n:(n&&n.then||(n=Promise.resolve(n)),t?n.then(t):n)}function f(){}var s={type:"SKIP_WAITING"};function v(n,t){if(!t)return n&&n.then?n.then(f):Promise.resolve()}var h=function(n){var e,i;function f(t,r){var e,i;return void 0===r&&(r={}),(e=n.call(this)||this).nn={},e.tn=0,e.rn=new o,e.en=new o,e.on=new o,e.un=0,e.an=new Set,e.cn=function(){var n=e.fn,t=n.installing;e.tn>0||!u(t.scriptURL,e.sn.toString())||performance.now()>e.un+6e4?(e.vn=t,n.removeEventListener("updatefound",e.cn)):(e.hn=t,e.an.add(t),e.rn.resolve(t)),++e.tn,t.addEventListener("statechange",e.ln)},e.ln=function(n){var t=e.fn,r=n.target,i=r.state,o=r===e.vn,u={sw:r,isExternal:o,originalEvent:n};!o&&e.dn&&(u.isUpdate=!0),e.dispatchEvent(new a(i,u)),"installed"===i?e.mn=self.setTimeout((function(){"installed"===i&&t.waiting===r&&e.dispatchEvent(new a("waiting",u))}),200):"activating"===i&&(clearTimeout(e.mn),o||e.en.resolve(r))},e.wn=function(n){var t=e.hn,r=t!==navigator.serviceWorker.controller;e.dispatchEvent(new a("controlling",{isExternal:r,originalEvent:n,sw:t,isUpdate:e.dn})),r||e.on.resolve(t)},e.gn=(i=function(n){var t=n.data,r=n.ports,i=n.source;return c(e.getSW(),(function(){e.an.has(i)&&e.dispatchEvent(new a("message",{data:t,originalEvent:n,ports:r,sw:i}))}))},function(){for(var n=[],t=0;t(t[e]=n,!0),has:(t,e)=>t instanceof IDBTransaction&&("done"===e||"store"===e)||e in t};function w(t){return t!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(o||(o=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(t)?function(...e){return t.apply(m(this),e),D(c.get(this))}:function(...e){return D(t.apply(m(this),e))}:function(e,...n){const s=t.call(m(this),e,...n);return h.set(s,e.sort?e.sort():[e]),D(s)}}function p(t){return"function"==typeof t?w(t):(t instanceof IDBTransaction&&function(t){if(u.has(t))return;const e=new Promise(((e,n)=>{const s=()=>{t.removeEventListener("complete",i),t.removeEventListener("error",r),t.removeEventListener("abort",r)},i=()=>{e(),s()},r=()=>{n(t.error||new DOMException("AbortError","AbortError")),s()};t.addEventListener("complete",i),t.addEventListener("error",r),t.addEventListener("abort",r)}));u.set(t,e)}(t),e=t,(a||(a=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])).some((t=>e instanceof t))?new Proxy(t,d):t);var e}function D(t){if(t instanceof IDBRequest)return function(t){const e=new Promise(((e,n)=>{const s=()=>{t.removeEventListener("success",i),t.removeEventListener("error",r)},i=()=>{e(D(t.result)),s()},r=()=>{n(t.error),s()};t.addEventListener("success",i),t.addEventListener("error",r)}));return e.then((e=>{e instanceof IDBCursor&&c.set(e,t)})).catch((()=>{})),l.set(e,t),e}(t);if(f.has(t))return f.get(t);const e=p(t);return e!==t&&(f.set(t,e),l.set(e,t)),e}const m=t=>l.get(t);const b=["get","getKey","getAll","getAllKeys","count"],y=["put","add","delete","clear"],I=new Map;function B(t,e){if(!(t instanceof IDBDatabase)||e in t||"string"!=typeof e)return;if(I.get(e))return I.get(e);const n=e.replace(/FromIndex$/,""),s=e!==n,i=y.includes(n);if(!(n in(s?IDBIndex:IDBObjectStore).prototype)||!i&&!b.includes(n))return;const r=async function(t,...e){const r=this.transaction(t,i?"readwrite":"readonly");let a=r.store;return s&&(a=a.index(e.shift())),(await Promise.all([a[n](...e),i&&r.done]))[0]};return I.set(e,r),r}d=(t=>r({},t,{get:(e,n,s)=>B(e,n)||t.get(e,n,s),has:(e,n)=>!!B(e,n)||t.has(e,n)}))(d);try{self["workbox:expiration:6.5.2"]&&_()}catch(t){}const g="cache-entries",x=t=>{const e=new URL(t,location.href);return e.hash="",e.href};class k{constructor(t){this.t=null,this.M=t}i(t){const e=t.createObjectStore(g,{keyPath:"id"});e.createIndex("cacheName","cacheName",{unique:!1}),e.createIndex("timestamp","timestamp",{unique:!1})}N(t){this.i(t),this.M&&function(t,{blocked:e}={}){const n=indexedDB.deleteDatabase(t);e&&n.addEventListener("blocked",(()=>e())),D(n).then((()=>{}))}(this.M)}async setTimestamp(t,e){const n={url:t=x(t),timestamp:e,cacheName:this.M,id:this.T(t)},s=(await this.getDb()).transaction(g,"readwrite",{durability:"relaxed"});await s.store.put(n),await s.done}async getTimestamp(t){const e=await this.getDb(),n=await e.get(g,this.T(t));return null==n?void 0:n.timestamp}async expireEntries(t,e){const n=await this.getDb();let s=await n.transaction(g).store.index("timestamp").openCursor(null,"prev");const i=[];let r=0;for(;s;){const n=s.value;n.cacheName===this.M&&(t&&n.timestamp=e?i.push(s.value):r++),s=await s.continue()}const a=[];for(const t of i)await n.delete(g,t.id),a.push(t.url);return a}T(t){return this.M+"|"+x(t)}async getDb(){return this.t||(this.t=await function(t,e,{blocked:n,upgrade:s,blocking:i,terminated:r}={}){const a=indexedDB.open(t,e),o=D(a);return s&&a.addEventListener("upgradeneeded",(t=>{s(D(a.result),t.oldVersion,t.newVersion,D(a.transaction))})),n&&a.addEventListener("blocked",(()=>n())),o.then((t=>{r&&t.addEventListener("close",(()=>r())),i&&t.addEventListener("versionchange",(()=>i()))})).catch((()=>{})),o}("workbox-expiration",1,{upgrade:this.N.bind(this)})),this.t}}class v{constructor(t,e={}){this.P=!1,this.W=!1,this.K=e.maxEntries,this.L=e.maxAgeSeconds,this.H=e.matchOptions,this.M=t,this.$=new k(t)}async expireEntries(){if(this.P)return void(this.W=!0);this.P=!0;const t=this.L?Date.now()-1e3*this.L:0,n=await this.$.expireEntries(t,this.K),s=await self.caches.open(this.M);for(const t of n)await s.delete(t,this.H);this.P=!1,this.W&&(this.W=!1,e.dontWaitFor(this.expireEntries()))}async updateTimestamp(t){await this.$.setTimestamp(t,Date.now())}async isURLExpired(t){if(this.L){const e=await this.$.getTimestamp(t),n=Date.now()-1e3*this.L;return void 0===e||e{if(!i)return null;const r=this.J(i),a=this.V(s);e.dontWaitFor(a.expireEntries());const o=a.updateTimestamp(n.url);if(t)try{t.waitUntil(o)}catch(t){}return r?i:null},this.cacheDidUpdate=async({cacheName:t,request:e})=>{const n=this.V(t);await n.updateTimestamp(e.url),await n.expireEntries()},this.X=t,this.L=t.maxAgeSeconds,this.Y=new Map,t.purgeOnQuotaError&&s.registerQuotaErrorCallback((()=>this.deleteCacheAndMetadata()))}V(t){if(t===n.cacheNames.getRuntimeName())throw new i.WorkboxError("expire-custom-caches-only");let e=this.Y.get(t);return e||(e=new v(t,this.X),this.Y.set(t,e)),e}J(t){if(!this.L)return!0;const e=this.Z(t);if(null===e)return!0;return e>=Date.now()-1e3*this.L}Z(t){if(!t.headers.has("date"))return null;const e=t.headers.get("date"),n=new Date(e).getTime();return isNaN(n)?null:n}async deleteCacheAndMetadata(){for(const[t,e]of this.Y)await self.caches.delete(t),await e.delete();this.Y=new Map}},t}({},workbox.core._private,workbox.core._private,workbox.core,workbox.core._private); 2 | //# sourceMappingURL=workbox-expiration.prod.js.map 3 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-strategies.prod.js: -------------------------------------------------------------------------------- 1 | this.workbox=this.workbox||{},this.workbox.strategies=function(t,e,s,r,n,i,a,o,c){"use strict";try{self["workbox:strategies:6.5.2"]&&_()}catch(t){}function h(t){return"string"==typeof t?new Request(t):t}class l{constructor(t,e){this.yt={},Object.assign(this,e),this.event=e.event,this.at=t,this.vt=new n.Deferred,this.bt=[],this.Et=[...t.plugins],this._t=new Map;for(const t of this.Et)this._t.set(t,{});this.event.waitUntil(this.vt.promise)}async fetch(t){const{event:s}=this;let r=h(t);if("navigate"===r.mode&&s instanceof FetchEvent&&s.preloadResponse){const t=await s.preloadResponse;if(t)return t}const n=this.hasCallback("fetchDidFail")?r.clone():null;try{for(const t of this.iterateCallbacks("requestWillFetch"))r=await t({request:r.clone(),event:s})}catch(t){if(t instanceof Error)throw new e.WorkboxError("plugin-error-request-will-fetch",{thrownErrorMessage:t.message})}const i=r.clone();try{let t;t=await fetch(r,"navigate"===r.mode?void 0:this.at.fetchOptions);for(const e of this.iterateCallbacks("fetchDidSucceed"))t=await e({event:s,request:i,response:t});return t}catch(t){throw n&&await this.runCallbacks("fetchDidFail",{error:t,event:s,originalRequest:n.clone(),request:i.clone()}),t}}async fetchAndCachePut(t){const e=await this.fetch(t),s=e.clone();return this.waitUntil(this.cachePut(t,s)),e}async cacheMatch(t){const e=h(t);let s;const{cacheName:r,matchOptions:n}=this.at,i=await this.getCacheKey(e,"read"),a=Object.assign(Object.assign({},n),{cacheName:r});s=await caches.match(i,a);for(const t of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await t({cacheName:r,matchOptions:n,cachedResponse:s,request:i,event:this.event})||void 0;return s}async cachePut(t,s){const n=h(t);await c.timeout(0);const o=await this.getCacheKey(n,"write");if(!s)throw new e.WorkboxError("cache-put-with-no-response",{url:a.getFriendlyURL(o.url)});const l=await this.kt(s);if(!l)return!1;const{cacheName:w,matchOptions:u}=this.at,f=await self.caches.open(w),d=this.hasCallback("cacheDidUpdate"),p=d?await r.cacheMatchIgnoreParams(f,o.clone(),["__WB_REVISION__"],u):null;try{await f.put(o,d?l.clone():l)}catch(t){if(t instanceof Error)throw"QuotaExceededError"===t.name&&await i.executeQuotaErrorCallbacks(),t}for(const t of this.iterateCallbacks("cacheDidUpdate"))await t({cacheName:w,oldResponse:p,newResponse:l.clone(),request:o,event:this.event});return!0}async getCacheKey(t,e){const s=`${t.url} | ${e}`;if(!this.yt[s]){let r=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))r=h(await t({mode:e,request:r,event:this.event,params:this.params}));this.yt[s]=r}return this.yt[s]}hasCallback(t){for(const e of this.at.plugins)if(t in e)return!0;return!1}async runCallbacks(t,e){for(const s of this.iterateCallbacks(t))await s(e)}*iterateCallbacks(t){for(const e of this.at.plugins)if("function"==typeof e[t]){const s=this._t.get(e),r=r=>{const n=Object.assign(Object.assign({},r),{state:s});return e[t](n)};yield r}}waitUntil(t){return this.bt.push(t),t}async doneWaiting(){let t;for(;t=this.bt.shift();)await t}destroy(){this.vt.resolve(null)}async kt(t){let e=t,s=!1;for(const t of this.iterateCallbacks("cacheWillUpdate"))if(e=await t({request:this.request,response:e,event:this.event})||void 0,s=!0,!e)break;return s||e&&200!==e.status&&(e=void 0),e}}class w{constructor(t={}){this.cacheName=s.cacheNames.getRuntimeName(t.cacheName),this.plugins=t.plugins||[],this.fetchOptions=t.fetchOptions,this.matchOptions=t.matchOptions}handle(t){const[e]=this.handleAll(t);return e}handleAll(t){t instanceof FetchEvent&&(t={event:t,request:t.request});const e=t.event,s="string"==typeof t.request?new Request(t.request):t.request,r="params"in t?t.params:void 0,n=new l(this,{event:e,request:s,params:r}),i=this.xt(n,s,e);return[i,this.Rt(i,n,s,e)]}async xt(t,s,r){await t.runCallbacks("handlerWillStart",{event:r,request:s});let n=void 0;try{if(n=await this._handle(s,t),!n||"error"===n.type)throw new e.WorkboxError("no-response",{url:s.url})}catch(e){if(e instanceof Error)for(const i of t.iterateCallbacks("handlerDidError"))if(n=await i({error:e,event:r,request:s}),n)break;if(!n)throw e}for(const e of t.iterateCallbacks("handlerWillRespond"))n=await e({event:r,request:s,response:n});return n}async Rt(t,e,s,r){let n,i;try{n=await t}catch(i){}try{await e.runCallbacks("handlerDidRespond",{event:r,request:s,response:n}),await e.doneWaiting()}catch(t){t instanceof Error&&(i=t)}if(await e.runCallbacks("handlerDidComplete",{event:r,request:s,response:n,error:i}),e.destroy(),i)throw i}}const u={cacheWillUpdate:async({response:t})=>200===t.status||0===t.status?t:null};return t.CacheFirst=class extends w{async _handle(t,s){let r=await s.cacheMatch(t),n=void 0;if(!r)try{r=await s.fetchAndCachePut(t)}catch(t){t instanceof Error&&(n=t)}if(!r)throw new e.WorkboxError("no-response",{url:t.url,error:n});return r}},t.CacheOnly=class extends w{async _handle(t,s){const r=await s.cacheMatch(t);if(!r)throw new e.WorkboxError("no-response",{url:t.url});return r}},t.NetworkFirst=class extends w{constructor(t={}){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(u),this.Wt=t.networkTimeoutSeconds||0}async _handle(t,s){const r=[],n=[];let i;if(this.Wt){const{id:e,promise:a}=this.Ot({request:t,logs:r,handler:s});i=e,n.push(a)}const a=this.Ut({timeoutId:i,request:t,logs:r,handler:s});n.push(a);const o=await s.waitUntil((async()=>await s.waitUntil(Promise.race(n))||await a)());if(!o)throw new e.WorkboxError("no-response",{url:t.url});return o}Ot({request:t,logs:e,handler:s}){let r;return{promise:new Promise((e=>{r=setTimeout((async()=>{e(await s.cacheMatch(t))}),1e3*this.Wt)})),id:r}}async Ut({timeoutId:t,request:e,logs:s,handler:r}){let n,i;try{i=await r.fetchAndCachePut(e)}catch(t){t instanceof Error&&(n=t)}return t&&clearTimeout(t),!n&&i||(i=await r.cacheMatch(e)),i}},t.NetworkOnly=class extends w{constructor(t={}){super(t),this.Wt=t.networkTimeoutSeconds||0}async _handle(t,s){let r,n=void 0;try{const e=[s.fetch(t)];if(this.Wt){const t=c.timeout(1e3*this.Wt);e.push(t)}if(r=await Promise.race(e),!r)throw new Error("Timed out the network response after "+this.Wt+" seconds.")}catch(t){t instanceof Error&&(n=t)}if(!r)throw new e.WorkboxError("no-response",{url:t.url,error:n});return r}},t.StaleWhileRevalidate=class extends w{constructor(t={}){super(t),this.plugins.some((t=>"cacheWillUpdate"in t))||this.plugins.unshift(u)}async _handle(t,s){const r=s.fetchAndCachePut(t).catch((()=>{}));s.waitUntil(r);let n,i=await s.cacheMatch(t);if(i);else try{i=await r}catch(t){t instanceof Error&&(n=t)}if(!i)throw new e.WorkboxError("no-response",{url:t.url,error:n});return i}},t.Strategy=w,t.StrategyHandler=l,t}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private); 2 | //# sourceMappingURL=workbox-strategies.prod.js.map 3 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-precaching.prod.js: -------------------------------------------------------------------------------- 1 | this.workbox=this.workbox||{},this.workbox.precaching=function(t,e,s,n,i,c,r,o){"use strict";try{self["workbox:precaching:6.5.2"]&&_()}catch(t){}function a(t){if(!t)throw new s.WorkboxError("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s.WorkboxError("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const i=new URL(n,location.href),c=new URL(n,location.href);return i.searchParams.set("__WB_REVISION__",e),{cacheKey:i.href,url:c.href}}class h{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type&&e&&e.originalRequest&&e.originalRequest instanceof Request){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class l{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this.tt.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this.tt=t}}class u extends c.Strategy{constructor(t={}){t.cacheName=e.cacheNames.getPrecacheName(t.cacheName),super(t),this.et=!1!==t.fallbackToNetwork,this.plugins.push(u.copyRedirectedCacheableResponsesPlugin)}async _handle(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.st(t,e):await this.nt(t,e))}async nt(t,e){let n;const i=e.params||{};if(!this.et)throw new s.WorkboxError("missing-precache-entry",{cacheName:this.cacheName,url:t.url});{const s=i.integrity,c=t.integrity,r=!c||c===s;n=await e.fetch(new Request(t,{integrity:c||s})),s&&r&&(this.it(),await e.cachePut(t,n.clone()))}return n}async st(t,e){this.it();const n=await e.fetch(t);if(!await e.cachePut(t,n.clone()))throw new s.WorkboxError("bad-precaching-response",{url:t.url,status:n.status});return n}it(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==u.copyRedirectedCacheableResponsesPlugin&&(n===u.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(u.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}u.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},u.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await i.copyResponse(t):t};class f{constructor({cacheName:t,plugins:s=[],fallbackToNetwork:n=!0}={}){this.ct=new Map,this.rt=new Map,this.ot=new Map,this.at=new u({cacheName:e.cacheNames.getPrecacheName(t),plugins:[...s,new l({precacheController:this})],fallbackToNetwork:n}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this.at}precache(t){this.addToCacheList(t),this.ht||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.ht=!0)}addToCacheList(t){const e=[];for(const n of t){"string"==typeof n?e.push(n):n&&void 0===n.revision&&e.push(n.url);const{cacheKey:t,url:i}=a(n),c="string"!=typeof n&&n.revision?"reload":"default";if(this.ct.has(i)&&this.ct.get(i)!==t)throw new s.WorkboxError("add-to-cache-list-conflicting-entries",{firstEntry:this.ct.get(i),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.ot.has(t)&&this.ot.get(t)!==n.integrity)throw new s.WorkboxError("add-to-cache-list-conflicting-integrities",{url:i});this.ot.set(t,n.integrity)}if(this.ct.set(i,t),this.rt.set(i,c),e.length>0){const t=`Workbox is precaching URLs without revision info: ${e.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(t)}}}install(t){return n.waitUntil(t,(async()=>{const e=new h;this.strategy.plugins.push(e);for(const[e,s]of this.ct){const n=this.ot.get(s),i=this.rt.get(e),c=new Request(e,{integrity:n,cache:i,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:c,event:t}))}const{updatedURLs:s,notUpdatedURLs:n}=e;return{updatedURLs:s,notUpdatedURLs:n}}))}activate(t){return n.waitUntil(t,(async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.ct.values()),n=[];for(const i of e)s.has(i.url)||(await t.delete(i),n.push(i.url));return{deletedURLs:n}}))}getURLsToCacheKeys(){return this.ct}getCachedURLs(){return[...this.ct.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.ct.get(e.href)}getIntegrityForCacheKey(t){return this.ot.get(t)}async matchPrecache(t){const e=t instanceof Request?t.url:t,s=this.getCacheKeyForURL(e);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(t){const e=this.getCacheKeyForURL(t);if(!e)throw new s.WorkboxError("non-precached-url",{url:t});return s=>(s.request=new Request(t),s.params=Object.assign({cacheKey:e},s.params),this.strategy.handle(s))}}let w;const d=()=>(w||(w=new f),w);class y extends o.Route{constructor(t,e){super((({request:s})=>{const n=t.getURLsToCacheKeys();for(const i of function*(t,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:i}={}){const c=new URL(t,location.href);c.hash="",yield c.href;const r=function(t,e=[]){for(const s of[...t.searchParams.keys()])e.some((t=>t.test(s)))&&t.searchParams.delete(s);return t}(c,e);if(yield r.href,s&&r.pathname.endsWith("/")){const t=new URL(r.href);t.pathname+=s,yield t.href}if(n){const t=new URL(r.href);t.pathname+=".html",yield t.href}if(i){const t=i({url:c});for(const e of t)yield e.href}}(s.url,e)){const e=n.get(i);if(e){return{cacheKey:e,integrity:t.getIntegrityForCacheKey(e)}}}}),t.strategy)}}function p(t){const e=d(),s=new y(e,t);r.registerRoute(s)}function R(t){d().precache(t)}return t.PrecacheController=f,t.PrecacheFallbackPlugin=class{constructor({fallbackURL:t,precacheController:e}){this.handlerDidError=()=>this.tt.matchPrecache(this.lt),this.lt=t,this.tt=e||d()}},t.PrecacheRoute=y,t.PrecacheStrategy=u,t.addPlugins=function(t){d().strategy.plugins.push(...t)},t.addRoute=p,t.cleanupOutdatedCaches=function(){self.addEventListener("activate",(t=>{const s=e.cacheNames.getPrecacheName();t.waitUntil((async(t,e="-precache-")=>{const s=(await self.caches.keys()).filter((s=>s.includes(e)&&s.includes(self.registration.scope)&&s!==t));return await Promise.all(s.map((t=>self.caches.delete(t)))),s})(s).then((t=>{})))}))},t.createHandlerBoundToURL=function(t){return d().createHandlerBoundToURL(t)},t.getCacheKeyForURL=function(t){return d().getCacheKeyForURL(t)},t.matchPrecache=function(t){return d().matchPrecache(t)},t.precache=R,t.precacheAndRoute=function(t,e){R(t),p(e)},t}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core,workbox.strategies,workbox.routing,workbox.routing); 2 | //# sourceMappingURL=workbox-precaching.prod.js.map 3 | -------------------------------------------------------------------------------- /css/msg.css: -------------------------------------------------------------------------------- 1 | /* 2 | msg.css - 消息的样式 3 | 2022/04/03 - Stapx Steve [林槐] 4 | */ 5 | 6 | .message { 7 | display: flex; 8 | padding: 5px 10px; 9 | width: 100%; 10 | border-radius: 7px; 11 | margin: 5px 0; 12 | } 13 | .message > img { 14 | width: 35px; 15 | height: 35px; 16 | border-radius: 100%; 17 | margin: 5px 15px 0 15px; 18 | } 19 | .message-body { 20 | color: var(--color-font); 21 | max-width: 60%; 22 | } 23 | .message-body a { 24 | color: var(--color-font); 25 | } 26 | .message-body a:link { 27 | opacity: 0.8; 28 | } 29 | .message-body a:link:before { 30 | text-align: center; 31 | content: '🔗'; 32 | color: transparent; 33 | text-shadow: 0 0 0 var(--color-font-1); 34 | } 35 | .message-body > a { 36 | color: var(--color-font-1); 37 | font-size: 0.9rem; 38 | display: inline-block; 39 | margin: 0 5px; 40 | } 41 | .message-body > div { 42 | background: var(--color-card-1); 43 | padding: 10px; 44 | border-radius: 7px; 45 | width: fit-content; 46 | } 47 | .message-space { 48 | flex: 1; 49 | } 50 | 51 | .message-mine { 52 | background: var(--color-main) !important; 53 | color: var(--color-font-r) !important; 54 | } 55 | .message-mine a { 56 | color: var(--color-font-r) !important; 57 | } 58 | .message-mine a:link { 59 | opacity: 0.8; 60 | } 61 | 62 | .message-mine a:link:before { 63 | text-align: center; 64 | content: '🔗'; 65 | color: transparent; 66 | text-shadow: 0 0 0 var(--color-font-1-r); 67 | } 68 | .message-mine svg { 69 | fill: var(--color-font-r) !important; 70 | } 71 | 72 | .msg-img { 73 | border-radius: 7px; 74 | max-height: 35vh; 75 | cursor: pointer; 76 | display: block; 77 | max-width: 100%; 78 | } 79 | 80 | .msg-face { 81 | width: 1.5rem; 82 | height: 1.5rem; 83 | margin: -5px 2px 0 2px; 84 | image-rendering: pixelated; 85 | } 86 | 87 | .msg-unknow { 88 | color: var(--color-font-2) !important; 89 | font-style: italic; 90 | } 91 | 92 | .msg-at { 93 | color: var(--color-main) !important; 94 | cursor: pointer; 95 | } 96 | 97 | .msg-replay { 98 | padding: 10px; 99 | border-radius: 7px; 100 | font-size: 0.9rem; 101 | background: #00000017; 102 | cursor: pointer; 103 | margin-bottom: 10px; 104 | display: flex; 105 | flex-direction: row; 106 | height: calc(1rem + 20px); 107 | overflow: hidden; 108 | } 109 | .msg-replay span { 110 | flex: 1; 111 | line-height: 1rem; 112 | overflow: hidden; 113 | margin-top: -2px; 114 | } 115 | 116 | .note-base { 117 | text-align: center; 118 | margin: 40px 0 10px 0; 119 | } 120 | 121 | .note-time { 122 | width: 100%; 123 | background: var(--color-card-1); 124 | padding: 5px 20px; 125 | border-radius: 100vh; 126 | font-size: 0.8rem; 127 | color: var(--color-font-2) !important; 128 | } 129 | 130 | .msg-xml { 131 | padding: 5px 15px; 132 | } 133 | .msg-xml p { 134 | margin-bottom: 2px; 135 | } 136 | .msg-xml hr { 137 | display: none; 138 | } 139 | .msg-xml-summary { 140 | display: block; 141 | font-size: 0.9rem; 142 | background: #00000017; 143 | margin: 0 -25px -15px -25px; 144 | padding: 5px 5px 5px 10px; 145 | border-radius: 0 0 7px 7px; 146 | } 147 | .msg-xml-img { 148 | width: 3rem; 149 | float: right; 150 | margin-left: 15px; 151 | } 152 | 153 | .msg-record { 154 | display: flex; 155 | margin: 0 5px; 156 | } 157 | .msg-record > i { 158 | display: inline-block; 159 | font-size: 2rem; 160 | } 161 | .msg-record > div { 162 | margin-left: 10px; 163 | } 164 | .msg-record > div a { 165 | line-height: 2rem; 166 | } 167 | 168 | .msg-video { 169 | margin: -10px; 170 | border-radius: 7px; 171 | overflow: hidden; 172 | } 173 | .msg-video video { 174 | width: 100%; 175 | max-height: 50vh; 176 | margin-bottom: -7px; 177 | } 178 | 179 | .msg-file { 180 | display: flex; 181 | flex-direction: row; 182 | align-items: center; 183 | } 184 | .msg-file > svg { 185 | fill: var(--color-font-1); 186 | height: calc(2rem + 10px); 187 | margin-right: 20px; 188 | margin-left: 10px; 189 | } 190 | .msg-file svg { 191 | fill: var(--color-font-1); 192 | } 193 | .msg-file > div:nth-child(2) { 194 | display: flex; 195 | flex-direction: column; 196 | flex: 1; 197 | } 198 | .msg-file > div:nth-child(2) i { 199 | font-size: 0.9rem; 200 | font-style: normal; 201 | overflow-wrap: anywhere; 202 | } 203 | .msg-file > div:nth-child(2) a { 204 | font-size: 0.8rem; 205 | } 206 | .msg-file > div:nth-child(2) p { 207 | display: inline-block; 208 | font-size: 1rem; 209 | margin-bottom: 0; 210 | } 211 | .msg-file > div:nth-child(3) { 212 | width: 50px; 213 | height: 50px; 214 | background: #0000002e; 215 | border-radius: 100%; 216 | padding: 15px; 217 | margin-left: 20px; 218 | cursor: pointer; 219 | } 220 | .msg-file > div:nth-child(3) svg { 221 | width: 20px; 222 | height: 20px; 223 | margin-top: -7px; 224 | } 225 | 226 | .msg-link-view { 227 | display: flex; 228 | flex-direction: row; 229 | background: #00000017; 230 | border-radius: 7px; 231 | margin-top: 7px; 232 | padding: 10px; 233 | } 234 | .msg-link-view div:nth-child(1) { 235 | width: 5px; 236 | min-width: 5px; 237 | background: #00000030; 238 | border-radius: 5px; 239 | margin-right: 7px; 240 | } 241 | .msg-link-view img { 242 | max-width: 50%; 243 | min-height: 5rem; 244 | max-height: 7rem; 245 | border-radius: 7px; 246 | margin-right: 7px; 247 | cursor: pointer; 248 | } 249 | .msg-link-view div:nth-child(3) { 250 | display: flex; 251 | flex-direction: column; 252 | max-height: 7rem; 253 | overflow: hidden; 254 | } 255 | .msg-link-view div:nth-child(3) p { 256 | font-weight: bold; 257 | margin-bottom: 0; 258 | } 259 | .msg-link-view div:nth-child(3) span { 260 | font-size: 0.9rem; 261 | } 262 | .msg-link-view div:nth-child(3) span:nth-child(3) { 263 | font-size: 0.8rem; 264 | opacity: 0.7; 265 | } 266 | 267 | .msg-json { 268 | cursor: pointer; 269 | } 270 | .msg-json > p { 271 | font-weight: bold; 272 | margin-bottom: 0; 273 | } 274 | .msg-json > span { 275 | opacity: 0.7; 276 | font-size: 0.9rem; 277 | } 278 | .msg-json > img { 279 | max-width: 100%; 280 | height: 25vh; 281 | border-radius: 7px; 282 | margin-top: 7px; 283 | display: block; 284 | margin-left: 50%; 285 | transform: translate(-50%); 286 | } 287 | .msg-json>div:nth-child(4) { 288 | display: flex; 289 | flex-direction: row; 290 | align-items: center; 291 | background: #00000017; 292 | margin: 10px -10px -10px -10px; 293 | border-radius: 0 0 7px 7px; 294 | padding: 5px; 295 | } 296 | .msg-json>div:nth-child(4) > img { 297 | height: 1.1rem; 298 | border-radius: 5px; 299 | margin-left: 7px; 300 | } 301 | .msg-json>div:nth-child(4) > span { 302 | font-size: 0.9rem; 303 | opacity: 0.7; 304 | margin-left: 7px; 305 | } 306 | 307 | @media (max-width: 992px) { 308 | .message-body { 309 | max-width: 100%; 310 | } 311 | } 312 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-cacheable-response.prod.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"workbox-cacheable-response.prod.js","sources":["../_version.js","../CacheableResponse.js","../CacheableResponsePlugin.js"],"sourcesContent":["\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:cacheable-response:6.5.2'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport './_version.js';\n/**\n * This class allows you to set up rules determining what\n * status codes and/or headers need to be present in order for a\n * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)\n * to be considered cacheable.\n *\n * @memberof workbox-cacheable-response\n */\nclass CacheableResponse {\n /**\n * To construct a new CacheableResponse instance you must provide at least\n * one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (!(config.statuses || config.headers)) {\n throw new WorkboxError('statuses-or-headers-required', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n });\n }\n if (config.statuses) {\n assert.isArray(config.statuses, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.statuses',\n });\n }\n if (config.headers) {\n assert.isType(config.headers, 'object', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.headers',\n });\n }\n }\n this._statuses = config.statuses;\n this._headers = config.headers;\n }\n /**\n * Checks a response to see whether it's cacheable or not, based on this\n * object's configuration.\n *\n * @param {Response} response The response whose cacheability is being\n * checked.\n * @return {boolean} `true` if the `Response` is cacheable, and `false`\n * otherwise.\n */\n isResponseCacheable(response) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(response, Response, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'isResponseCacheable',\n paramName: 'response',\n });\n }\n let cacheable = true;\n if (this._statuses) {\n cacheable = this._statuses.includes(response.status);\n }\n if (this._headers && cacheable) {\n cacheable = Object.keys(this._headers).some((headerName) => {\n return response.headers.get(headerName) === this._headers[headerName];\n });\n }\n if (process.env.NODE_ENV !== 'production') {\n if (!cacheable) {\n logger.groupCollapsed(`The request for ` +\n `'${getFriendlyURL(response.url)}' returned a response that does ` +\n `not meet the criteria for being cached.`);\n logger.groupCollapsed(`View cacheability criteria here.`);\n logger.log(`Cacheable statuses: ` + JSON.stringify(this._statuses));\n logger.log(`Cacheable headers: ` + JSON.stringify(this._headers, null, 2));\n logger.groupEnd();\n const logFriendlyHeaders = {};\n response.headers.forEach((value, key) => {\n logFriendlyHeaders[key] = value;\n });\n logger.groupCollapsed(`View response status and headers here.`);\n logger.log(`Response status: ${response.status}`);\n logger.log(`Response headers: ` + JSON.stringify(logFriendlyHeaders, null, 2));\n logger.groupEnd();\n logger.groupCollapsed(`View full response details here.`);\n logger.log(response.headers);\n logger.log(response);\n logger.groupEnd();\n logger.groupEnd();\n }\n }\n return cacheable;\n }\n}\nexport { CacheableResponse };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { CacheableResponse, } from './CacheableResponse.js';\nimport './_version.js';\n/**\n * A class implementing the `cacheWillUpdate` lifecycle callback. This makes it\n * easier to add in cacheability checks to requests made via Workbox's built-in\n * strategies.\n *\n * @memberof workbox-cacheable-response\n */\nclass CacheableResponsePlugin {\n /**\n * To construct a new CacheableResponsePlugin instance you must provide at\n * least one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config) {\n /**\n * @param {Object} options\n * @param {Response} options.response\n * @return {Response|null}\n * @private\n */\n this.cacheWillUpdate = async ({ response }) => {\n if (this._cacheableResponse.isResponseCacheable(response)) {\n return response;\n }\n return null;\n };\n this._cacheableResponse = new CacheableResponse(config);\n }\n}\nexport { CacheableResponsePlugin };\n"],"names":["self","_","e","CacheableResponse","constructor","config","_statuses","statuses","_headers","headers","isResponseCacheable","response","cacheable","this","includes","status","Object","keys","some","headerName","get","cacheWillUpdate","async","_cacheableResponse"],"mappings":"sFAEA,IACIA,KAAK,qCAAuCC,IAEhD,MAAOC,ICeP,MAAMC,EAeFC,YAAYC,EAAS,SA0BZC,EAAYD,EAAOE,cACnBC,EAAWH,EAAOI,QAW3BC,oBAAoBC,OASZC,GAAY,SACZC,KAAKP,IACLM,EAAYC,KAAKP,EAAUQ,SAASH,EAASI,SAE7CF,KAAKL,GAAYI,IACjBA,EAAYI,OAAOC,KAAKJ,KAAKL,GAAUU,MAAMC,GAClCR,EAASF,QAAQW,IAAID,KAAgBN,KAAKL,EAASW,MA2B3DP,0DCnGf,MAeIR,YAAYC,QAOHgB,gBAAkBC,OAASX,SAAAA,KACxBE,KAAKU,EAAmBb,oBAAoBC,GACrCA,EAEJ,UAENY,EAAqB,IAAIpB,EAAkBE"} -------------------------------------------------------------------------------- /src/js/workbox/workbox-cacheable-response.dev.js: -------------------------------------------------------------------------------- 1 | this.workbox = this.workbox || {}; 2 | this.workbox.cacheableResponse = (function (exports, assert_js, WorkboxError_js, getFriendlyURL_js, logger_js) { 3 | 'use strict'; 4 | 5 | try { 6 | self['workbox:cacheable-response:6.5.2'] && _(); 7 | } catch (e) {} 8 | 9 | /* 10 | Copyright 2018 Google LLC 11 | 12 | Use of this source code is governed by an MIT-style 13 | license that can be found in the LICENSE file or at 14 | https://opensource.org/licenses/MIT. 15 | */ 16 | /** 17 | * This class allows you to set up rules determining what 18 | * status codes and/or headers need to be present in order for a 19 | * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) 20 | * to be considered cacheable. 21 | * 22 | * @memberof workbox-cacheable-response 23 | */ 24 | 25 | class CacheableResponse { 26 | /** 27 | * To construct a new CacheableResponse instance you must provide at least 28 | * one of the `config` properties. 29 | * 30 | * If both `statuses` and `headers` are specified, then both conditions must 31 | * be met for the `Response` to be considered cacheable. 32 | * 33 | * @param {Object} config 34 | * @param {Array} [config.statuses] One or more status codes that a 35 | * `Response` can have and be considered cacheable. 36 | * @param {Object} [config.headers] A mapping of header names 37 | * and expected values that a `Response` can have and be considered cacheable. 38 | * If multiple headers are provided, only one needs to be present. 39 | */ 40 | constructor(config = {}) { 41 | { 42 | if (!(config.statuses || config.headers)) { 43 | throw new WorkboxError_js.WorkboxError('statuses-or-headers-required', { 44 | moduleName: 'workbox-cacheable-response', 45 | className: 'CacheableResponse', 46 | funcName: 'constructor' 47 | }); 48 | } 49 | 50 | if (config.statuses) { 51 | assert_js.assert.isArray(config.statuses, { 52 | moduleName: 'workbox-cacheable-response', 53 | className: 'CacheableResponse', 54 | funcName: 'constructor', 55 | paramName: 'config.statuses' 56 | }); 57 | } 58 | 59 | if (config.headers) { 60 | assert_js.assert.isType(config.headers, 'object', { 61 | moduleName: 'workbox-cacheable-response', 62 | className: 'CacheableResponse', 63 | funcName: 'constructor', 64 | paramName: 'config.headers' 65 | }); 66 | } 67 | } 68 | 69 | this._statuses = config.statuses; 70 | this._headers = config.headers; 71 | } 72 | /** 73 | * Checks a response to see whether it's cacheable or not, based on this 74 | * object's configuration. 75 | * 76 | * @param {Response} response The response whose cacheability is being 77 | * checked. 78 | * @return {boolean} `true` if the `Response` is cacheable, and `false` 79 | * otherwise. 80 | */ 81 | 82 | 83 | isResponseCacheable(response) { 84 | { 85 | assert_js.assert.isInstance(response, Response, { 86 | moduleName: 'workbox-cacheable-response', 87 | className: 'CacheableResponse', 88 | funcName: 'isResponseCacheable', 89 | paramName: 'response' 90 | }); 91 | } 92 | 93 | let cacheable = true; 94 | 95 | if (this._statuses) { 96 | cacheable = this._statuses.includes(response.status); 97 | } 98 | 99 | if (this._headers && cacheable) { 100 | cacheable = Object.keys(this._headers).some(headerName => { 101 | return response.headers.get(headerName) === this._headers[headerName]; 102 | }); 103 | } 104 | 105 | { 106 | if (!cacheable) { 107 | logger_js.logger.groupCollapsed(`The request for ` + `'${getFriendlyURL_js.getFriendlyURL(response.url)}' returned a response that does ` + `not meet the criteria for being cached.`); 108 | logger_js.logger.groupCollapsed(`View cacheability criteria here.`); 109 | logger_js.logger.log(`Cacheable statuses: ` + JSON.stringify(this._statuses)); 110 | logger_js.logger.log(`Cacheable headers: ` + JSON.stringify(this._headers, null, 2)); 111 | logger_js.logger.groupEnd(); 112 | const logFriendlyHeaders = {}; 113 | response.headers.forEach((value, key) => { 114 | logFriendlyHeaders[key] = value; 115 | }); 116 | logger_js.logger.groupCollapsed(`View response status and headers here.`); 117 | logger_js.logger.log(`Response status: ${response.status}`); 118 | logger_js.logger.log(`Response headers: ` + JSON.stringify(logFriendlyHeaders, null, 2)); 119 | logger_js.logger.groupEnd(); 120 | logger_js.logger.groupCollapsed(`View full response details here.`); 121 | logger_js.logger.log(response.headers); 122 | logger_js.logger.log(response); 123 | logger_js.logger.groupEnd(); 124 | logger_js.logger.groupEnd(); 125 | } 126 | } 127 | 128 | return cacheable; 129 | } 130 | 131 | } 132 | 133 | /* 134 | Copyright 2018 Google LLC 135 | 136 | Use of this source code is governed by an MIT-style 137 | license that can be found in the LICENSE file or at 138 | https://opensource.org/licenses/MIT. 139 | */ 140 | /** 141 | * A class implementing the `cacheWillUpdate` lifecycle callback. This makes it 142 | * easier to add in cacheability checks to requests made via Workbox's built-in 143 | * strategies. 144 | * 145 | * @memberof workbox-cacheable-response 146 | */ 147 | 148 | class CacheableResponsePlugin { 149 | /** 150 | * To construct a new CacheableResponsePlugin instance you must provide at 151 | * least one of the `config` properties. 152 | * 153 | * If both `statuses` and `headers` are specified, then both conditions must 154 | * be met for the `Response` to be considered cacheable. 155 | * 156 | * @param {Object} config 157 | * @param {Array} [config.statuses] One or more status codes that a 158 | * `Response` can have and be considered cacheable. 159 | * @param {Object} [config.headers] A mapping of header names 160 | * and expected values that a `Response` can have and be considered cacheable. 161 | * If multiple headers are provided, only one needs to be present. 162 | */ 163 | constructor(config) { 164 | /** 165 | * @param {Object} options 166 | * @param {Response} options.response 167 | * @return {Response|null} 168 | * @private 169 | */ 170 | this.cacheWillUpdate = async ({ 171 | response 172 | }) => { 173 | if (this._cacheableResponse.isResponseCacheable(response)) { 174 | return response; 175 | } 176 | 177 | return null; 178 | }; 179 | 180 | this._cacheableResponse = new CacheableResponse(config); 181 | } 182 | 183 | } 184 | 185 | exports.CacheableResponse = CacheableResponse; 186 | exports.CacheableResponsePlugin = CacheableResponsePlugin; 187 | 188 | return exports; 189 | 190 | }({}, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private)); 191 | //# sourceMappingURL=workbox-cacheable-response.dev.js.map 192 | -------------------------------------------------------------------------------- /src/js/workbox/workbox-sw.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"workbox-sw.js","sources":["../_version.mjs","../controllers/WorkboxSW.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:sw:6.5.3']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nconst CDN_PATH = `WORKBOX_CDN_ROOT_URL`;\n\nconst MODULE_KEY_TO_NAME_MAPPING = {\n /**\n * @name backgroundSync\n * @memberof workbox\n * @see module:workbox-background-sync\n */\n backgroundSync: 'background-sync',\n /**\n * @name broadcastUpdate\n * @memberof workbox\n * @see module:workbox-broadcast-update\n */\n broadcastUpdate: 'broadcast-update',\n /**\n * @name cacheableResponse\n * @memberof workbox\n * @see module:workbox-cacheable-response\n */\n cacheableResponse: 'cacheable-response',\n /**\n * @name core\n * @memberof workbox\n * @see module:workbox-core\n */\n core: 'core',\n /**\n * @name expiration\n * @memberof workbox\n * @see module:workbox-expiration\n */\n expiration: 'expiration',\n /**\n * @name googleAnalytics\n * @memberof workbox\n * @see module:workbox-google-analytics\n */\n googleAnalytics: 'offline-ga',\n /**\n * @name navigationPreload\n * @memberof workbox\n * @see module:workbox-navigation-preload\n */\n navigationPreload: 'navigation-preload',\n /**\n * @name precaching\n * @memberof workbox\n * @see module:workbox-precaching\n */\n precaching: 'precaching',\n /**\n * @name rangeRequests\n * @memberof workbox\n * @see module:workbox-range-requests\n */\n rangeRequests: 'range-requests',\n /**\n * @name routing\n * @memberof workbox\n * @see module:workbox-routing\n */\n routing: 'routing',\n /**\n * @name strategies\n * @memberof workbox\n * @see module:workbox-strategies\n */\n strategies: 'strategies',\n /**\n * @name streams\n * @memberof workbox\n * @see module:workbox-streams\n */\n streams: 'streams',\n /**\n * @name recipes\n * @memberof workbox\n * @see module:workbox-recipes\n */\n recipes: 'recipes',\n};\n\n/**\n * This class can be used to make it easy to use the various parts of\n * Workbox.\n *\n * @private\n */\nexport class WorkboxSW {\n /**\n * Creates a proxy that automatically loads workbox namespaces on demand.\n *\n * @private\n */\n constructor() {\n this.v = {};\n this._options = {\n debug: self.location.hostname === 'localhost',\n modulePathPrefix: null,\n modulePathCb: null,\n };\n\n this._env = this._options.debug ? 'dev' : 'prod';\n this._modulesLoaded = false;\n\n return new Proxy(this, {\n get(target, key) {\n if (target[key]) {\n return target[key];\n }\n\n const moduleName = MODULE_KEY_TO_NAME_MAPPING[key];\n if (moduleName) {\n target.loadModule(`workbox-${moduleName}`);\n }\n\n return target[key];\n },\n });\n }\n\n /**\n * Updates the configuration options. You can specify whether to treat as a\n * debug build and whether to use a CDN or a specific path when importing\n * other workbox-modules\n *\n * @param {Object} [options]\n * @param {boolean} [options.debug] If true, `dev` builds are using, otherwise\n * `prod` builds are used. By default, `prod` is used unless on localhost.\n * @param {Function} [options.modulePathPrefix] To avoid using the CDN with\n * `workbox-sw` set the path prefix of where modules should be loaded from.\n * For example `modulePathPrefix: '/third_party/workbox/v3.0.0/'`.\n * @param {workbox~ModulePathCallback} [options.modulePathCb] If defined,\n * this callback will be responsible for determining the path of each\n * workbox module.\n *\n * @alias workbox.setConfig\n */\n setConfig(options = {}) {\n if (!this._modulesLoaded) {\n Object.assign(this._options, options);\n this._env = this._options.debug ? 'dev' : 'prod';\n } else {\n throw new Error('Config must be set before accessing workbox.* modules');\n }\n }\n\n /**\n * Load a Workbox module by passing in the appropriate module name.\n *\n * This is not generally needed unless you know there are modules that are\n * dynamically used and you want to safe guard use of the module while the\n * user may be offline.\n *\n * @param {string} moduleName\n *\n * @alias workbox.loadModule\n */\n loadModule(moduleName) {\n const modulePath = this._getImportPath(moduleName);\n try {\n importScripts(modulePath);\n this._modulesLoaded = true;\n } catch (err) {\n // TODO Add context of this error if using the CDN vs the local file.\n\n // We can't rely on workbox-core being loaded so using console\n // eslint-disable-next-line\n console.error(\n `Unable to import module '${moduleName}' from '${modulePath}'.`);\n throw err;\n }\n }\n\n /**\n * This method will get the path / CDN URL to be used for importScript calls.\n *\n * @param {string} moduleName\n * @return {string} URL to the desired module.\n *\n * @private\n */\n _getImportPath(moduleName) {\n if (this._options.modulePathCb) {\n return this._options.modulePathCb(moduleName, this._options.debug);\n }\n\n // TODO: This needs to be dynamic some how.\n let pathParts = [CDN_PATH];\n\n const fileName = `${moduleName}.${this._env}.js`;\n\n const pathPrefix = this._options.modulePathPrefix;\n if (pathPrefix) {\n // Split to avoid issues with developers ending / not ending with slash\n pathParts = pathPrefix.split('/');\n\n // We don't need a slash at the end as we will be adding\n // a filename regardless\n if (pathParts[pathParts.length - 1] === '') {\n pathParts.splice(pathParts.length - 1, 1);\n }\n }\n\n pathParts.push(fileName);\n\n return pathParts.join('/');\n }\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxSW} from './controllers/WorkboxSW.mjs';\nimport './_version.mjs';\n\n/**\n * @namespace workbox\n */\n\n// Don't export anything, just expose a global.\nself.workbox = new WorkboxSW();\n"],"names":["self","_","e","MODULE_KEY_TO_NAME_MAPPING","backgroundSync","broadcastUpdate","cacheableResponse","core","expiration","googleAnalytics","navigationPreload","precaching","rangeRequests","routing","strategies","streams","recipes","workbox","constructor","v","_options","debug","location","hostname","modulePathPrefix","modulePathCb","_env","this","_modulesLoaded","Proxy","get","target","key","moduleName","loadModule","setConfig","options","Error","Object","assign","modulePath","_getImportPath","importScripts","err","console","error","pathParts","fileName","pathPrefix","split","length","splice","push","join"],"mappings":"yBAAA,IAAIA,KAAK,qBAAqBC,IAAI,MAAMC,ICUxC,MAEMC,EAA6B,CAMjCC,eAAgB,kBAMhBC,gBAAiB,mBAMjBC,kBAAmB,qBAMnBC,KAAM,OAMNC,WAAY,aAMZC,gBAAiB,aAMjBC,kBAAmB,qBAMnBC,WAAY,aAMZC,cAAe,iBAMfC,QAAS,UAMTC,WAAY,aAMZC,QAAS,UAMTC,QAAS,WC1EXhB,KAAKiB,QAAU,IDmFR,MAMLC,0BACOC,EAAI,QACJC,GAAW,CACdC,MAAkC,cAA3BrB,KAAKsB,SAASC,SACrBC,iBAAkB,KAClBC,aAAc,WAGXC,GAAOC,KAAKP,GAASC,MAAQ,MAAQ,YACrCO,IAAiB,EAEf,IAAIC,MAAMF,KAAM,CACrBG,IAAIC,EAAQC,MACND,EAAOC,UACFD,EAAOC,SAGVC,EAAa9B,EAA2B6B,UAC1CC,GACFF,EAAOG,WAAY,WAAUD,GAGxBF,EAAOC,MAsBpBG,UAAUC,EAAU,OACbT,KAAKC,SAIF,IAAIS,MAAM,yDAHhBC,OAAOC,OAAOZ,KAAKP,GAAUgB,QACxBV,GAAOC,KAAKP,GAASC,MAAQ,MAAQ,OAiB9Ca,WAAWD,SACHO,EAAab,KAAKc,GAAeR,OAErCS,cAAcF,QACTZ,IAAiB,EACtB,MAAOe,SAKPC,QAAQC,MACH,4BAA2BZ,YAAqBO,OAC/CG,GAYVF,GAAeR,MACTN,KAAKP,GAASK,oBACTE,KAAKP,GAASK,aAAaQ,EAAYN,KAAKP,GAASC,WAI1DyB,EAAY,CA7LF,mEA+LRC,EAAY,GAAEd,KAAcN,KAAKD,QAEjCsB,EAAarB,KAAKP,GAASI,wBAC7BwB,IAEFF,EAAYE,EAAWC,MAAM,KAIW,KAApCH,EAAUA,EAAUI,OAAS,IAC/BJ,EAAUK,OAAOL,EAAUI,OAAS,EAAG,IAI3CJ,EAAUM,KAAKL,GAERD,EAAUO,KAAK"} -------------------------------------------------------------------------------- /src/js/workbox/workbox-background-sync.prod.js: -------------------------------------------------------------------------------- 1 | this.workbox=this.workbox||{},this.workbox.backgroundSync=function(t,e,s,n){"use strict";function r(){return(r=Object.assign||function(t){for(var e=1;e(t[e]=s,!0),has:(t,e)=>t instanceof IDBTransaction&&("done"===e||"store"===e)||e in t};function f(t){return t!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(i||(i=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(t)?function(...e){return t.apply(m(this),e),d(c.get(this))}:function(...e){return d(t.apply(m(this),e))}:function(e,...s){const n=t.call(m(this),e,...s);return u.set(n,e.sort?e.sort():[e]),d(n)}}function l(t){return"function"==typeof t?f(t):(t instanceof IDBTransaction&&function(t){if(o.has(t))return;const e=new Promise(((e,s)=>{const n=()=>{t.removeEventListener("complete",r),t.removeEventListener("error",a),t.removeEventListener("abort",a)},r=()=>{e(),n()},a=()=>{s(t.error||new DOMException("AbortError","AbortError")),n()};t.addEventListener("complete",r),t.addEventListener("error",a),t.addEventListener("abort",a)}));o.set(t,e)}(t),e=t,(a||(a=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])).some((t=>e instanceof t))?new Proxy(t,w):t);var e}function d(t){if(t instanceof IDBRequest)return function(t){const e=new Promise(((e,s)=>{const n=()=>{t.removeEventListener("success",r),t.removeEventListener("error",a)},r=()=>{e(d(t.result)),n()},a=()=>{s(t.error),n()};t.addEventListener("success",r),t.addEventListener("error",a)}));return e.then((e=>{e instanceof IDBCursor&&c.set(e,t)})).catch((()=>{})),y.set(e,t),e}(t);if(h.has(t))return h.get(t);const e=l(t);return e!==t&&(h.set(t,e),y.set(e,t)),e}const m=t=>y.get(t);const p=["get","getKey","getAll","getAllKeys","count"],g=["put","add","delete","clear"],D=new Map;function b(t,e){if(!(t instanceof IDBDatabase)||e in t||"string"!=typeof e)return;if(D.get(e))return D.get(e);const s=e.replace(/FromIndex$/,""),n=e!==s,r=g.includes(s);if(!(s in(n?IDBIndex:IDBObjectStore).prototype)||!r&&!p.includes(s))return;const a=async function(t,...e){const a=this.transaction(t,r?"readwrite":"readonly");let i=a.store;return n&&(i=i.index(e.shift())),(await Promise.all([i[s](...e),r&&a.done]))[0]};return D.set(e,a),a}w=(t=>r({},t,{get:(e,s,n)=>b(e,s)||t.get(e,s,n),has:(e,s)=>!!b(e,s)||t.has(e,s)}))(w);try{self["workbox:background-sync:6.5.2"]&&_()}catch(t){}const B="requests",I="queueName";class q{constructor(){this.t=null}async addEntry(t){const e=(await this.getDb()).transaction(B,"readwrite",{durability:"relaxed"});await e.store.add(t),await e.done}async getFirstEntryId(){const t=await this.getDb(),e=await t.transaction(B).store.openCursor();return null==e?void 0:e.value.id}async getAllEntriesByQueueName(t){const e=await this.getDb(),s=await e.getAllFromIndex(B,I,IDBKeyRange.only(t));return s||new Array}async getEntryCountByQueueName(t){return(await this.getDb()).countFromIndex(B,I,IDBKeyRange.only(t))}async deleteEntry(t){const e=await this.getDb();await e.delete(B,t)}async getFirstEntryByQueueName(t){return await this.getEndEntryFromIndex(IDBKeyRange.only(t),"next")}async getLastEntryByQueueName(t){return await this.getEndEntryFromIndex(IDBKeyRange.only(t),"prev")}async getEndEntryFromIndex(t,e){const s=await this.getDb(),n=await s.transaction(B).store.index(I).openCursor(t,e);return null==n?void 0:n.value}async getDb(){return this.t||(this.t=await function(t,e,{blocked:s,upgrade:n,blocking:r,terminated:a}={}){const i=indexedDB.open(t,e),c=d(i);return n&&i.addEventListener("upgradeneeded",(t=>{n(d(i.result),t.oldVersion,t.newVersion,d(i.transaction))})),s&&i.addEventListener("blocked",(()=>s())),c.then((t=>{a&&t.addEventListener("close",(()=>a())),r&&t.addEventListener("versionchange",(()=>r()))})).catch((()=>{})),c}("workbox-background-sync",3,{upgrade:this.i})),this.t}i(t,e){e>0&&e<3&&t.objectStoreNames.contains(B)&&t.deleteObjectStore(B);t.createObjectStore(B,{autoIncrement:!0,keyPath:"id"}).createIndex(I,I,{unique:!1})}}class k{constructor(t){this.o=t,this.u=new q}async pushEntry(t){delete t.id,t.queueName=this.o,await this.u.addEntry(t)}async unshiftEntry(t){const e=await this.u.getFirstEntryId();e?t.id=e-1:delete t.id,t.queueName=this.o,await this.u.addEntry(t)}async popEntry(){return this.h(await this.u.getLastEntryByQueueName(this.o))}async shiftEntry(){return this.h(await this.u.getFirstEntryByQueueName(this.o))}async getAll(){return await this.u.getAllEntriesByQueueName(this.o)}async size(){return await this.u.getEntryCountByQueueName(this.o)}async deleteEntry(t){await this.u.deleteEntry(t)}async h(t){return t&&await this.deleteEntry(t.id),t}}const E=["method","referrer","referrerPolicy","mode","credentials","cache","redirect","integrity","keepalive"];class R{constructor(t){"navigate"===t.mode&&(t.mode="same-origin"),this.l=t}static async fromRequest(t){const e={url:t.url,headers:{}};"GET"!==t.method&&(e.body=await t.clone().arrayBuffer());for(const[s,n]of t.headers.entries())e.headers[s]=n;for(const s of E)void 0!==t[s]&&(e[s]=t[s]);return new R(e)}toObject(){const t=Object.assign({},this.l);return t.headers=Object.assign({},this.l.headers),t.body&&(t.body=t.body.slice(0)),t}toRequest(){return new Request(this.l.url,this.l)}clone(){return new R(this.toObject())}}const x="workbox-background-sync",v=new Set,j=t=>{const e={request:new R(t.requestData).toRequest(),timestamp:t.timestamp};return t.metadata&&(e.metadata=t.metadata),e};class S{constructor(t,{forceSyncFallback:s,onSync:n,maxRetentionTime:r}={}){if(this.m=!1,this.p=!1,v.has(t))throw new e.WorkboxError("duplicate-queue-name",{name:t});v.add(t),this.g=t,this.D=n||this.replayRequests,this.B=r||10080,this.I=Boolean(s),this.q=new k(this.g),this.k()}get name(){return this.g}async pushRequest(t){await this.R(t,"push")}async unshiftRequest(t){await this.R(t,"unshift")}async popRequest(){return this.v("pop")}async shiftRequest(){return this.v("shift")}async getAll(){const t=await this.q.getAll(),e=Date.now(),s=[];for(const n of t){const t=60*this.B*1e3;e-n.timestamp>t?await this.q.deleteEntry(n.id):s.push(j(n))}return s}async size(){return await this.q.size()}async R({request:t,metadata:e,timestamp:s=Date.now()},n){const r={requestData:(await R.fromRequest(t.clone())).toObject(),timestamp:s};switch(e&&(r.metadata=e),n){case"push":await this.q.pushEntry(r);break;case"unshift":await this.q.unshiftEntry(r)}this.m?this.p=!0:await this.registerSync()}async v(t){const e=Date.now();let s;switch(t){case"pop":s=await this.q.popEntry();break;case"shift":s=await this.q.shiftEntry()}if(s){const n=60*this.B*1e3;return e-s.timestamp>n?this.v(t):j(s)}}async replayRequests(){let t;for(;t=await this.shiftRequest();)try{await fetch(t.request.clone())}catch(s){throw await this.unshiftRequest(t),new e.WorkboxError("queue-replay-failed",{name:this.g})}}async registerSync(){if("sync"in self.registration&&!this.I)try{await self.registration.sync.register(`${x}:${this.g}`)}catch(t){}}k(){"sync"in self.registration&&!this.I?self.addEventListener("sync",(t=>{if(t.tag===`${x}:${this.g}`){const e=async()=>{let e;this.m=!0;try{await this.D({queue:this})}catch(t){if(t instanceof Error)throw e=t,e}finally{!this.p||e&&!t.lastChance||await this.registerSync(),this.m=!1,this.p=!1}};t.waitUntil(e())}})):this.D({queue:this})}static get j(){return v}}return t.BackgroundSyncPlugin=class{constructor(t,e){this.fetchDidFail=async({request:t})=>{await this.S.pushRequest({request:t})},this.S=new S(t,e)}},t.Queue=S,t.QueueStore=k,t.StorableRequest=R,t}({},workbox.core._private,workbox.core._private,workbox.core._private); 2 | //# sourceMappingURL=workbox-background-sync.prod.js.map 3 | -------------------------------------------------------------------------------- /src/js/clipboard.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * clipboard.js v2.0.10 3 | * https://clipboardjs.com/ 4 | * 5 | * Licensed MIT © Zeno Rocha 6 | */ 7 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 { 63 | document.getElementById("footer").style.transform = "translate(0)" 64 | }, 100) 65 | // 隐藏账号设置 66 | document.getElementById("opt-account-main").style.display = "none" 67 | document.getElementById("opt-account-tip").style.display = "block" 68 | // 如果是由于协议连接失败 …… 69 | if(window.isFistUse == undefined || window.isFistUse == true || window.tryAll == undefined) { 70 | window.tryAll = true 71 | if(protocol == "ws://") { 72 | runWs("wss://") 73 | } else { 74 | runWs("ws://") 75 | } 76 | } 77 | } 78 | } 79 | 80 | // 将消息发送为浏览器通知 81 | function showNotice(msg) { 82 | if(window.optCookie["opt_no_notice"] == undefined || window.optCookie["opt_no_notice"] == "false") { 83 | try { 84 | // 初始化记录数组 85 | if(window.notices == undefined) { 86 | window.notices = {} 87 | } 88 | // 检查通知权限,注意 “老旧” 浏览器不支持这个功能 89 | if(Notification.permission == "default") { 90 | // 还没有请求过权限 91 | // 请求权限 92 | Notification.requestPermission(function (status) { 93 | if (Notification.permission !== status) { 94 | Notification.permission = status 95 | } 96 | }); 97 | } else if(Notification.permission == "denied") { 98 | // 用户拒绝了权限 99 | return 100 | } else { 101 | // 显示通知,不管之前有没有同意,反正我是发了(大声 102 | let raw = getMsgRawTxt(msg.message) 103 | raw = raw==""?msg.raw_message:raw 104 | if(msg.message_type == "group") { 105 | const msgOut = msg.sender.nickname + ":" + raw 106 | let notification = new Notification(msg.group_name, {"body": msgOut, "tag": msg.group_id + "/" + msg.message_id, "icon": "https://p.qlogo.cn/gh/" + msg.group_id + "/" + msg.group_id + "/0"}) 107 | window.notices[msg.message_id] = notification 108 | notification.onclick = function() { noticeOnClick(event) } 109 | notification.onclose = function() { noticeOnClose(event) } 110 | } else { 111 | let notification = new Notification(msg.sender.nickname, {"body": raw, "tag": msg.user_id + "/" + msg.message_id, "icon": "https://q1.qlogo.cn/g?b=qq&s=0&nk=" + msg.user_id}) 112 | window.notices[msg.message_id] = notification 113 | notification.onclick = function() { noticeOnClick(event) } 114 | notification.onclose = function() { noticeOnClose(event) } 115 | } 116 | } 117 | } 118 | catch (e) { 119 | console.log(e) 120 | } 121 | } 122 | } 123 | 124 | // 加载基础数据 125 | function loadInfo() { 126 | // 加载 Bot 信息 127 | sendWs(createAPI("get_version_info", null, null)) 128 | // 加载用户信息 129 | sendWs(createAPI("get_login_info", null, null)) 130 | if (window.isFistUse == undefined || window.isFistUse == true) { 131 | sendWs(createAPI( 132 | "get_csrf_token", 133 | null, null 134 | )) 135 | // 清空列表 136 | document.getElementById("friend-list-body").innerHTML = "" 137 | // 加载好友列表 138 | sendWs(createAPI( 139 | "get_friend_list", 140 | null, null 141 | )) 142 | // 加载群列表 143 | sendWs(createAPI( 144 | "get_group_list", 145 | null, null 146 | )) 147 | } 148 | } 149 | 150 | // ---------------------------------------- 151 | // 子功能函数 152 | // ---------------------------------------- 153 | 154 | function findBodyInList(name, id) { 155 | const childs = document.getElementById("friend-list-body").children 156 | for(let i=0; i { 50 | return async ({ 51 | queue 52 | }) => { 53 | let entry; 54 | 55 | while (entry = await queue.shiftRequest()) { 56 | const { 57 | request, 58 | timestamp 59 | } = entry; 60 | const url = new URL(request.url); 61 | 62 | try { 63 | // Measurement protocol requests can set their payload parameters in 64 | // either the URL query string (for GET requests) or the POST body. 65 | const params = request.method === 'POST' ? new URLSearchParams(await request.clone().text()) : url.searchParams; // Calculate the qt param, accounting for the fact that an existing 66 | // qt param may be present and should be updated rather than replaced. 67 | 68 | const originalHitTime = timestamp - (Number(params.get('qt')) || 0); 69 | const queueTime = Date.now() - originalHitTime; // Set the qt param prior to applying hitFilter or parameterOverrides. 70 | 71 | params.set('qt', String(queueTime)); // Apply `parameterOverrides`, if set. 72 | 73 | if (config.parameterOverrides) { 74 | for (const param of Object.keys(config.parameterOverrides)) { 75 | const value = config.parameterOverrides[param]; 76 | params.set(param, value); 77 | } 78 | } // Apply `hitFilter`, if set. 79 | 80 | 81 | if (typeof config.hitFilter === 'function') { 82 | config.hitFilter.call(null, params); 83 | } // Retry the fetch. Ignore URL search params from the URL as they're 84 | // now in the post body. 85 | 86 | 87 | await fetch(new Request(url.origin + url.pathname, { 88 | body: params.toString(), 89 | method: 'POST', 90 | mode: 'cors', 91 | credentials: 'omit', 92 | headers: { 93 | 'Content-Type': 'text/plain' 94 | } 95 | })); 96 | 97 | if ("dev" !== 'production') { 98 | logger_js.logger.log(`Request for '${getFriendlyURL_js.getFriendlyURL(url.href)}' ` + `has been replayed`); 99 | } 100 | } catch (err) { 101 | await queue.unshiftRequest(entry); 102 | 103 | { 104 | logger_js.logger.log(`Request for '${getFriendlyURL_js.getFriendlyURL(url.href)}' ` + `failed to replay, putting it back in the queue.`); 105 | } 106 | 107 | throw err; 108 | } 109 | } 110 | 111 | { 112 | logger_js.logger.log(`All Google Analytics request successfully replayed; ` + `the queue is now empty!`); 113 | } 114 | }; 115 | }; 116 | /** 117 | * Creates GET and POST routes to catch failed Measurement Protocol hits. 118 | * 119 | * @param {BackgroundSyncPlugin} bgSyncPlugin 120 | * @return {Array} The created routes. 121 | * 122 | * @private 123 | */ 124 | 125 | 126 | const createCollectRoutes = bgSyncPlugin => { 127 | const match = ({ 128 | url 129 | }) => url.hostname === GOOGLE_ANALYTICS_HOST && COLLECT_PATHS_REGEX.test(url.pathname); 130 | 131 | const handler = new NetworkOnly_js.NetworkOnly({ 132 | plugins: [bgSyncPlugin] 133 | }); 134 | return [new Route_js.Route(match, handler, 'GET'), new Route_js.Route(match, handler, 'POST')]; 135 | }; 136 | /** 137 | * Creates a route with a network first strategy for the analytics.js script. 138 | * 139 | * @param {string} cacheName 140 | * @return {Route} The created route. 141 | * 142 | * @private 143 | */ 144 | 145 | 146 | const createAnalyticsJsRoute = cacheName => { 147 | const match = ({ 148 | url 149 | }) => url.hostname === GOOGLE_ANALYTICS_HOST && url.pathname === ANALYTICS_JS_PATH; 150 | 151 | const handler = new NetworkFirst_js.NetworkFirst({ 152 | cacheName 153 | }); 154 | return new Route_js.Route(match, handler, 'GET'); 155 | }; 156 | /** 157 | * Creates a route with a network first strategy for the gtag.js script. 158 | * 159 | * @param {string} cacheName 160 | * @return {Route} The created route. 161 | * 162 | * @private 163 | */ 164 | 165 | 166 | const createGtagJsRoute = cacheName => { 167 | const match = ({ 168 | url 169 | }) => url.hostname === GTM_HOST && url.pathname === GTAG_JS_PATH; 170 | 171 | const handler = new NetworkFirst_js.NetworkFirst({ 172 | cacheName 173 | }); 174 | return new Route_js.Route(match, handler, 'GET'); 175 | }; 176 | /** 177 | * Creates a route with a network first strategy for the gtm.js script. 178 | * 179 | * @param {string} cacheName 180 | * @return {Route} The created route. 181 | * 182 | * @private 183 | */ 184 | 185 | 186 | const createGtmJsRoute = cacheName => { 187 | const match = ({ 188 | url 189 | }) => url.hostname === GTM_HOST && url.pathname === GTM_JS_PATH; 190 | 191 | const handler = new NetworkFirst_js.NetworkFirst({ 192 | cacheName 193 | }); 194 | return new Route_js.Route(match, handler, 'GET'); 195 | }; 196 | /** 197 | * @param {Object=} [options] 198 | * @param {Object} [options.cacheName] The cache name to store and retrieve 199 | * analytics.js. Defaults to the cache names provided by `workbox-core`. 200 | * @param {Object} [options.parameterOverrides] 201 | * [Measurement Protocol parameters](https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters), 202 | * expressed as key/value pairs, to be added to replayed Google Analytics 203 | * requests. This can be used to, e.g., set a custom dimension indicating 204 | * that the request was replayed. 205 | * @param {Function} [options.hitFilter] A function that allows you to modify 206 | * the hit parameters prior to replaying 207 | * the hit. The function is invoked with the original hit's URLSearchParams 208 | * object as its only argument. 209 | * 210 | * @memberof workbox-google-analytics 211 | */ 212 | 213 | 214 | const initialize = (options = {}) => { 215 | const cacheName = cacheNames_js.cacheNames.getGoogleAnalyticsName(options.cacheName); 216 | const bgSyncPlugin = new BackgroundSyncPlugin_js.BackgroundSyncPlugin(QUEUE_NAME, { 217 | maxRetentionTime: MAX_RETENTION_TIME, 218 | onSync: createOnSyncCallback(options) 219 | }); 220 | const routes = [createGtmJsRoute(cacheName), createAnalyticsJsRoute(cacheName), createGtagJsRoute(cacheName), ...createCollectRoutes(bgSyncPlugin)]; 221 | const router = new Router_js.Router(); 222 | 223 | for (const route of routes) { 224 | router.registerRoute(route); 225 | } 226 | 227 | router.addFetchListener(); 228 | }; 229 | 230 | exports.initialize = initialize; 231 | 232 | return exports; 233 | 234 | }({}, workbox.backgroundSync, workbox.core._private, workbox.core._private, workbox.core._private, workbox.routing, workbox.routing, workbox.strategies, workbox.strategies)); 235 | //# sourceMappingURL=workbox-offline-ga.dev.js.map 236 | --------------------------------------------------------------------------------