├── .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 |
5 |
6 |
7 |
8 |
9 |
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 |
--------------------------------------------------------------------------------