├── .editorconfig ├── .github ├── CODEOWNERS ├── dependabot.yml ├── labels.yml └── workflows │ ├── build.yml │ ├── labels.yml │ └── released.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── assets └── assets.go ├── build.properties ├── build.xml ├── go.mod ├── go.sum ├── main.go ├── res ├── DiscordPTB.lnk ├── app.ico ├── papp.ico ├── papp.manifest ├── papp.png ├── pinned_update.json ├── run.iss └── setup-mini.bmp └── tools └── tools.go /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs. 2 | # More information at http://editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | charset = utf-8 8 | indent_size = 2 9 | indent_style = space 10 | end_of_line = lf 11 | insert_final_newline = true 12 | trim_trailing_whitespace = true 13 | 14 | [*.md] 15 | trim_trailing_whitespace = false 16 | 17 | [*.go] 18 | indent_style = tab 19 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @crazy-max 2 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "gomod" 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | time: "08:00" 8 | timezone: "Europe/Paris" 9 | labels: 10 | - ":game_die: dependencies" 11 | - ":robot: bot" 12 | - package-ecosystem: "github-actions" 13 | directory: "/" 14 | schedule: 15 | interval: "daily" 16 | time: "08:00" 17 | timezone: "Europe/Paris" 18 | labels: 19 | - ":game_die: dependencies" 20 | - ":robot: bot" 21 | -------------------------------------------------------------------------------- /.github/labels.yml: -------------------------------------------------------------------------------- 1 | ## more info https://github.com/crazy-max/ghaction-github-labeler 2 | - # bot 3 | name: ":robot: bot" 4 | color: "69cde9" 5 | description: "" 6 | - # broken 7 | name: ":zap: broken" 8 | color: "a3090e" 9 | description: "" 10 | - # bug 11 | name: ":bug: bug" 12 | color: "b60205" 13 | description: "" 14 | - # dependencies 15 | name: ":game_die: dependencies" 16 | color: "0366d6" 17 | description: "" 18 | - # documentation 19 | name: ":memo: documentation" 20 | color: "c5def5" 21 | description: "" 22 | - # duplicate 23 | name: ":busts_in_silhouette: duplicate" 24 | color: "cccccc" 25 | description: "" 26 | - # enhancement 27 | name: ":sparkles: enhancement" 28 | color: "0054ca" 29 | description: "" 30 | - # feature request 31 | name: ":bulb: feature request" 32 | color: "0e8a16" 33 | description: "" 34 | - # feedback 35 | name: ":mega: feedback" 36 | color: "03a9f4" 37 | description: "" 38 | - # future maybe 39 | name: ":rocket: future maybe" 40 | color: "fef2c0" 41 | description: "" 42 | - # good first issue 43 | name: ":hatching_chick: good first issue" 44 | color: "7057ff" 45 | description: "" 46 | - # help wanted 47 | name: ":pray: help wanted" 48 | color: "4caf50" 49 | description: "" 50 | - # hold 51 | name: ":hand: hold" 52 | color: "24292f" 53 | description: "" 54 | - # invalid 55 | name: ":no_entry_sign: invalid" 56 | color: "e6e6e6" 57 | description: "" 58 | - # maybe bug 59 | name: ":interrobang: maybe bug" 60 | color: "ff5722" 61 | description: "" 62 | - # needs more info 63 | name: ":thinking: needs more info" 64 | color: "795548" 65 | description: "" 66 | - # question 67 | name: ":question: question" 68 | color: "3f51b5" 69 | description: "" 70 | - # trademark violation 71 | name: ":construction: trademark violation" 72 | color: "cfe524" 73 | description: "" 74 | - # upstream 75 | name: ":eyes: upstream" 76 | color: "fbca04" 77 | description: "" 78 | - # wontfix 79 | name: ":coffin: wontfix" 80 | color: "ffffff" 81 | description: "" 82 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | tags: 7 | - '*' 8 | pull_request: 9 | 10 | jobs: 11 | build: 12 | uses: portapps/.github/.github/workflows/app-build.yml@master 13 | -------------------------------------------------------------------------------- /.github/workflows/labels.yml: -------------------------------------------------------------------------------- 1 | name: labels 2 | 3 | on: 4 | push: 5 | branches: 6 | - 'master' 7 | paths: 8 | - '.github/labels.yml' 9 | - '.github/workflows/labels.yml' 10 | 11 | jobs: 12 | labeler: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - 16 | name: Checkout 17 | uses: actions/checkout@v4 18 | - 19 | name: Run Labeler 20 | uses: crazy-max/ghaction-github-labeler@v5 21 | -------------------------------------------------------------------------------- /.github/workflows/released.yml: -------------------------------------------------------------------------------- 1 | name: released 2 | 3 | on: 4 | release: 5 | types: [published] 6 | 7 | jobs: 8 | virustotal: 9 | uses: portapps/.github/.github/workflows/app-virustotal.yml@master 10 | secrets: 11 | vt_api_key: ${{ secrets.VT_API_KEY }} 12 | vt_monitor_api_key: ${{ secrets.VT_MONITOR_API_KEY }} 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Intellij 2 | /.idea 3 | /*.iml 4 | 5 | # App 6 | /.dev 7 | /bin 8 | /vendor 9 | /*.syso 10 | /*.exe 11 | /versioninfo.json 12 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 1.0.1137-28 (2025/04/06) 4 | 5 | * Discord PTB 1.0.1137 6 | * Portapps 3.16.0 7 | 8 | ## 1.0.1095-27 (2024/08/03) 9 | 10 | * Discord PTB 1.0.1095 (no more 32-bit release) 11 | 12 | ## 1.0.1085-26 (2024/08/03) 13 | 14 | * Discord PTB 1.0.1085 15 | * Portapps 3.11.0 16 | 17 | ## 1.0.1059-25 (2024/03/10) 18 | 19 | * Discord PTB 1.0.1059 20 | * Portapps 3.10.0 21 | 22 | ## 1.0.1051-24 (2023/12/24) 23 | 24 | * Discord PTB 1.0.1051 25 | * Portapps 3.9.0 26 | 27 | ## 1.0.1041-23 (2023/11/03) 28 | 29 | * Discord PTB 1.0.1041 30 | * Portapps 3.8.0 31 | 32 | ## 1.0.1024-22 (2023/02/12) 33 | 34 | * Discord PTB 1.0.1024 35 | * Portapps 3.7.0 36 | 37 | ## 1.0.1020-21 (2022/11/20) 38 | 39 | * Discord PTB 1.0.1020 40 | * Bump github.com/kevinburke/go-bindata from 3.23.0+incompatible to 3.24.0+incompatible 41 | 42 | ## 1.0.1017-20 (2022/08/13) 43 | 44 | * Discord PTB 1.0.1017 45 | 46 | ## 1.0.1015-19 (2022/07/15) 47 | 48 | * Discord PTB 1.0.1015 49 | * Portapps 3.6.0 50 | 51 | ## 1.0.1013-18 (2022/03/06) 52 | 53 | * Discord PTB 1.0.1013 54 | * Portapps 3.4.0 55 | 56 | ## 1.0.1010-17 (2021/10/27) 57 | 58 | * Discord PTB 1.0.1010 59 | 60 | ## 1.0.1008-16 (2021/09/05) 61 | 62 | * Discord PTB 1.0.1008 63 | * Portapps 3.3.1 64 | 65 | ## 0.0.60-15 (2021/04/27) 66 | 67 | * Discord PTB 0.0.60 68 | * Portapps 3.3.0 69 | 70 | ## 0.0.58-14 (2021/03/09) 71 | 72 | * Discord PTB 0.0.58 73 | * Cleanup reg key (portapps/discord-portable#57) 74 | * Portapps 3.3.0 75 | 76 | ## 0.0.56-13 (2020/12/26) 77 | 78 | * Discord PTB 0.0.56 79 | * Cleanup more folders 80 | * Portapps 3.1.0 81 | 82 | ## 0.0.55-12 (2020/09/21) 83 | 84 | * Discord PTB 0.0.55 85 | 86 | ## 0.0.54-11 (2020/09/06) 87 | 88 | * Portapps 2.6.0 89 | 90 | ## 0.0.54-10 (2020/08/11) 91 | 92 | * Discord PTB 0.0.54 93 | 94 | ## 0.0.53-9 (2020/08/03) 95 | 96 | * Discord PTB 0.0.53 97 | * Portapps 2.5.0 98 | 99 | ## 0.0.52-8 (2020/04/09) 100 | 101 | * Discord PTB 0.0.52 102 | 103 | ## 0.0.51-7 (2020/02/27) 104 | 105 | * Discord PTB 0.0.51 106 | 107 | ## 0.0.50-6 (2020/02/11) 108 | 109 | * Discord PTB 0.0.50 110 | 111 | ## 0.0.49-5 (2019/12/15) 112 | 113 | * Portapps 1.31.0 114 | * Add cleanup config 115 | 116 | ## 0.0.49-4 (2019/09/05) 117 | 118 | * Discord PTB 0.0.49 119 | * Portapps 1.26.0 120 | 121 | ## 0.0.48-3 (2019/03/17) 122 | 123 | * Create `data` folder at first launch 124 | * Portapps 1.20.3 125 | 126 | ## 0.0.48-2 (2019/03/09) 127 | 128 | * Discord PTB 0.0.48 129 | * Portapps 1.20.2 130 | 131 | ## 0.0.46-21 (2019/01/18) 132 | 133 | * Discord PTB 0.0.46 134 | 135 | ## 0.0.45-20 (2019/01/10) 136 | 137 | * Discord PTB 0.0.45 138 | 139 | ## 0.0.44-19 (2018/12/21) 140 | 141 | * Discord PTB 0.0.44 142 | 143 | ## 0.0.43-18 (2018/10/24) 144 | 145 | * Fix Windows desktop notifications 146 | * Go 1.11 147 | * Use [go mod](https://golang.org/cmd/go/#hdr-Module_maintenance) instead of `dep` 148 | 149 | ## 0.0.43-17 (2018/05/23) 150 | 151 | * Discord PTB 0.0.43 152 | * Update bootstrap script for multiInstance 153 | 154 | ## 0.0.42-16 (2018/04/20) 155 | 156 | * Discord PTB 0.0.42 157 | 158 | ## 0.0.41-15 (2018/02/11) 159 | 160 | * Move ia32/x64 to win32/win64 for arch def 161 | * Remove nupkg file 162 | 163 | ## 0.0.41-14 (2018/02/11) 164 | 165 | * Disable host updates (Issue portapps/discord-portable#10) 166 | 167 | ## 0.0.41-13 (2018/02/09) 168 | 169 | * Ability to pass custom args to the portable process 170 | 171 | ## 0.0.41-12 (2018/01/13) 172 | 173 | * Rebuild electron.asar to push data directly in `data` subfolder 174 | * No need to override USERPROFILE environment variable anymore 175 | * Allow multiple instances 176 | 177 | > :warning: **UPGRADE NOTES** 178 | > * Move everything in `data\AppData\Roaming\discordptb\*` to `data` folder and remove folder `data\AppData`. 179 | 180 | ## 0.0.41-11 (2018/01/12) 181 | 182 | * Discord PTB 0.0.41 183 | 184 | ## 0.0.39-10 (2017/12/09) 185 | 186 | * Discord PTB 0.0.39 187 | 188 | ## 0.0.38-9 (2017/11/22) 189 | 190 | * Discord PTB 0.0.38 191 | * Move app to a subfolder 192 | * Reduce dependencies to avoid heuristic detection 193 | * Add UPX compression 194 | 195 | > :warning: **UPGRADE NOTES** 196 | > * Delete all files and folders in root folder except `data` folder. 197 | 198 | ## 0.0.37-8 (2017/11/19) 199 | 200 | * Discord PTB 0.0.37 201 | * Move repository to [Portapps](https://github.com/portapps) org 202 | 203 | ## 0.0.36-7 (2017/11/11) 204 | 205 | * Discord PTB 0.0.36 206 | * Workaround for Discord PTB bug (Issue #2) 207 | 208 | ## 0.0.34-6 (2017/10/29) 209 | 210 | * Add info in the README about BetterDiscord 211 | * Switch to [Golang Dep](https://github.com/golang/dep) as dependency manager 212 | * Go 1.9.1 213 | 214 | ## 0.0.34-5 (2017/09/05) 215 | 216 | * New logger 217 | * Override USERPROFILE env var instead of using symlink to APPDATA to store data 218 | * Do not migrate old data folder from APPDATA 219 | * Reduce dependencies and system calls to avoid heuristic detection 220 | 221 | > :warning: **UPGRADE NOTES** 222 | > * Move the content of `data\*` in `data\AppData\Roaming\discordptb\` 223 | > * Remove symlink `%APPDATA%\discordptb` 224 | 225 | ## 0.0.34-3 (2017/08/26) 226 | 227 | * Go 1.9 228 | * Add support guidelines 229 | 230 | ## 0.0.34-2 (2017/08/09) 231 | 232 | * Discord PTB 0.0.34 233 | 234 | ## 0.0.32-1 (2017/07/20) 235 | 236 | * Initial version 237 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017-2025 CrazyMax 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | GitHub release 5 | Total downloads 6 | Build Status 7 | Go Report 8 |
Become a sponsor 9 | Donate Paypal 10 |

11 | 12 | ## Notice of Non-Affiliation and Disclaimer 13 | 14 | Portapps is not affiliated, associated, authorized, endorsed by, or in any way officially connected with Discord™, or any of its subsidiaries or its affiliates. 15 | 16 | The official Discord website can be found at https://discordapp.com. 17 | 18 | The name Discord™ as well as related names, marks, emblems and images are registered trademarks of their respective owners. 19 | 20 | ## About 21 | 22 | Discord™ PTB (Public Test Build) portable app made with 🚀 [Portapps](https://portapps.io).
23 | Documentation and downloads can be found on https://portapps.io/app/discord-ptb-portable/ 24 | 25 | ## Contributing 26 | 27 | Want to contribute? Awesome! The most basic way to show your support is to star the project, or to raise issues. If 28 | you want to open a pull request, please read the [contributing guidelines](https://portapps.io/doc/contribute/). 29 | 30 | You can also support this project by [**becoming a sponsor on GitHub**](https://github.com/sponsors/crazy-max) or by 31 | making a [Paypal donation](https://www.paypal.me/crazyws) to ensure this journey continues indefinitely! 32 | 33 | Thanks again for your support, it is much appreciated! :pray: 34 | 35 | ## License 36 | 37 | MIT. See `LICENSE` for more details.
38 | Rocket icon credit to [Squid Ink](http://thesquid.ink). 39 | -------------------------------------------------------------------------------- /assets/assets.go: -------------------------------------------------------------------------------- 1 | // Code generated by go-bindata. DO NOT EDIT. 2 | // sources: 3 | // res/DiscordPTB.lnk (1.945kB) 4 | // res/pinned_update.json (13.328kB) 5 | 6 | package assets 7 | 8 | import ( 9 | "bytes" 10 | "compress/gzip" 11 | "crypto/sha256" 12 | "fmt" 13 | "io" 14 | "os" 15 | "path/filepath" 16 | "strings" 17 | "time" 18 | ) 19 | 20 | func bindataRead(data []byte, name string) ([]byte, error) { 21 | gz, err := gzip.NewReader(bytes.NewBuffer(data)) 22 | if err != nil { 23 | return nil, fmt.Errorf("read %q: %w", name, err) 24 | } 25 | 26 | var buf bytes.Buffer 27 | _, err = io.Copy(&buf, gz) 28 | clErr := gz.Close() 29 | 30 | if err != nil { 31 | return nil, fmt.Errorf("read %q: %w", name, err) 32 | } 33 | if clErr != nil { 34 | return nil, err 35 | } 36 | 37 | return buf.Bytes(), nil 38 | } 39 | 40 | type asset struct { 41 | bytes []byte 42 | info os.FileInfo 43 | digest [sha256.Size]byte 44 | } 45 | 46 | type bindataFileInfo struct { 47 | name string 48 | size int64 49 | mode os.FileMode 50 | modTime time.Time 51 | } 52 | 53 | func (fi bindataFileInfo) Name() string { 54 | return fi.name 55 | } 56 | func (fi bindataFileInfo) Size() int64 { 57 | return fi.size 58 | } 59 | func (fi bindataFileInfo) Mode() os.FileMode { 60 | return fi.mode 61 | } 62 | func (fi bindataFileInfo) ModTime() time.Time { 63 | return fi.modTime 64 | } 65 | func (fi bindataFileInfo) IsDir() bool { 66 | return false 67 | } 68 | func (fi bindataFileInfo) Sys() interface{} { 69 | return nil 70 | } 71 | 72 | var _discordptbLnk = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x95\x4f\x68\x23\x55\x1c\xc7\x3f\xb1\xad\xb5\x17\x89\x18\xa4\x7f\xac\x8d\xd8\x88\x28\x33\x99\x49\xd2\x92\x06\x84\xb6\xf9\x63\x42\xa7\x26\x24\x0d\xa4\x30\x6a\x87\x64\xa0\xc1\xd4\x4c\x66\xa6\x90\x2a\x14\xc1\x43\x41\xac\x17\x2f\x22\x48\x8b\x08\x55\xd0\x83\x17\x05\x95\x52\xf0\xe0\x4d\xaa\x56\xf1\xe0\xa1\x15\x44\x11\x44\xb0\x97\x5d\xd8\x65\x97\x99\x24\x4b\xd3\x4d\xe9\x65\x2f\xbb\xec\xf7\xf1\xde\x9b\x37\xbf\xdf\xfb\x7e\xbf\xef\xbd\xe1\x8d\x02\x78\x7c\x0f\xe0\xe0\xc0\x6d\x49\xdd\x98\x05\x3f\xf0\xa0\x3a\xe6\x6d\xbe\x7a\xe4\xe9\xf4\x87\xfb\xbf\xff\x29\xfe\xff\xb3\x87\x77\x1f\x76\x13\x3d\x74\xe3\x5f\x7c\x4c\xe4\x8e\xb3\x87\xfe\x7f\x62\x55\xef\x47\xbf\x3d\xc4\x73\x92\xf4\xe1\x08\xc1\x78\x4c\xe5\x76\xbc\x8c\xec\xf6\xa5\x45\x29\xed\x25\x91\x29\xc4\xb3\xf9\x4d\x19\x52\x0c\xd1\xcf\x7f\xfb\xa5\xc5\x91\xb4\x13\x13\x81\xab\x75\x47\xec\x95\x73\x0c\xd7\xf7\xc6\x3c\x09\xaa\x58\x94\xa9\x63\x52\x21\xc7\x12\xf3\xc0\x30\x2b\x84\x70\x8c\x7e\xa5\x64\x06\xfc\x14\x8d\x8a\x66\xeb\xa2\xde\xd4\xcf\xf2\x8f\xa6\x9d\xea\xf0\x4f\xbf\xe9\xf0\xfb\xce\xf1\x4b\xf9\x41\x4f\x11\x83\x0a\x1a\x36\x3a\x22\x3a\x4d\x74\x60\x14\xc8\x02\x8f\xb7\xb7\xc1\xe9\xa7\xda\xb3\x5e\x04\x46\x80\x3e\xc7\xc7\xc2\xf7\x31\x2f\x90\xa8\x4e\x36\xd6\x75\x7f\x9c\x78\x4c\x4d\x54\xad\x72\xdd\xac\xe4\x96\xe6\xd5\xb3\xb6\x9e\xa4\x7b\x29\x7e\x04\xfc\xac\x62\x63\x63\x60\x11\x23\x48\x90\x4a\x57\x8e\x86\x81\x81\xe8\x8e\xd7\x08\xf2\x04\x22\x22\x6a\x57\xdb\x6b\x83\x54\x7a\x2d\x6b\x98\x38\xb1\x0b\x67\xb4\xb4\x04\x24\x44\xb7\x46\x08\x33\x8e\x80\x80\x81\x49\x9d\x32\x3a\x16\x16\x05\x6c\x34\x4c\x6c\xfc\x3d\x99\x3a\x6a\xc1\xb6\x5a\x11\x0b\x1d\x13\x0b\x95\x32\x26\x1a\xaf\xb3\x81\xca\x9c\xab\x97\x70\x3d\x6a\xa8\x28\xae\x86\x46\xed\x12\x87\x22\x55\x37\xe2\xeb\x83\x41\xd8\x0d\x14\x0b\xc9\x7c\x2e\x9f\x4d\x65\x94\x64\x40\x9d\x33\x8c\x84\x66\x6b\xaa\x52\x2f\x6b\xb5\xb3\x47\xa1\x19\x86\x58\x2d\xd7\x7b\x7c\xa7\xf7\x00\x02\x14\x29\x90\x24\x4f\x8e\x3c\x59\x52\x64\x50\x48\x12\xb8\x03\xfb\x7c\x1f\x77\x0f\x56\x5a\xd7\xd2\x6e\xa9\x3d\x36\x56\x6b\xb6\x24\xcb\x91\x4e\xfc\xd9\x9f\x7e\x6c\x9c\x7e\xf6\xa9\xf2\xe5\x5f\xc7\x5b\x95\xcd\x7a\xf1\x83\xad\x83\x97\xbe\xfb\xf5\xef\x47\xbe\x7e\xeb\xca\x72\x63\xf2\xb5\xbe\xcb\xe2\x2f\x78\x60\x08\x76\xb7\x01\xb9\x90\x2b\xfc\xf1\x76\x29\xf5\xad\x12\x8d\x7f\x73\xed\xd1\xf7\x9e\x7e\x7f\xed\x87\x06\xd0\xef\x08\x4d\x00\x41\xa0\x80\x80\x8c\xc0\x14\x02\x21\xf7\x29\x4c\x18\x89\x69\xc2\x44\x91\x09\x11\x21\x84\x40\x04\xc9\x2d\x51\x37\x12\x61\xda\xcd\x95\x89\x10\x25\x44\x14\x89\x90\x5b\x66\xdc\xb7\x4e\xa6\x7c\x6b\xd1\xeb\x6d\x33\xc5\x67\x94\x9d\x8d\x9d\x99\x85\x4f\x0e\x4f\x8e\x84\x93\x5f\x4e\x97\x81\x81\x8e\x99\xa7\xa0\x7d\x8b\x8a\x58\x34\x58\xa7\x8a\x89\x89\x4e\x0d\xf1\x82\x7b\xac\xf7\xaf\xa7\x85\x99\xb6\xe8\x17\x8f\xad\x25\x3e\xdf\x36\xd2\x7b\xe9\x59\xf1\xe3\xe7\x9b\xef\x8c\x03\xab\x4e\x42\xda\x39\x8a\x37\x16\xd2\xad\xf4\xdc\xc4\xf9\xa3\xba\x19\x00\x00\xff\xff\x09\xc9\x9e\x04\x99\x07\x00\x00") 73 | 74 | func discordptbLnkBytes() ([]byte, error) { 75 | return bindataRead( 76 | _discordptbLnk, 77 | "DiscordPTB.lnk", 78 | ) 79 | } 80 | 81 | func discordptbLnk() (*asset, error) { 82 | bytes, err := discordptbLnkBytes() 83 | if err != nil { 84 | return nil, err 85 | } 86 | 87 | info := bindataFileInfo{name: "DiscordPTB.lnk", size: 1945, mode: os.FileMode(0666), modTime: time.Unix(1540371719, 0)} 88 | a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1, 0x33, 0x71, 0xa5, 0xf9, 0xda, 0xd5, 0x2b, 0x18, 0xa6, 0xdf, 0x20, 0xdc, 0xbb, 0x36, 0x60, 0xca, 0x5b, 0xe0, 0x90, 0xba, 0x5d, 0x8a, 0xc0, 0x8f, 0x55, 0x91, 0xa6, 0xc9, 0xd5, 0xf3, 0xdb}} 89 | return a, nil 90 | } 91 | 92 | var _pinned_updateJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xdc\x9b\xe1\x4e\xe4\x47\x8e\xc0\xbf\xe7\x29\x50\x7f\xbe\x1b\xca\x2e\xdb\x65\xe7\x55\x56\xd1\xc8\x2e\xdb\x19\x14\x32\x70\xc0\xe4\x6e\x6f\x95\x77\x3f\xf5\x04\x98\x66\x94\xac\x4e\xec\xb6\x84\xf8\x04\xd5\x25\xea\xdf\xf5\xe3\x87\xb1\x5d\xd5\xff\xf8\xe1\xe2\xe2\xf0\xeb\x4d\x7e\xb9\xae\xfb\xc3\x8f\x17\xc7\xe1\xc5\xc5\x21\xaf\xee\xf7\xcd\x5d\x7e\xfc\xed\xe6\x6a\xd7\xf3\xcb\x17\x17\x87\xfe\x72\x7d\x7d\x32\xbe\xb8\x38\x7c\xba\xb9\x7f\xf8\xf8\x5b\xdd\xdd\x5f\xdd\x7c\x3e\xfc\x78\xf1\xb7\xe7\x99\x8b\x0b\xf8\x8f\x93\xc1\x38\x1d\xc0\x30\x7e\x1e\xfe\xf4\x6d\xe6\xf1\x9d\x9c\xac\x77\xb2\xc6\xe1\xd6\xf7\x2f\xfe\x73\x7d\xbc\xff\xe4\xc8\x72\xf8\xf1\xe2\x00\x66\xad\x54\x99\x0e\x7b\x65\xb2\x88\x93\xc0\x10\xb3\xbd\x04\xbc\x55\xd6\x80\x4d\xe4\x40\x8d\xd6\xa4\xcd\x29\xb2\x82\x0b\x0a\x6a\xad\xc3\xc9\xea\x5f\xee\x8e\x3b\x3b\x7c\x7a\x78\xb8\xbd\xff\xf1\xf2\x32\xaf\xff\xf3\xf6\x21\x3e\x3c\x92\xf0\xdb\xdb\x0f\x9f\xeb\xe1\x32\xaf\xee\x1f\xee\x6e\x2e\xfd\xf6\xf6\xf2\xf6\x21\x2e\xff\xfb\xea\xf3\xe5\xff\x08\x5d\xc2\x87\xf1\xe1\xb8\xa7\xcb\x17\xe0\x2e\xe1\xf2\xc8\xeb\xc3\x1f\x3f\x74\x78\x7c\xd4\xef\x4f\xcf\x3c\x64\x5d\x3f\xf8\xfd\x0b\x68\xff\x38\x81\xf4\xcf\xd0\x7e\x07\xf7\x3b\xbc\x5f\x01\xd3\xc9\x0b\x3f\x9d\xce\xfe\x53\xc8\x7f\x8a\x99\x67\xe7\x0e\xdb\x96\x99\xbc\xb5\x45\x44\x8d\x19\xd0\x59\x80\xaa\x59\x53\xc7\x8a\x05\xa0\xb2\x6d\x84\x37\xe5\x26\x62\x1d\x12\xb3\x69\x1c\x5e\xac\x7f\x1e\xd0\x77\x37\xbf\x3e\xcd\xd2\x25\x1c\x9e\x1f\xf8\xfb\xe3\x77\x3f\xfd\x70\x02\xff\x59\xf0\xbb\xdb\xfd\x86\xf5\x5e\x89\x54\xbe\x8d\x6b\xf0\xee\x0d\x5a\x68\xb4\x45\x9b\x5a\x11\x8c\x97\x8c\x26\xdb\x4a\x15\x8a\x9d\xd5\xdb\x6a\x83\x23\x6b\x8e\x9e\x60\x67\xd3\xfb\xee\x76\xbf\x1b\xb9\xdb\x30\x98\xcd\x48\x19\xc1\x6c\xa6\xb1\x16\x2c\x46\xb4\xb6\x55\x56\x41\x5d\x7a\x94\x1d\xdc\xcb\x36\x12\x74\x90\x4f\xc7\x28\x41\xe6\x33\xca\xfd\x88\xf9\x75\x6a\xff\x5a\x79\xe5\x6f\x58\x6e\xb7\x24\x01\xdf\xb1\x11\xc9\x49\xdd\x4a\xaa\x50\xcd\x42\xa6\x8f\x6a\xaa\x92\x99\x58\xb8\x3b\xe6\x20\x9f\x68\xdc\x8a\xb1\x22\x21\xc6\xf9\x62\xf7\x57\x70\xef\x47\xef\xf4\x9d\x32\x57\x0e\x28\x30\x4a\x18\x33\x5c\x21\xc6\x54\x21\xf2\x18\x56\x13\x7d\xe1\xe2\x98\x65\xbb\x6c\x43\x0b\x25\x6e\xb6\x4c\x0a\x3c\xa3\xde\xcf\xa0\x5f\x27\x78\xdd\x5d\x1f\xb7\xfb\x86\x15\x07\xce\xa5\x9d\x83\xc8\x71\x0d\x2f\x29\x94\x4e\x30\x36\x54\x1f\xb9\x2c\x08\xb7\x8c\xd8\x7b\x4a\xda\xec\xcc\xbd\x46\xdb\x6c\xd6\x69\x3d\xfd\x6c\x8a\x3f\xa2\x7b\x37\x92\xa7\x44\x25\x24\x48\xcd\xdc\x86\xb9\x2b\x4d\x51\x54\x45\x00\xe7\x8a\x82\x60\x31\xb4\xa4\x4e\x2e\x36\xa4\xe2\x39\xa6\x51\x2c\xe4\x94\x75\x46\xc9\x4f\x50\xbf\x4e\xf3\x9b\xdf\xea\xee\xda\xff\x8e\x6f\xd8\x73\xe4\xd2\x63\x98\xb6\x44\xea\x58\xd6\xc9\x13\x57\xe6\xe0\xde\xe1\x1b\x87\x14\x97\x0d\x17\xdc\x90\x49\x09\x7b\xaf\x20\x1a\x6a\x7b\x95\xac\x71\x36\xcf\x9f\xd8\xbd\x1b\xd1\x15\x22\x67\x4e\x51\x62\xee\x5a\x9e\x58\x2e\xbe\x34\x75\x66\x94\x8e\x39\x25\x22\xb0\xa8\x40\x34\xba\x78\xb3\xc1\x76\x21\x1b\x64\xbb\xe8\x8c\xa2\x9f\xb2\x7e\x9d\xe9\xff\x7b\xff\x90\x6f\xd8\x72\xda\x89\x73\xe8\xf2\xd0\xb2\xbd\xc6\x88\xb1\x63\x04\x86\x8a\x0d\x46\xda\x31\xcd\xd5\x54\xcb\x24\x51\x98\x25\x9d\xab\x70\x5a\xb1\xf1\x19\x13\x96\x23\xb7\x77\x63\xb8\x8f\x81\xb9\xb6\xeb\xd6\xc4\xee\x5c\xdb\x1c\xd0\x66\x76\x8c\xae\xe9\x8c\x79\x2c\x3e\xbb\x26\x1f\xe3\x7d\x2b\x41\xd6\x06\x45\x4b\x4d\x63\x3b\xa3\xe1\x4f\x9c\x5f\x67\xf7\xbe\xbe\xf9\x92\xf7\x7f\xff\xfc\xa6\x0b\xce\x60\x5e\xba\x34\x26\x90\xa9\xa4\x8c\x5a\x48\x54\x14\x93\x6d\x48\xae\xdc\x43\xd0\xac\x68\x9b\xa0\x24\xe5\x9a\x30\x9b\xb0\x66\x4b\x50\x9d\x4d\xf1\x67\x78\xef\xc6\xf3\x39\x96\xc2\xee\x1a\xc8\x33\x33\x87\xae\x98\xd0\x33\x7a\x4b\xaa\x82\x4e\x66\x0f\x6a\xd9\xec\xb4\x73\x51\x62\x30\xf4\x9c\xc3\x15\x7b\xb2\x9e\xd1\xf3\x17\xb0\x5f\x27\xfb\xcf\xfe\x6b\x7d\xfc\xf2\x70\x75\x7d\xff\x86\x6d\x9f\xd3\xc2\x65\x2d\xdc\xbb\x45\x76\x8d\xa1\xee\x08\x2a\xa3\x62\x55\xec\x5e\x34\x6d\x0d\xca\x76\xe5\x25\x25\x3a\x41\xcd\x06\x58\x84\x75\xd2\xd9\x6c\xff\x46\xef\xdd\xe8\x9e\x43\x95\x9b\x25\x62\x50\x86\x64\xec\xc5\xcd\x95\x40\xa2\x68\x30\xba\x43\xa8\x26\xa5\x93\x4e\xc2\xf2\x6e\x68\x04\x99\xb5\xc7\x32\x3c\x67\x19\xfa\x92\xf6\xeb\x7c\xcf\xba\xff\xe5\xe1\xe6\xf6\xe3\xbe\xb9\x7b\xcb\xfd\xf2\x14\xc9\xf0\xcd\x32\xd2\x60\xb5\x2d\x5c\xb5\x07\xcd\xea\xa9\x24\xda\x93\x1c\x79\xfb\xdc\xdd\xd4\xae\xc1\x31\x63\x32\xf2\x98\xc5\xab\x2c\xce\x66\xfc\x29\xbf\x77\xe3\x3c\x2b\x9b\x14\x21\x08\x94\x50\x90\x0c\x11\x1b\xd0\x63\x60\x93\x10\x30\xe0\x56\x0d\x6f\x9c\x14\x01\x93\xc7\xc2\x45\x7b\x4d\xc4\x85\x94\xe7\x4c\xd6\xbf\xe7\xfd\x3a\xeb\xef\x6f\xeb\xfa\x7a\x7f\xaa\x37\xdd\x84\xc1\xe1\x23\xa9\x92\xd8\x68\xe6\x6e\xe1\x9a\x3e\x7c\x54\xe0\x34\x63\x16\xea\x63\x50\x2a\x0d\x47\x56\x59\x68\x34\xda\x59\x8f\xb9\x67\x5b\x9f\x2f\x6d\xff\x46\xef\xdd\x18\xef\x61\x93\x76\x42\xbb\x1c\x33\x45\xa8\xa4\x19\x43\xa4\x92\x87\x72\x07\xac\x8d\x9e\xbe\x83\xd6\xe8\xb4\xe9\x9a\x89\x4b\x30\xc5\xa5\x75\x9e\xd3\xf8\x97\xb4\x5f\xe7\xfb\x5b\x4f\x68\x96\x20\xb2\x57\x80\x03\x6d\xac\x2d\x36\x61\x00\x81\x2f\x98\xd1\x1c\x3e\xbb\x55\xad\x53\x2c\x46\xa8\x10\x74\x0a\x16\x0b\x2e\x9e\x52\x7d\x36\xd5\xdf\x57\x2e\xb3\x2d\x1d\x65\x51\x6e\x01\x57\x8e\x59\x58\x58\xce\x15\xb2\xff\xa8\x56\x77\xd2\xc2\x58\x20\x33\xe6\xe0\x08\x51\xf2\xcd\xc3\x32\x61\x67\x9e\xd1\xf2\x7f\x35\x8d\xb9\xba\xbf\xf5\x87\xfd\xe9\x0d\x3b\xee\x32\xd6\x34\x1c\xc7\xa2\x29\xb5\x77\x5b\xd2\x1a\x30\x7b\x04\xc8\x82\x21\xce\xcb\x64\xd2\x06\x90\x99\x43\x66\xbb\x28\xc8\xde\xa8\x4a\x0d\xe7\x0b\xe7\x4f\xec\xde\x8d\xe6\x53\xe6\x9a\x9a\x22\x5c\x52\x12\xec\x39\x36\xac\x6c\x64\xe1\x98\xd3\x06\xa5\x54\x0d\x66\x4a\x03\x86\x5e\x60\x34\x09\x01\x33\x5d\x4d\xcf\x79\xea\x7f\xca\xfa\x75\xa6\x7f\xba\xb9\x79\xcb\x49\x8b\x52\x42\x38\xea\x9c\x42\xc5\x2d\xea\xd1\x1d\x0e\x1b\xb3\xf0\xf8\x85\x7d\x9a\x2d\xae\x96\xed\xbe\x6c\x19\x26\x94\xad\x18\x83\x81\xe2\x7c\xa5\xe9\x91\xdb\xbb\x31\x7c\x27\xc5\xd0\x34\x98\x4a\x3e\x76\x8d\xd5\x03\xa6\x60\x47\x27\xab\x79\xb2\x6d\x1a\x4c\xc6\x11\x8e\x23\x33\xc8\x4a\x03\x3d\xda\xa7\x8e\x73\x1a\xfe\xc4\xf9\x95\x67\xff\xdf\x5d\xe8\x7a\x7b\x82\x2f\xd9\x29\xe8\x4b\xb6\x2b\xc9\x1a\x94\xb8\xa7\x82\x41\xaa\xb7\x0a\xf2\xc8\x1a\xd5\x15\xd2\xb9\x71\x1f\xff\xa1\x0a\xd2\x9c\x40\x31\x45\xfd\x7c\x9d\xc6\x47\x74\xef\xc6\x71\xc4\xee\xd5\x33\x01\x18\xdd\x20\x8f\xc5\x8f\xce\x1c\xbe\x13\x62\x78\xcc\xde\xb2\xa3\x64\x68\x48\x44\xaa\xc6\xee\x35\x6d\x68\xad\x1e\x31\xce\xd9\x4f\x3f\x41\xfd\x3a\xcd\x7f\xb9\xbb\xba\xbf\x7d\xc3\x92\x23\x80\xc6\xb1\x98\x1c\x0a\x3d\xc5\x72\xed\xb1\xa7\x4e\x85\x0a\xc2\x94\xdd\x38\x6b\x8c\x5d\x6b\x28\x62\x47\xb4\xa2\x8d\x55\x86\x04\xc5\xb9\xcf\x26\xf9\x57\x70\xef\x47\xf1\x11\x9c\xc9\xc9\xcd\x30\xdb\x69\x02\xc8\x32\xde\x51\xd3\xe6\x9a\x68\xb8\x68\x69\xb4\x2b\x95\x01\x6c\xef\xda\xbe\x26\xae\x96\x52\x18\x75\x46\xc5\x9f\x41\xbf\x4e\xf0\xdf\xae\x7e\xbe\xba\xf6\xcf\x0f\x6f\xb9\xa7\x48\xae\x8c\x36\x26\x8a\xb3\x74\x43\x81\xc5\xe0\xd1\x84\x06\xcd\xb1\x6d\x5a\xa2\x6a\xce\x99\xde\x9b\x37\x23\x00\x43\x45\x5a\x4f\x25\xd2\xf3\xdd\xc1\x7d\x82\xf7\x6e\x44\x87\xb1\x86\x89\xfa\xf0\x45\xd1\x12\x94\x90\x38\xd7\xde\x8b\xbc\x72\x39\x5a\x59\x97\xda\x9c\xa1\x63\x85\x9a\x89\xc3\xa4\xd5\xb9\xd3\xab\xcf\x79\x55\xf1\x05\xec\x57\x76\x13\xeb\x97\xbb\xab\x87\x37\x6c\xba\x53\xb6\x34\x8b\xa4\x3a\xee\x9a\x23\x66\x09\x2d\x5d\xba\xcb\xd7\xac\x5c\x6b\x91\xc1\x6e\x85\x68\xdb\x4d\xc0\x98\x72\x4c\x25\x23\x04\x5b\xce\xd7\x49\xfc\x4a\xee\xdd\x68\xee\xd6\xfe\x47\xed\xce\x65\xcd\xab\x69\x09\x27\xc7\x46\xe7\x8e\x81\x03\x65\xb2\xa9\xd8\x1e\xe8\x61\x86\x3b\x4b\x84\xc4\x9b\x53\x3a\xce\xd9\x5f\xf9\x46\xfa\xff\xe9\xf8\x0f\x8f\xbf\x81\x97\x2e\xff\x15\xeb\x67\x32\xcf\x7c\x9f\xdd\x7d\x64\xfa\x67\x75\xba\xc5\x66\x12\xcd\x65\xc4\x34\x0d\x62\x90\x4d\xd4\x41\xbe\x76\x3a\x6c\x18\x8d\x98\x11\x02\x12\x36\x16\x68\xec\xb0\xde\xa3\xa4\x4b\xf7\x53\x00\xfe\xf7\x80\xfa\xce\xc0\x3f\xf6\xfe\x9d\x79\xcf\x7f\xdf\x7f\x69\xdc\x89\x21\x27\xa6\x9d\x58\xf6\x6c\xd8\x9f\x1d\x72\x35\x8e\xb1\xd6\xc4\x36\xd0\x31\x72\xb7\x27\xee\xa5\xe1\x04\x3e\x63\x2b\x0b\x91\xaf\xa0\xdc\x0b\xa2\x7c\x20\xb2\xbb\xc2\x6a\x06\x2b\xf9\x76\xd4\xf8\x6f\x22\x72\x6a\xca\xe1\xd9\x8a\xaf\x3b\x38\xdc\xd5\x7f\x7d\xb9\xba\xab\xd3\x8a\xed\x6f\x2f\xa3\xe2\x8b\x93\xc5\xef\x22\xe6\xd3\x0d\xd8\xbf\x3e\x96\xf9\xd3\x06\xf6\xf7\x49\xc6\xd7\x0f\xf9\x1c\xdf\xd2\x0f\xbf\xff\xf0\x7f\x01\x00\x00\xff\xff\x64\xc7\xbd\xd1\x10\x34\x00\x00") 93 | 94 | func pinned_updateJsonBytes() ([]byte, error) { 95 | return bindataRead( 96 | _pinned_updateJson, 97 | "pinned_update.json", 98 | ) 99 | } 100 | 101 | func pinned_updateJson() (*asset, error) { 102 | bytes, err := pinned_updateJsonBytes() 103 | if err != nil { 104 | return nil, err 105 | } 106 | 107 | info := bindataFileInfo{name: "pinned_update.json", size: 13328, mode: os.FileMode(0666), modTime: time.Unix(1722712411, 0)} 108 | a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6f, 0xc1, 0x2d, 0x53, 0xa3, 0x79, 0xe6, 0x56, 0x5a, 0xb, 0x12, 0xcc, 0x63, 0x50, 0x33, 0xc4, 0x14, 0x4a, 0x15, 0xe7, 0xf7, 0x4b, 0xa, 0x10, 0xf6, 0xfa, 0x7, 0xdb, 0x6a, 0x46, 0x6d, 0xf6}} 109 | return a, nil 110 | } 111 | 112 | // Asset loads and returns the asset for the given name. 113 | // It returns an error if the asset could not be found or 114 | // could not be loaded. 115 | func Asset(name string) ([]byte, error) { 116 | canonicalName := strings.Replace(name, "\\", "/", -1) 117 | if f, ok := _bindata[canonicalName]; ok { 118 | a, err := f() 119 | if err != nil { 120 | return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) 121 | } 122 | return a.bytes, nil 123 | } 124 | return nil, fmt.Errorf("Asset %s not found", name) 125 | } 126 | 127 | // AssetString returns the asset contents as a string (instead of a []byte). 128 | func AssetString(name string) (string, error) { 129 | data, err := Asset(name) 130 | return string(data), err 131 | } 132 | 133 | // MustAsset is like Asset but panics when Asset would return an error. 134 | // It simplifies safe initialization of global variables. 135 | func MustAsset(name string) []byte { 136 | a, err := Asset(name) 137 | if err != nil { 138 | panic("asset: Asset(" + name + "): " + err.Error()) 139 | } 140 | 141 | return a 142 | } 143 | 144 | // MustAssetString is like AssetString but panics when Asset would return an 145 | // error. It simplifies safe initialization of global variables. 146 | func MustAssetString(name string) string { 147 | return string(MustAsset(name)) 148 | } 149 | 150 | // AssetInfo loads and returns the asset info for the given name. 151 | // It returns an error if the asset could not be found or 152 | // could not be loaded. 153 | func AssetInfo(name string) (os.FileInfo, error) { 154 | canonicalName := strings.Replace(name, "\\", "/", -1) 155 | if f, ok := _bindata[canonicalName]; ok { 156 | a, err := f() 157 | if err != nil { 158 | return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) 159 | } 160 | return a.info, nil 161 | } 162 | return nil, fmt.Errorf("AssetInfo %s not found", name) 163 | } 164 | 165 | // AssetDigest returns the digest of the file with the given name. It returns an 166 | // error if the asset could not be found or the digest could not be loaded. 167 | func AssetDigest(name string) ([sha256.Size]byte, error) { 168 | canonicalName := strings.Replace(name, "\\", "/", -1) 169 | if f, ok := _bindata[canonicalName]; ok { 170 | a, err := f() 171 | if err != nil { 172 | return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) 173 | } 174 | return a.digest, nil 175 | } 176 | return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name) 177 | } 178 | 179 | // Digests returns a map of all known files and their checksums. 180 | func Digests() (map[string][sha256.Size]byte, error) { 181 | mp := make(map[string][sha256.Size]byte, len(_bindata)) 182 | for name := range _bindata { 183 | a, err := _bindata[name]() 184 | if err != nil { 185 | return nil, err 186 | } 187 | mp[name] = a.digest 188 | } 189 | return mp, nil 190 | } 191 | 192 | // AssetNames returns the names of the assets. 193 | func AssetNames() []string { 194 | names := make([]string, 0, len(_bindata)) 195 | for name := range _bindata { 196 | names = append(names, name) 197 | } 198 | return names 199 | } 200 | 201 | // _bindata is a table, holding each asset generator, mapped to its name. 202 | var _bindata = map[string]func() (*asset, error){ 203 | "DiscordPTB.lnk": discordptbLnk, 204 | "pinned_update.json": pinned_updateJson, 205 | } 206 | 207 | // AssetDebug is true if the assets were built with the debug flag enabled. 208 | const AssetDebug = false 209 | 210 | // AssetDir returns the file names below a certain 211 | // directory embedded in the file by go-bindata. 212 | // For example if you run go-bindata on data/... and data contains the 213 | // following hierarchy: 214 | // 215 | // data/ 216 | // foo.txt 217 | // img/ 218 | // a.png 219 | // b.png 220 | // 221 | // then AssetDir("data") would return []string{"foo.txt", "img"}, 222 | // AssetDir("data/img") would return []string{"a.png", "b.png"}, 223 | // AssetDir("foo.txt") and AssetDir("notexist") would return an error, and 224 | // AssetDir("") will return []string{"data"}. 225 | func AssetDir(name string) ([]string, error) { 226 | node := _bintree 227 | if len(name) != 0 { 228 | canonicalName := strings.Replace(name, "\\", "/", -1) 229 | pathList := strings.Split(canonicalName, "/") 230 | for _, p := range pathList { 231 | node = node.Children[p] 232 | if node == nil { 233 | return nil, fmt.Errorf("Asset %s not found", name) 234 | } 235 | } 236 | } 237 | if node.Func != nil { 238 | return nil, fmt.Errorf("Asset %s not found", name) 239 | } 240 | rv := make([]string, 0, len(node.Children)) 241 | for childName := range node.Children { 242 | rv = append(rv, childName) 243 | } 244 | return rv, nil 245 | } 246 | 247 | type bintree struct { 248 | Func func() (*asset, error) 249 | Children map[string]*bintree 250 | } 251 | 252 | var _bintree = &bintree{nil, map[string]*bintree{ 253 | "DiscordPTB.lnk": {discordptbLnk, map[string]*bintree{}}, 254 | "pinned_update.json": {pinned_updateJson, map[string]*bintree{}}, 255 | }} 256 | 257 | // RestoreAsset restores an asset under the given directory. 258 | func RestoreAsset(dir, name string) error { 259 | data, err := Asset(name) 260 | if err != nil { 261 | return err 262 | } 263 | info, err := AssetInfo(name) 264 | if err != nil { 265 | return err 266 | } 267 | err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) 268 | if err != nil { 269 | return err 270 | } 271 | err = os.WriteFile(_filePath(dir, name), data, info.Mode()) 272 | if err != nil { 273 | return err 274 | } 275 | return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) 276 | } 277 | 278 | // RestoreAssets restores an asset under the given directory recursively. 279 | func RestoreAssets(dir, name string) error { 280 | children, err := AssetDir(name) 281 | // File 282 | if err != nil { 283 | return RestoreAsset(dir, name) 284 | } 285 | // Dir 286 | for _, child := range children { 287 | err = RestoreAssets(dir, filepath.Join(name, child)) 288 | if err != nil { 289 | return err 290 | } 291 | } 292 | return nil 293 | } 294 | 295 | func _filePath(dir, name string) string { 296 | canonicalName := strings.Replace(name, "\\", "/", -1) 297 | return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...) 298 | } 299 | -------------------------------------------------------------------------------- /build.properties: -------------------------------------------------------------------------------- 1 | # Portapps 2 | core.dir = ../portapps 3 | 4 | # App 5 | app = discord-ptb 6 | app.name = DiscordPTB 7 | app.type = electron 8 | app.version = 1.0.1137 9 | app.release = 28 10 | app.homepage = https://discordapp.com 11 | 12 | # Update instructions: 13 | # - fix res/pinned_update.json with https://discord.com/api/updates/distributions/app/manifests/latest?channel=ptb&platform=win&arch=x64 14 | # - reload assets (compile) 15 | 16 | # Portable app 17 | papp.id = ${app}-portable 18 | papp.guid = {0A7FE821-675B-4B75-ADFD-EEE26865A892} 19 | papp.name = ${app.name} Portable 20 | papp.desc = ${app.name} portable on Windows by Portapps 21 | papp.url = https://github.com/portapps/${papp.id} 22 | papp.folder = app 23 | 24 | # Electron 25 | #electron.executionstub = 26 | electron.libfolder = lib/net45 27 | electron.enableautoupdate = false 28 | electron.appasar.file = common/paths.js 29 | electron.appasar.search = userDataPath = determineUserData(userDataRoot, buildInfo); 30 | electron.appasar.replace = userDataPath = _path.default.join(_path.default.dirname(process.execPath), '..', '..', 'data'); 31 | electron.appasar.file2 = app_bootstrap/bootstrap.js 32 | electron.appasar.search2 = const allowMultipleInstances = hasArgvFlag('--multi-instance'); 33 | electron.appasar.replace2 = const allowMultipleInstances = true; 34 | 35 | # Official artifacts 36 | atf.id = DiscordPTB 37 | atf.win64.filename = DiscordPTBSetup-win64 38 | atf.win64.ext = .exe 39 | atf.win64.url = https://dl-ptb.discordapp.net/distro/app/ptb/win/x64/${app.version}/DiscordPTBSetup.exe 40 | #atf.win64.url = https://discordapp.com/api/download/ptb?platform=win 41 | atf.win64.assertextract = RELEASES 42 | -------------------------------------------------------------------------------- /build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/portapps/discord-ptb-portable 2 | 3 | go 1.24.0 4 | 5 | require ( 6 | github.com/kevinburke/go-bindata/v4 v4.0.2 7 | github.com/portapps/portapps/v3 v3.16.0 8 | ) 9 | 10 | require ( 11 | github.com/akavel/rsrc v0.10.2 // indirect 12 | github.com/go-ole/go-ole v1.3.0 // indirect 13 | github.com/go-viper/mapstructure/v2 v2.2.1 // indirect 14 | github.com/ilya1st/rotatewriter v0.0.0-20171126183947-3df0c1a3ed6d // indirect 15 | github.com/josephspurrier/goversioninfo v1.5.0 // indirect 16 | github.com/mattn/go-colorable v0.1.13 // indirect 17 | github.com/mattn/go-isatty v0.0.19 // indirect 18 | github.com/pkg/errors v0.9.1 // indirect 19 | github.com/rs/zerolog v1.34.0 // indirect 20 | golang.org/x/sys v0.32.0 // indirect 21 | gopkg.in/yaml.v3 v3.0.1 // indirect 22 | ) 23 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw= 2 | github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= 3 | github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= 4 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 5 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 6 | github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= 7 | github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= 8 | github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= 9 | github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= 10 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 11 | github.com/ilya1st/rotatewriter v0.0.0-20171126183947-3df0c1a3ed6d h1:OGuVAVny/97zsQ5BWg0mOjzTBBD9zR+Lug1co144+rU= 12 | github.com/ilya1st/rotatewriter v0.0.0-20171126183947-3df0c1a3ed6d/go.mod h1:S1q6q+21PRGd0WRX+fHjQ+TOe3CgpSv7zgCWnZcbxCs= 13 | github.com/josephspurrier/goversioninfo v1.5.0 h1:9TJtORoyf4YMoWSOo/cXFN9A/lB3PniJ91OxIH6e7Zg= 14 | github.com/josephspurrier/goversioninfo v1.5.0/go.mod h1:6MoTvFZ6GKJkzcdLnU5T/RGYUbHQbKpYeNP0AgQLd2o= 15 | github.com/kevinburke/go-bindata/v4 v4.0.2 h1:6qQI0nNTL27wM1En8zQHGBEPp3ETzgFU6hVdSjlkrfE= 16 | github.com/kevinburke/go-bindata/v4 v4.0.2/go.mod h1:M/CkBqw2qCZ1Ztv5JyKgocGYWyUkYlDqkqXS1ktLe5c= 17 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= 18 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= 19 | github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 20 | github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= 21 | github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 22 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 23 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 24 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 25 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 26 | github.com/portapps/portapps/v3 v3.16.0 h1:wQyDDoYAh7YTTaIwo48K8lbegODZuasSq4S7XIppe6s= 27 | github.com/portapps/portapps/v3 v3.16.0/go.mod h1:4ue65AQ4rAe0iiOr3tTvmmNyDYIB9R6JywBBEPrJKZU= 28 | github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= 29 | github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= 30 | github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= 31 | github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= 32 | github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 33 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 34 | golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 35 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 36 | golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 37 | golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= 38 | golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 39 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 40 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 41 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 42 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 43 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | //go:generate go install -v github.com/kevinburke/go-bindata/v4/go-bindata 2 | //go:generate go-bindata -prefix res/ -pkg assets -o assets/assets.go res/DiscordPTB.lnk res/pinned_update.json 3 | //go:generate go install -v github.com/josephspurrier/goversioninfo/cmd/goversioninfo 4 | //go:generate goversioninfo -icon=res/papp.ico -manifest=res/papp.manifest 5 | package main 6 | 7 | import ( 8 | "encoding/json" 9 | "io" 10 | "os" 11 | "path" 12 | "strings" 13 | 14 | "github.com/portapps/discord-ptb-portable/assets" 15 | "github.com/portapps/portapps/v3" 16 | "github.com/portapps/portapps/v3/pkg/log" 17 | "github.com/portapps/portapps/v3/pkg/registry" 18 | "github.com/portapps/portapps/v3/pkg/shortcut" 19 | "github.com/portapps/portapps/v3/pkg/utl" 20 | ) 21 | 22 | type config struct { 23 | Cleanup bool `yaml:"cleanup" mapstructure:"cleanup"` 24 | } 25 | 26 | var ( 27 | app *portapps.App 28 | cfg *config 29 | ) 30 | 31 | func init() { 32 | var err error 33 | 34 | // Default config 35 | cfg = &config{ 36 | Cleanup: false, 37 | } 38 | 39 | // Init app 40 | if app, err = portapps.NewWithCfg("discord-ptb-portable", "DiscordPTB", cfg); err != nil { 41 | log.Fatal().Err(err).Msg("Cannot initialize application. See log file for more info.") 42 | } 43 | } 44 | 45 | func main() { 46 | utl.CreateFolder(app.DataPath) 47 | electronAppPath := app.ElectronAppPath() 48 | 49 | app.Process = utl.PathJoin(electronAppPath, "DiscordPTB.exe") 50 | app.Args = []string{ 51 | "--user-data-dir=" + app.DataPath, 52 | } 53 | app.WorkingDir = electronAppPath 54 | 55 | // Cleanup on exit 56 | if cfg.Cleanup { 57 | defer func() { 58 | regKey := registry.Key{ 59 | Key: `HKCU\SOFTWARE\DiscordPTB`, 60 | Arch: "32", 61 | } 62 | if regKey.Exists() { 63 | if err := regKey.Delete(true); err != nil { 64 | log.Error().Err(err).Msg("Cannot remove registry key") 65 | } 66 | } 67 | utl.Cleanup([]string{ 68 | path.Join(os.Getenv("APPDATA"), "discordptb"), 69 | path.Join(os.Getenv("TEMP"), "Discord Crashes"), 70 | }) 71 | }() 72 | } 73 | 74 | // Update settings 75 | settingsPath := utl.PathJoin(app.DataPath, "settings.json") 76 | if _, err := os.Stat(settingsPath); err == nil { 77 | log.Info().Msg("Update settings...") 78 | rawSettings, err := os.ReadFile(settingsPath) 79 | if err == nil { 80 | jsonMapSettings := make(map[string]interface{}) 81 | if err = json.Unmarshal(rawSettings, &jsonMapSettings); err != nil { 82 | log.Error().Err(err).Msg("Settings unmarshal") 83 | } 84 | log.Info().Interface("settings", jsonMapSettings).Msg("Current settings") 85 | 86 | jsonMapSettings["SKIP_HOST_UPDATE"] = true 87 | jsonMapSettings["USE_PINNED_UPDATE_MANIFEST"] = true 88 | log.Info().Interface("settings", jsonMapSettings).Msg("New settings") 89 | 90 | jsonSettings, err := json.Marshal(jsonMapSettings) 91 | if err != nil { 92 | log.Error().Err(err).Msg("Settings marshal") 93 | } 94 | err = os.WriteFile(settingsPath, jsonSettings, 0644) 95 | if err != nil { 96 | log.Error().Err(err).Msg("Write settings") 97 | } 98 | } 99 | } else { 100 | fo, err := os.Create(settingsPath) 101 | if err != nil { 102 | log.Error().Err(err).Msg("Cannot create settings.json") 103 | } 104 | defer fo.Close() 105 | if _, err = io.Copy(fo, strings.NewReader(`{ 106 | "SKIP_HOST_UPDATE": true, 107 | "USE_PINNED_UPDATE_MANIFEST": true 108 | }`)); err != nil { 109 | log.Error().Err(err).Msg("Cannot write to settings.json") 110 | } 111 | } 112 | 113 | // Copy pinned_update.json 114 | pinnedUpdate, err := assets.Asset("pinned_update.json") 115 | if err != nil { 116 | log.Error().Err(err).Msg("Cannot load asset pinned_update.json") 117 | } 118 | err = os.WriteFile(utl.PathJoin(app.DataPath, "pinned_update.json"), pinnedUpdate, 0644) 119 | if err != nil { 120 | log.Error().Err(err).Msg("Cannot write pinned_update.json") 121 | } 122 | 123 | // Copy default shortcut 124 | shortcutPath := path.Join(utl.StartMenuPath(), "Discord PTB Portable.lnk") 125 | defaultShortcut, err := assets.Asset("DiscordPTB.lnk") 126 | if err != nil { 127 | log.Error().Err(err).Msg("Cannot load asset DiscordPTB.lnk") 128 | } 129 | err = os.WriteFile(shortcutPath, defaultShortcut, 0644) 130 | if err != nil { 131 | log.Error().Err(err).Msg("Cannot write default shortcut") 132 | } 133 | 134 | // Update default shortcut 135 | err = shortcut.Create(shortcut.Shortcut{ 136 | ShortcutPath: shortcutPath, 137 | TargetPath: app.Process, 138 | Arguments: shortcut.Property{Clear: true}, 139 | Description: shortcut.Property{Value: "Discord PTB Portable by Portapps"}, 140 | IconLocation: shortcut.Property{Value: app.Process}, 141 | WorkingDirectory: shortcut.Property{Value: app.AppPath}, 142 | }) 143 | if err != nil { 144 | log.Error().Err(err).Msg("Cannot create shortcut") 145 | } 146 | defer func() { 147 | if err := os.Remove(shortcutPath); err != nil { 148 | log.Error().Err(err).Msg("Cannot remove shortcut") 149 | } 150 | }() 151 | 152 | defer app.Close() 153 | app.Launch(os.Args[1:]) 154 | } 155 | -------------------------------------------------------------------------------- /res/DiscordPTB.lnk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/portapps/discord-ptb-portable/fb1092a7aa90f3952aad5eba578c3f34417824a9/res/DiscordPTB.lnk -------------------------------------------------------------------------------- /res/app.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/portapps/discord-ptb-portable/fb1092a7aa90f3952aad5eba578c3f34417824a9/res/app.ico -------------------------------------------------------------------------------- /res/papp.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/portapps/discord-ptb-portable/fb1092a7aa90f3952aad5eba578c3f34417824a9/res/papp.ico -------------------------------------------------------------------------------- /res/papp.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /res/papp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/portapps/discord-ptb-portable/fb1092a7aa90f3952aad5eba578c3f34417824a9/res/papp.png -------------------------------------------------------------------------------- /res/pinned_update.json: -------------------------------------------------------------------------------- 1 | { 2 | "modules": { 3 | "discord_media": { 4 | "full": { 5 | "host_version": [ 6 | 1, 7 | 0, 8 | 1137 9 | ], 10 | "module_version": 1, 11 | "package_sha256": "7f35d3d56dcf8094e211c796a6640e00ae6decdab37fbef44eb2804757567cda", 12 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_media/1/full.distro" 13 | }, 14 | "deltas": [ 15 | { 16 | "host_version": [ 17 | 1, 18 | 0, 19 | 1136 20 | ], 21 | "module_version": 1, 22 | "package_sha256": "1470d3ce110c0a87e31d8ebfcff8734ea0fd21d85e7ba46efdb1d52c786c69f9", 23 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_media/1/from/1.0.1136/1" 24 | } 25 | ] 26 | }, 27 | "discord_desktop_core": { 28 | "full": { 29 | "host_version": [ 30 | 1, 31 | 0, 32 | 1137 33 | ], 34 | "module_version": 3, 35 | "package_sha256": "14b2b1771d25a9bd83e5f6a601791ffde0e876f652bad56e6c25b613f7e32f3d", 36 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_desktop_core/3/full.distro" 37 | }, 38 | "deltas": [ 39 | { 40 | "host_version": [ 41 | 1, 42 | 0, 43 | 1137 44 | ], 45 | "module_version": 2, 46 | "package_sha256": "6de32d6f1d81443984cb470a6aabcc9a04c50dd1ad4f8b8d494f2a91d096271f", 47 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_desktop_core/3/from/1.0.1137/2" 48 | } 49 | ] 50 | }, 51 | "discord_game_utils": { 52 | "full": { 53 | "host_version": [ 54 | 1, 55 | 0, 56 | 1137 57 | ], 58 | "module_version": 1, 59 | "package_sha256": "5c7c5ad133eb90047b8c470d6e1abdc8d6e378091dcea22f48486e2ba9f6d812", 60 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_game_utils/1/full.distro" 61 | }, 62 | "deltas": [ 63 | { 64 | "host_version": [ 65 | 1, 66 | 0, 67 | 1136 68 | ], 69 | "module_version": 1, 70 | "package_sha256": "140b1354a9b1c7a65c57f267f84d21430e4fe5a1dbb4dec268178f6503d921f8", 71 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_game_utils/1/from/1.0.1136/1" 72 | } 73 | ] 74 | }, 75 | "discord_erlpack": { 76 | "full": { 77 | "host_version": [ 78 | 1, 79 | 0, 80 | 1137 81 | ], 82 | "module_version": 1, 83 | "package_sha256": "237dbefa01453947930cd875ed37fab6bb82ba660ec8f62f5b8cf36805c61615", 84 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_erlpack/1/full.distro" 85 | }, 86 | "deltas": [ 87 | { 88 | "host_version": [ 89 | 1, 90 | 0, 91 | 1136 92 | ], 93 | "module_version": 1, 94 | "package_sha256": "c37b70c814ff5531f291108f31696951de5f2add73e46f013589d0bcb3cf18bf", 95 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_erlpack/1/from/1.0.1136/1" 96 | } 97 | ] 98 | }, 99 | "discord_rpc": { 100 | "full": { 101 | "host_version": [ 102 | 1, 103 | 0, 104 | 1137 105 | ], 106 | "module_version": 1, 107 | "package_sha256": "8d5fd51221533bcc9ae31021ec3a8dbf734810e74429e75e370fe13f18dd6cb0", 108 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_rpc/1/full.distro" 109 | }, 110 | "deltas": [ 111 | { 112 | "host_version": [ 113 | 1, 114 | 0, 115 | 1136 116 | ], 117 | "module_version": 1, 118 | "package_sha256": "f2c83246fd8726949cf8da329b824f28f203e19ea1a054e3f09a2a450ee0a98a", 119 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_rpc/1/from/1.0.1136/1" 120 | } 121 | ] 122 | }, 123 | "discord_overlay2": { 124 | "full": { 125 | "host_version": [ 126 | 1, 127 | 0, 128 | 1137 129 | ], 130 | "module_version": 1, 131 | "package_sha256": "a920b4fe95b3617cc9f57767712f595cf5706feaa912316b0b8c0d4196d409b8", 132 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_overlay2/1/full.distro" 133 | }, 134 | "deltas": [ 135 | { 136 | "host_version": [ 137 | 1, 138 | 0, 139 | 1136 140 | ], 141 | "module_version": 1, 142 | "package_sha256": "5ac95cbbf3d26609bc171a5df6bee07ab5393de4e741ed584ecbc93b76ba8651", 143 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_overlay2/1/from/1.0.1136/1" 144 | } 145 | ] 146 | }, 147 | "discord_voice_filters": { 148 | "full": { 149 | "host_version": [ 150 | 1, 151 | 0, 152 | 1137 153 | ], 154 | "module_version": 2, 155 | "package_sha256": "b71d00bdcd98d5e91735efac362a7f2936cff1940c9f41e2a6ec3bb4d96f8693", 156 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_voice_filters/2/full.distro" 157 | }, 158 | "deltas": [ 159 | { 160 | "host_version": [ 161 | 1, 162 | 0, 163 | 1137 164 | ], 165 | "module_version": 1, 166 | "package_sha256": "6d109f3f18c77a905496df72fdfa1d211424be1863c8817087c45f7c9ec6977d", 167 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_voice_filters/2/from/1.0.1137/1" 168 | } 169 | ] 170 | }, 171 | "discord_krisp": { 172 | "full": { 173 | "host_version": [ 174 | 1, 175 | 0, 176 | 1137 177 | ], 178 | "module_version": 1, 179 | "package_sha256": "34ebb00feb4f9eef221502e11a35f8a31350a13c6395d0d73cb8378a85370a12", 180 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_krisp/1/full.distro" 181 | }, 182 | "deltas": [ 183 | { 184 | "host_version": [ 185 | 1, 186 | 0, 187 | 1136 188 | ], 189 | "module_version": 1, 190 | "package_sha256": "c3060ffedfa2ce861f0635b9b5479c22e9bea775a25cc217456e4e360cee31a7", 191 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_krisp/1/from/1.0.1136/1" 192 | } 193 | ] 194 | }, 195 | "discord_cloudsync": { 196 | "full": { 197 | "host_version": [ 198 | 1, 199 | 0, 200 | 1137 201 | ], 202 | "module_version": 1, 203 | "package_sha256": "54a74555927c8c6fb73fb16eda7d418d78e1ddb71baa7cad20b4dd97813dc6ee", 204 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_cloudsync/1/full.distro" 205 | }, 206 | "deltas": [ 207 | { 208 | "host_version": [ 209 | 1, 210 | 0, 211 | 1136 212 | ], 213 | "module_version": 1, 214 | "package_sha256": "65bf8272358a1486acdec6af4e71f7fa0e8c6d69861e5754dfdf001524348e84", 215 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_cloudsync/1/from/1.0.1136/1" 216 | } 217 | ] 218 | }, 219 | "discord_hook": { 220 | "full": { 221 | "host_version": [ 222 | 1, 223 | 0, 224 | 1137 225 | ], 226 | "module_version": 1, 227 | "package_sha256": "a45ebad133132855d1d61d65179ef9040c9a8649b53092d3ffbd77912d3c0f2e", 228 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_hook/1/full.distro" 229 | }, 230 | "deltas": [ 231 | { 232 | "host_version": [ 233 | 1, 234 | 0, 235 | 1136 236 | ], 237 | "module_version": 1, 238 | "package_sha256": "b54a813ce76ade72c89952879b77559d582401d2fee27c3129c2de3144cbec2a", 239 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_hook/1/from/1.0.1136/1" 240 | } 241 | ] 242 | }, 243 | "discord_zstd": { 244 | "full": { 245 | "host_version": [ 246 | 1, 247 | 0, 248 | 1137 249 | ], 250 | "module_version": 1, 251 | "package_sha256": "bf14facae1d6cf2d1d94c6a754805532e4c4d4836e3c136ee4a5ac1c5e160fe8", 252 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_zstd/1/full.distro" 253 | }, 254 | "deltas": [ 255 | { 256 | "host_version": [ 257 | 1, 258 | 0, 259 | 1136 260 | ], 261 | "module_version": 1, 262 | "package_sha256": "750e797a9e980f18829612dac988e9650b916e43a7246d2a87e0e6d2b8fa4331", 263 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_zstd/1/from/1.0.1136/1" 264 | } 265 | ] 266 | }, 267 | "discord_desktop_overlay": { 268 | "full": { 269 | "host_version": [ 270 | 1, 271 | 0, 272 | 1137 273 | ], 274 | "module_version": 2, 275 | "package_sha256": "94c5b131ce97c295a00cbd6fb29a50e8f310dd09bed0800e86eec1ad294f2335", 276 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_desktop_overlay/2/full.distro" 277 | }, 278 | "deltas": [ 279 | { 280 | "host_version": [ 281 | 1, 282 | 0, 283 | 1137 284 | ], 285 | "module_version": 1, 286 | "package_sha256": "f4816a23e18db3812836b0c557cdfff9b9bd76ff49bf5b0281f95c1aec57b0a9", 287 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_desktop_overlay/2/from/1.0.1137/1" 288 | } 289 | ] 290 | }, 291 | "discord_vigilante": { 292 | "full": { 293 | "host_version": [ 294 | 1, 295 | 0, 296 | 1137 297 | ], 298 | "module_version": 1, 299 | "package_sha256": "5601145bae97b04c886471e08290ca185ed187a4f5bb59758c20359c7b5d1d48", 300 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_vigilante/1/full.distro" 301 | }, 302 | "deltas": [ 303 | { 304 | "host_version": [ 305 | 1, 306 | 0, 307 | 1136 308 | ], 309 | "module_version": 1, 310 | "package_sha256": "49c88f9b9d526f5ef3f2def73dcb2600dfc012d21fc5def7d6946cecbf2ee439", 311 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_vigilante/1/from/1.0.1136/1" 312 | } 313 | ] 314 | }, 315 | "discord_dispatch": { 316 | "full": { 317 | "host_version": [ 318 | 1, 319 | 0, 320 | 1137 321 | ], 322 | "module_version": 1, 323 | "package_sha256": "54b7d15868d4e85939810baacadcd1caeb9c1df89f064f8ed0eb4df71927a7f3", 324 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_dispatch/1/full.distro" 325 | }, 326 | "deltas": [ 327 | { 328 | "host_version": [ 329 | 1, 330 | 0, 331 | 1136 332 | ], 333 | "module_version": 1, 334 | "package_sha256": "b4fedd51bb61f566571e28eac0d89357bc57bc986268976eaff7edbfda36bf77", 335 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_dispatch/1/from/1.0.1136/1" 336 | } 337 | ] 338 | }, 339 | "discord_sekrit": { 340 | "full": { 341 | "host_version": [ 342 | 1, 343 | 0, 344 | 1137 345 | ], 346 | "module_version": 1, 347 | "package_sha256": "f5e30156903eac3a60801bb4d53dafd9031a39542f3e55459191871f03915b17", 348 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_sekrit/1/full.distro" 349 | }, 350 | "deltas": [ 351 | { 352 | "host_version": [ 353 | 1, 354 | 0, 355 | 1136 356 | ], 357 | "module_version": 1, 358 | "package_sha256": "aaa76e3f10cb00731cc6b8e2cfe56f35a060097ed7ba7ee4bcc36d7979833f09", 359 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_sekrit/1/from/1.0.1136/1" 360 | } 361 | ] 362 | }, 363 | "discord_modules": { 364 | "full": { 365 | "host_version": [ 366 | 1, 367 | 0, 368 | 1137 369 | ], 370 | "module_version": 1, 371 | "package_sha256": "d395dabda5b05a91339e5e0aba7f42d7d089805570832905b2422c0e783fb2f0", 372 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_modules/1/full.distro" 373 | }, 374 | "deltas": [ 375 | { 376 | "host_version": [ 377 | 1, 378 | 0, 379 | 1136 380 | ], 381 | "module_version": 1, 382 | "package_sha256": "df8e8f1ba9c1535d8f1903b21a1512836b195aa1ca974e31191b0a75f10f8212", 383 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_modules/1/from/1.0.1136/1" 384 | } 385 | ] 386 | }, 387 | "discord_spellcheck": { 388 | "full": { 389 | "host_version": [ 390 | 1, 391 | 0, 392 | 1137 393 | ], 394 | "module_version": 1, 395 | "package_sha256": "5afd3a3681cd29db2eb38b116fb4e1dd0739af78c0df08ac0131a8fd66a10427", 396 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_spellcheck/1/full.distro" 397 | }, 398 | "deltas": [ 399 | { 400 | "host_version": [ 401 | 1, 402 | 0, 403 | 1136 404 | ], 405 | "module_version": 1, 406 | "package_sha256": "3e926f9d486b568f39351a5448e6b69dc094b18a02582f46530e4921f1e428e1", 407 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_spellcheck/1/from/1.0.1136/1" 408 | } 409 | ] 410 | }, 411 | "discord_utils": { 412 | "full": { 413 | "host_version": [ 414 | 1, 415 | 0, 416 | 1137 417 | ], 418 | "module_version": 2, 419 | "package_sha256": "8aa75140401cf48a8f8ef367d42cf954cac6816832c508196bfba6e98f12daf5", 420 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_utils/2/full.distro" 421 | }, 422 | "deltas": [ 423 | { 424 | "host_version": [ 425 | 1, 426 | 0, 427 | 1137 428 | ], 429 | "module_version": 1, 430 | "package_sha256": "644fabc82e4309bfd34d0a0bbd3e376bd2055ec3aca35bbc2d35581768a541d7", 431 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_utils/2/from/1.0.1137/1" 432 | } 433 | ] 434 | }, 435 | "discord_voice": { 436 | "full": { 437 | "host_version": [ 438 | 1, 439 | 0, 440 | 1137 441 | ], 442 | "module_version": 2, 443 | "package_sha256": "66b98a1b59e238bfd790074f7245e75f56183de9733f8c836911f377e78a7e6c", 444 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_voice/2/full.distro" 445 | }, 446 | "deltas": [ 447 | { 448 | "host_version": [ 449 | 1, 450 | 0, 451 | 1137 452 | ], 453 | "module_version": 1, 454 | "package_sha256": "00c2913a2d07e3a4c9641104860a62944e57cce340049426e564be6cadeabbd3", 455 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/discord_voice/2/from/1.0.1137/1" 456 | } 457 | ] 458 | } 459 | }, 460 | "full": { 461 | "host_version": [ 462 | 1, 463 | 0, 464 | 1137 465 | ], 466 | "package_sha256": "a5f83f36ac0f771facfe2c185736c696e5d690986086fdb880cdc4297d70f570", 467 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/full.distro" 468 | }, 469 | "deltas": [ 470 | { 471 | "host_version": [ 472 | 1, 473 | 0, 474 | 1136 475 | ], 476 | "package_sha256": "f1c57d7dac2711a8ed9edec2e58b2a3869d819b14cda898e59ae49cff68064df", 477 | "url": "https://ptb.dl2.discordapp.net/distro/app/ptb/win/x64/1.0.1137/from/1.0.1136" 478 | } 479 | ], 480 | "required_modules": [ 481 | "discord_desktop_core", 482 | "discord_erlpack", 483 | "discord_spellcheck", 484 | "discord_utils", 485 | "discord_voice" 486 | ] 487 | } 488 | -------------------------------------------------------------------------------- /res/run.iss: -------------------------------------------------------------------------------- 1 | [Run] 2 | Filename: {app}\{#pappId}.exe; Description: Run {#pappName}; Flags: nowait postinstall skipifsilent unchecked 3 | -------------------------------------------------------------------------------- /res/setup-mini.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/portapps/discord-ptb-portable/fb1092a7aa90f3952aad5eba578c3f34417824a9/res/setup-mini.bmp -------------------------------------------------------------------------------- /tools/tools.go: -------------------------------------------------------------------------------- 1 | //go:build tools 2 | // +build tools 3 | 4 | // Package tools tracks dependencies on binaries not referenced in this codebase. 5 | // https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module 6 | package tools 7 | 8 | import ( 9 | _ "github.com/kevinburke/go-bindata/v4" 10 | _ "github.com/portapps/portapps/v3/tools" 11 | ) 12 | --------------------------------------------------------------------------------