forked from lug/matterbridge
Compare commits
358 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0f5274fdf6 | ||
|
|
2e2187ebf4 | ||
|
|
762c3350f4 | ||
|
|
e1a4d7f77e | ||
|
|
a7a4554a85 | ||
|
|
6bd808ce91 | ||
|
|
a5c143bc46 | ||
|
|
87c9cac756 | ||
|
|
6a047f8722 | ||
|
|
6523494e83 | ||
|
|
7c6ce8bb90 | ||
|
|
dafbfe4021 | ||
|
|
a4d5c94d9b | ||
|
|
7119e378a7 | ||
|
|
e1dc3032c1 | ||
|
|
5de03b8921 | ||
|
|
7631d43c48 | ||
|
|
d0b2ee5c85 | ||
|
|
8830a5a1df | ||
|
|
ee87626a93 | ||
|
|
9f15d38c1c | ||
|
|
4a96a977c0 | ||
|
|
9a95293bdf | ||
|
|
0b3a06d263 | ||
|
|
9a6249c4f5 | ||
|
|
50bd51e461 | ||
|
|
04f8013314 | ||
|
|
a0aaf0057a | ||
|
|
8e78b3e6be | ||
|
|
57a503818d | ||
|
|
25d2ff3e9b | ||
|
|
31902d3e57 | ||
|
|
16f3fa6bae | ||
|
|
1f706673cf | ||
|
|
fac5f69ad2 | ||
|
|
97c944bb63 | ||
|
|
d0c4fe78ee | ||
|
|
265457b451 | ||
|
|
4a4a29c9f6 | ||
|
|
0a91b9e1c9 | ||
|
|
f56163295c | ||
|
|
d1c87c068b | ||
|
|
fa20761110 | ||
|
|
e4a0e0a0e9 | ||
|
|
d30ae19e2a | ||
|
|
5c919e6bff | ||
|
|
434393d1c3 | ||
|
|
af9aa5d7cb | ||
|
|
05eb75442a | ||
|
|
3496ed0c7e | ||
|
|
1b89604c7a | ||
|
|
67a9d133e9 | ||
|
|
ed9118b346 | ||
|
|
59e55cfbd5 | ||
|
|
788d3b32ac | ||
|
|
1d414cf2fd | ||
|
|
cc3c168162 | ||
|
|
1ee6837f0e | ||
|
|
27dcea7c5b | ||
|
|
dcda7f7b8c | ||
|
|
e0cbb69a4f | ||
|
|
7ec95f786d | ||
|
|
1efe40add5 | ||
|
|
cbd73ee313 | ||
|
|
34227a7a39 | ||
|
|
71cb9b2d1d | ||
|
|
cd4c9b194f | ||
|
|
98762a0235 | ||
|
|
2fd1fd9573 | ||
|
|
aff3964078 | ||
|
|
2778580397 | ||
|
|
962062fe44 | ||
|
|
0578b21270 | ||
|
|
36a800c3f5 | ||
|
|
6d21f84187 | ||
|
|
f1e9833310 | ||
|
|
46f5acc4f9 | ||
|
|
95d4dcaeb3 | ||
|
|
64c542e614 | ||
|
|
13d081ea80 | ||
|
|
c0f9d86287 | ||
|
|
bcdecdaa73 | ||
|
|
daac3ebca2 | ||
|
|
639f9cf966 | ||
|
|
4fc48b5aa4 | ||
|
|
307ff77b42 | ||
|
|
9b500bc5f7 | ||
|
|
e313154134 | ||
|
|
27e94c438d | ||
|
|
58392876df | ||
|
|
115c4b1aa7 | ||
|
|
ba5649d259 | ||
|
|
1b30575510 | ||
|
|
7dbebd3ea7 | ||
|
|
6f18790352 | ||
|
|
d1e04a2ece | ||
|
|
bea0bbd0c2 | ||
|
|
0530503ef2 | ||
|
|
d1e8ff814b | ||
|
|
4f8ae761a2 | ||
|
|
b530e92834 | ||
|
|
b2a6777995 | ||
|
|
b461fc5e40 | ||
|
|
b7a8c6b60f | ||
|
|
41aa8ad799 | ||
|
|
7973baedd0 | ||
|
|
299b71d982 | ||
|
|
76aafe1fa8 | ||
|
|
95a0229aaf | ||
|
|
915a8fbad7 | ||
|
|
d4d7fef313 | ||
|
|
4e1dc9f885 | ||
|
|
155ae80d22 | ||
|
|
c7e336efd9 | ||
|
|
ac3c65a0cc | ||
|
|
df74df475b | ||
|
|
a61e2db7cb | ||
|
|
7aabe12acf | ||
|
|
c4b75e5754 | ||
|
|
6a7adb20a8 | ||
|
|
b49fb2b69c | ||
|
|
4bda29cb38 | ||
|
|
5f14141ec9 | ||
|
|
c088e45d85 | ||
|
|
d59c51a94b | ||
|
|
47b7fae61b | ||
|
|
1a40b0c1e9 | ||
|
|
27d886826c | ||
|
|
18981cb636 | ||
|
|
ffa8f65aa8 | ||
|
|
82588b00c5 | ||
|
|
603449e850 | ||
|
|
248d88c849 | ||
|
|
d19535fa21 | ||
|
|
49204cafcc | ||
|
|
812db2d267 | ||
|
|
14490bea9f | ||
|
|
0352970051 | ||
|
|
ed01820722 | ||
|
|
90a61f15cc | ||
|
|
86cd7f1ba6 | ||
|
|
d6ee55e35f | ||
|
|
aef64eec32 | ||
|
|
c4193d5ccd | ||
|
|
0c94186818 | ||
|
|
9039720013 | ||
|
|
a3470f8aec | ||
|
|
01badde21d | ||
|
|
a37b232dd9 | ||
|
|
579ee48385 | ||
|
|
dd985d1dad | ||
|
|
d2caea70a2 | ||
|
|
21143cf5ee | ||
|
|
dc2aed698d | ||
|
|
37c350f19f | ||
|
|
9e03fcf162 | ||
|
|
8d4521c1df | ||
|
|
9226252336 | ||
|
|
f4fb83e787 | ||
|
|
e7fcb25107 | ||
|
|
5a85258f74 | ||
|
|
2f7df2df43 | ||
|
|
ad3a753718 | ||
|
|
e45c551880 | ||
|
|
e59d338d4e | ||
|
|
7a86044f7a | ||
|
|
8b98f605bc | ||
|
|
7c773ebae0 | ||
|
|
e84417430d | ||
|
|
5a8d7b5f6d | ||
|
|
cfb8107138 | ||
|
|
43bd779fb7 | ||
|
|
7f9a400776 | ||
|
|
ce1c5873ac | ||
|
|
85ff1995fd | ||
|
|
b963f83c6a | ||
|
|
f6297ebbb0 | ||
|
|
a5259f56c5 | ||
|
|
3f75ed9c18 | ||
|
|
49ece51167 | ||
|
|
e77c3eb20a | ||
|
|
59b2a5f8d0 | ||
|
|
28710d0bc7 | ||
|
|
ad4d461606 | ||
|
|
67905089ba | ||
|
|
f2483af561 | ||
|
|
c28b87641e | ||
|
|
f8e6a69d6e | ||
|
|
54216cec4b | ||
|
|
12989bbd99 | ||
|
|
38d09dba2e | ||
|
|
fafd0c68e9 | ||
|
|
41195c8e48 | ||
|
|
a97804548e | ||
|
|
ba653c0841 | ||
|
|
5b191f78a0 | ||
|
|
83ef61287e | ||
|
|
3527e09bc5 | ||
|
|
ddc5b3268f | ||
|
|
22307b1934 | ||
|
|
bd97357f8d | ||
|
|
10dab1366e | ||
|
|
52fc94c1fe | ||
|
|
c1c7961dd6 | ||
|
|
d3eef051b1 | ||
|
|
57654df81e | ||
|
|
0f791d7a9a | ||
|
|
58779e0d65 | ||
|
|
4ac361b5fd | ||
|
|
1e2f27c061 | ||
|
|
0302e4da82 | ||
|
|
dc8743e0c0 | ||
|
|
cc5ce3d5ae | ||
|
|
caaf6f3012 | ||
|
|
c5de8fd1cc | ||
|
|
c9f23869e3 | ||
|
|
61208c0e35 | ||
|
|
dcffc74255 | ||
|
|
23e23be1a6 | ||
|
|
710427248a | ||
|
|
a868042de2 | ||
|
|
15296cd8b4 | ||
|
|
717023245f | ||
|
|
320be5bffa | ||
|
|
778abea2d9 | ||
|
|
835a1ac3a6 | ||
|
|
20a7ef33f1 | ||
|
|
e72612c7ff | ||
|
|
04e0f001b0 | ||
|
|
5db24aa901 | ||
|
|
aec5e3d77b | ||
|
|
335ddf8db5 | ||
|
|
4abaf2b236 | ||
|
|
183d212431 | ||
|
|
e99532fb89 | ||
|
|
4aa646f6b0 | ||
|
|
9dcd51fb80 | ||
|
|
6dee988b76 | ||
|
|
5af40db396 | ||
|
|
b3553bee7a | ||
|
|
ac19c94b9f | ||
|
|
845f7dc331 | ||
|
|
2adeae37e1 | ||
|
|
16eb12b2a0 | ||
|
|
8411f2aa32 | ||
|
|
e8acc49cbd | ||
|
|
4bed073c65 | ||
|
|
272735fb26 | ||
|
|
b75cf2c189 | ||
|
|
1aaa992250 | ||
|
|
6256c066f1 | ||
|
|
870b89a8f0 | ||
|
|
65ac96913c | ||
|
|
480945cb09 | ||
|
|
bfc7130ed8 | ||
|
|
a0938d9386 | ||
|
|
2338c69d40 | ||
|
|
c714501a0e | ||
|
|
a58a3e5000 | ||
|
|
ba35212b67 | ||
|
|
f3e0358de7 | ||
|
|
8064744d3a | ||
|
|
d261949db2 | ||
|
|
877f0fe2e8 | ||
|
|
003d85772c | ||
|
|
e7e10131de | ||
|
|
830361e48b | ||
|
|
1b1a9ce250 | ||
|
|
25ac4c708f | ||
|
|
c268e90f49 | ||
|
|
c17512b7ab | ||
|
|
1b837b3dc7 | ||
|
|
2ece724f75 | ||
|
|
276ac840aa | ||
|
|
1f91461853 | ||
|
|
1f9874102a | ||
|
|
822605c157 | ||
|
|
e49266ae43 | ||
|
|
62e9de1a3b | ||
|
|
2ddc4f7ae9 | ||
|
|
2dd402675d | ||
|
|
25b1af1e11 | ||
|
|
75fb2b8156 | ||
|
|
2a403f8b85 | ||
|
|
c3d45a9f06 | ||
|
|
c07b85b625 | ||
|
|
511f653e6e | ||
|
|
5636eaca6d | ||
|
|
4b839b9958 | ||
|
|
3f79da84d5 | ||
|
|
d540638223 | ||
|
|
4ec9b6dd4e | ||
|
|
3bc219167a | ||
|
|
8a55c97b4e | ||
|
|
9e34162a09 | ||
|
|
860a371eeb | ||
|
|
41a46526a1 | ||
|
|
46b798ac1b | ||
|
|
359d0f2910 | ||
|
|
ad3cb0386b | ||
|
|
3a183cb218 | ||
|
|
2eecaccd1c | ||
|
|
5f30a98bc1 | ||
|
|
b8a2fcbaff | ||
|
|
01496cd080 | ||
|
|
6a968ab82a | ||
|
|
c0c4890887 | ||
|
|
171a53592d | ||
|
|
7811c330db | ||
|
|
9bcd131e66 | ||
|
|
c791423dd5 | ||
|
|
80bdf38388 | ||
|
|
9d9cb32f4e | ||
|
|
87229bab13 | ||
|
|
f065e9e4d5 | ||
|
|
3812693111 | ||
|
|
dd3c572256 | ||
|
|
c5dfe40326 | ||
|
|
ef278301e3 | ||
|
|
2888fd64b0 | ||
|
|
27c0f37e49 | ||
|
|
0774f6a5e7 | ||
|
|
4036d4459b | ||
|
|
ee643de5b6 | ||
|
|
8c7549a09e | ||
|
|
7a16146304 | ||
|
|
3d3809a21b | ||
|
|
29465397dd | ||
|
|
d300bb1735 | ||
|
|
2e703472f1 | ||
|
|
8fede90b9e | ||
|
|
d128f157c4 | ||
|
|
4fcedabfd0 | ||
|
|
246c8e4f74 | ||
|
|
4d2207aba7 | ||
|
|
17b8b86d68 | ||
|
|
fdb57230a3 | ||
|
|
7469732bbc | ||
|
|
d1dd6c3440 | ||
|
|
02612c0061 | ||
|
|
a4db63a773 | ||
|
|
035c2b906a | ||
|
|
6ea8be5749 | ||
|
|
36024d5439 | ||
|
|
8d52c98373 | ||
|
|
b4a4eb0057 | ||
|
|
b469c8ddbd | ||
|
|
eee0036c7f | ||
|
|
89c66b9430 | ||
|
|
bd38319d83 | ||
|
|
33dffd5ea8 | ||
|
|
57176dadd4 | ||
|
|
dd449a8705 | ||
|
|
587ad9f41d | ||
|
|
a16ad8bf3b | ||
|
|
1e0490bd36 | ||
|
|
8afc641f0c | ||
|
|
2e4d58cb92 |
2
.github/ISSUE_TEMPLATE.md
vendored
2
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,3 +1,5 @@
|
||||
If you have a configuration problem, please first try to create a basic configuration following the instructions on [the wiki](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config) before filing an issue.
|
||||
|
||||
Please answer the following questions.
|
||||
|
||||
### Which version of matterbridge are you using?
|
||||
|
||||
49
.travis.yml
Normal file
49
.travis.yml
Normal file
@@ -0,0 +1,49 @@
|
||||
language: go
|
||||
go:
|
||||
#- 1.7.x
|
||||
- 1.9.x
|
||||
# - tip
|
||||
|
||||
# we have everything vendored
|
||||
install: true
|
||||
|
||||
env:
|
||||
- GOOS=linux GOARCH=amd64
|
||||
# - GOOS=windows GOARCH=amd64
|
||||
#- GOOS=linux GOARCH=arm
|
||||
|
||||
matrix:
|
||||
# It's ok if our code fails on unstable development versions of Go.
|
||||
allow_failures:
|
||||
- go: tip
|
||||
# Don't wait for tip tests to finish. Mark the test run green if the
|
||||
# tests pass on the stable versions of Go.
|
||||
fast_finish: true
|
||||
|
||||
notifications:
|
||||
email: false
|
||||
|
||||
before_script:
|
||||
- MY_VERSION=$(git describe --tags)
|
||||
- GO_FILES=$(find . -iname '*.go' | grep -v /vendor/) # All the .go files, excluding vendor/
|
||||
- PKGS=$(go list ./... | grep -v /vendor/) # All the import paths, excluding vendor/
|
||||
# - go get github.com/golang/lint/golint # Linter
|
||||
- go get honnef.co/go/tools/cmd/megacheck # Badass static analyzer/linter
|
||||
|
||||
# Anything in before_script: that returns a nonzero exit code will
|
||||
# flunk the build and immediately stop. It's sorta like having
|
||||
# set -e enabled in bash.
|
||||
script:
|
||||
- test -z $(gofmt -s -l $GO_FILES) # Fail if a .go file hasn't been formatted with gofmt
|
||||
- go test -v -race $PKGS # Run all the tests with the race detector enabled
|
||||
- go vet $PKGS # go vet is the official Go static analyzer
|
||||
- megacheck $PKGS # "go vet on steroids" + linter
|
||||
- /bin/bash ci/bintray.sh
|
||||
#- golint -set_exit_status $PKGS # one last linter
|
||||
|
||||
deploy:
|
||||
provider: bintray
|
||||
file: ci/deploy.json
|
||||
user: 42wim
|
||||
key:
|
||||
secure: "CeXXe6JOmt7HYR81MdWLua0ltQHhDdkIeRGBFbgd7hkb1wi8eF9DgpAcQrTso8NIlHNZmSAP46uhFgsRvkuezzX0ygalZ7DCJyAyn3sAMEh+UQSHV1WGThRehTtidqRGjetzsIGSwdrJOWil+XTfbO1Z8DGzfakhSuAZka8CM4BAoe3YeP9rYK8h+84x0GHfczvsLtXZ3mWLvQuwe4pK6+ItBCUg0ae7O7ZUpWHy0xQQkkWztY/6RAzXfaG7DuGjIw+20fhx3WOXRNpHCtZ6Bc3qERCpk0s1HhlQWlrN9wDaFTBWYwlvSnNgvxxMbNXJ6RrRJ0l0bA7FUswYwyroxhzrGLdzWDg8dHaQkypocngdalfhpsnoO9j3ApJhomUFJ3UoEq5nOGRUrKn8MPi+dP0zE4kNQ3e4VNa1ufNrvfpWolMg3xh8OXuhQdD5wIM5zFAbRJLqWSCVAjPq4DDPecmvXBOlIial7oa312lN5qnBnUjvAcxszZ+FUyDHT1Grxzna4tMwxY9obPzZUzm7359AOCCwIQFVB8GLqD2nwIstcXS0zGRz+fhviPipHuBa02q5bGUZwmkvrSNab0s8Jo7pCrel2Rz3nWPKaiCfq2WjbW1CLheSMkOQrjsdUd1hhbqNWFPUjJPInTc77NAKCfm5runv5uyowRLh4NNd0sI="
|
||||
115
README-0.6.md
115
README-0.6.md
@@ -1,115 +0,0 @@
|
||||
# matterbridge
|
||||
|
||||
Simple bridge between mattermost, IRC, XMPP, Gitter and Slack
|
||||
|
||||
* Relays public channel messages between mattermost, IRC, XMPP, Gitter and Slack. Pick and mix.
|
||||
* Supports multiple channels.
|
||||
* Matterbridge can also work with private groups on your mattermost.
|
||||
|
||||
Look at [matterbridge.conf.sample] (https://github.com/42wim/matterbridge/blob/master/matterbridge.conf.sample) for documentation and an example.
|
||||
|
||||
## Changelog
|
||||
Since v0.6.1 support for XMPP, Gitter and Slack is added. More details in [changelog.md] (https://github.com/42wim/matterbridge/blob/master/changelog.md)
|
||||
|
||||
## Requirements:
|
||||
Accounts to one of the supported bridges
|
||||
* [Mattermost] (https://github.com/mattermost/platform/)
|
||||
* [IRC] (http://www.mirc.com/servers.html)
|
||||
* [XMPP] (https://jabber.org)
|
||||
* [Gitter] (https://gitter.im)
|
||||
* [Slack] (https://www.slack.com)
|
||||
|
||||
## binaries
|
||||
Binaries can be found [here] (https://github.com/42wim/matterbridge/releases/)
|
||||
* For use with mattermost 3.3.0+ [v0.6.1](https://github.com/42wim/matterircd/releases/tag/v0.6.1)
|
||||
* For use with mattermost 3.0.0-3.2.0 [v0.5.0](https://github.com/42wim/matterircd/releases/tag/v0.5.0)
|
||||
|
||||
|
||||
## Docker
|
||||
Create your matterbridge.conf file locally eg in ```/tmp/matterbridge.conf```
|
||||
|
||||
```
|
||||
docker run -ti -v /tmp/matterbridge.conf:/matterbridge.conf 42wim/matterbridge:0.6.1
|
||||
```
|
||||
|
||||
## Compatibility
|
||||
### Mattermost
|
||||
* Matterbridge v0.6.1 works with mattermost 3.3.0 and higher [3.3.0 release](https://github.com/mattermost/platform/releases/tag/v3.3.0)
|
||||
* Matterbridge v0.5.0 works with mattermost 3.0.0 - 3.2.0 [3.2.0 release](https://github.com/mattermost/platform/releases/tag/v3.2.0)
|
||||
|
||||
|
||||
#### Webhooks version
|
||||
* Configured incoming/outgoing [webhooks](https://www.mattermost.org/webhooks/) on your mattermost instance.
|
||||
|
||||
#### Plus (API) version
|
||||
* A dedicated user(bot) on your mattermost instance.
|
||||
|
||||
|
||||
## building
|
||||
Go 1.6+ is required. Make sure you have [Go](https://golang.org/doc/install) properly installed, including setting up your [GOPATH] (https://golang.org/doc/code.html#GOPATH)
|
||||
|
||||
```
|
||||
cd $GOPATH
|
||||
go get github.com/42wim/matterbridge
|
||||
```
|
||||
|
||||
You should now have matterbridge binary in the bin directory:
|
||||
|
||||
```
|
||||
$ ls bin/
|
||||
matterbridge
|
||||
```
|
||||
|
||||
## running
|
||||
1) Copy the matterbridge.conf.sample to matterbridge.conf in the same directory as the matterbridge binary.
|
||||
2) Edit matterbridge.conf with the settings for your environment. See below for more config information.
|
||||
3) Now you can run matterbridge.
|
||||
|
||||
```
|
||||
Usage of ./matterbridge:
|
||||
-conf string
|
||||
config file (default "matterbridge.conf")
|
||||
-debug
|
||||
enable debug
|
||||
-plus
|
||||
running using API instead of webhooks (deprecated, set Plus flag in [general] config)
|
||||
-version
|
||||
show version
|
||||
```
|
||||
|
||||
## config
|
||||
### matterbridge
|
||||
matterbridge looks for matterbridge.conf in current directory. (use -conf to specify another file)
|
||||
|
||||
Look at [matterbridge.conf.sample] (https://github.com/42wim/matterbridge/blob/master/matterbridge.conf.sample) for an example.
|
||||
|
||||
### mattermost
|
||||
#### webhooks version
|
||||
You'll have to configure the incoming and outgoing webhooks.
|
||||
|
||||
* incoming webhooks
|
||||
Go to "account settings" - integrations - "incoming webhooks".
|
||||
Choose a channel at "Add a new incoming webhook", this will create a webhook URL right below.
|
||||
This URL should be set in the matterbridge.conf in the [mattermost] section (see above)
|
||||
|
||||
* outgoing webhooks
|
||||
Go to "account settings" - integrations - "outgoing webhooks".
|
||||
Choose a channel (the same as the one from incoming webhooks) and fill in the address and port of the server matterbridge will run on.
|
||||
|
||||
e.g. http://192.168.1.1:9999 (192.168.1.1:9999 is the BindAddress specified in [mattermost] section of matterbridge.conf)
|
||||
|
||||
#### plus version
|
||||
You'll have to create a new dedicated user on your mattermost instance.
|
||||
Specify the login and password in [mattermost] section of matterbridge.conf
|
||||
|
||||
## FAQ
|
||||
Please look at [matterbridge.conf.sample] (https://github.com/42wim/matterbridge/blob/master/matterbridge.conf.sample) for more information first.
|
||||
### Mattermost doesn't show the IRC nicks
|
||||
If you're running the webhooks version, this can be fixed by either:
|
||||
* enabling "override usernames". See [mattermost documentation](http://docs.mattermost.com/developer/webhooks-incoming.html#enabling-incoming-webhooks)
|
||||
* setting ```PrefixMessagesWithNick``` to ```true``` in ```mattermost``` section of your matterbridge.conf.
|
||||
|
||||
If you're running the plus version you'll need to:
|
||||
* setting ```PrefixMessagesWithNick``` to ```true``` in ```mattermost``` section of your matterbridge.conf.
|
||||
|
||||
Also look at the ```RemoteNickFormat``` setting.
|
||||
71
README.md
71
README.md
@@ -1,17 +1,25 @@
|
||||
# matterbridge
|
||||
[](https://gitter.im/42wim/matterbridge) [](https://webchat.freenode.net/?channels=matterbridgechat) [](https://discord.gg/AkKPtrQ) [](https://riot.im/app/#/room/#matterbridge:matrix.org)
|
||||
Click on one of the badges below to join the chat
|
||||
|
||||
[](https://gitter.im/42wim/matterbridge) [](https://webchat.freenode.net/?channels=matterbridgechat) [](https://discord.gg/AkKPtrQ) [](https://riot.im/app/#/room/#matterbridge:matrix.org) [](https://join.slack.com/matterbridgechat/shared_invite/MjEwODMxNjU1NDMwLTE0OTk2MTU3NTMtMzZkZmRiNDZhOA) [](https://framateam.org/signup_user_complete/?id=tfqm33ggop8x3qgu4boeieta6e) [](https://inverse.chat) [](https://www.twitch.tv/matterbridge)
|
||||
|
||||
[](https://github.com/42wim/matterbridge/releases/latest) [](https://bintray.com/42wim/nightly/Matterbridge/_latestVersion)
|
||||
|
||||

|
||||
|
||||
Simple bridge between Mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, Rocket.Chat, Hipchat(via xmpp) and Matrix with REST API.
|
||||
Simple bridge between Mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, Rocket.Chat, Hipchat(via xmpp), Matrix and Steam.
|
||||
Has a REST API.
|
||||
Minecraft server chat support via [MatterLink](https://github.com/elytra/MatterLink)
|
||||
|
||||
# Table of Contents
|
||||
* [Features](#features)
|
||||
* [Requirements](#requirements)
|
||||
* [Screenshots](https://github.com/42wim/matterbridge/wiki/)
|
||||
* [Installing](#installing)
|
||||
* [Binaries](#binaries)
|
||||
* [Building](#building)
|
||||
* [Configuration](#configuration)
|
||||
* [Howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config)
|
||||
* [Examples](#examples)
|
||||
* [Running](#running)
|
||||
* [Docker](#docker)
|
||||
@@ -20,15 +28,25 @@ Simple bridge between Mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, R
|
||||
* [Thanks](#thanks)
|
||||
|
||||
# Features
|
||||
* Relays public channel messages between multiple mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, Rocket.Chat, Hipchat (via xmpp) and Matrix. Pick and mix.
|
||||
* Matterbridge can also work with private groups on your mattermost/slack.
|
||||
* Relays public channel messages between multiple mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, Rocket.Chat, Hipchat (via xmpp), Matrix and Steam.
|
||||
Pick and mix.
|
||||
* Support private groups on your mattermost/slack.
|
||||
* Allow for bridging the same bridges, which means you can eg bridge between multiple mattermosts.
|
||||
* The bridge is now a gateway which has support multiple in and out bridges. (and supports multiple gateways).
|
||||
* Edits and delete messages across bridges that support it (mattermost,slack,discord,gitter,telegram)
|
||||
* REST API to read/post messages to bridges (WIP).
|
||||
|
||||
## API
|
||||
The API is very basic at the moment and rather undocumented.
|
||||
|
||||
Used by at least 2 projects. Feel free to make a PR to add your project to this list.
|
||||
|
||||
* [MatterLink](https://github.com/elytra/MatterLink) (Matterbridge link for Minecraft Server chat)
|
||||
* [pyCord](https://github.com/NikkyAI/pyCord) (crossplatform chatbot)
|
||||
|
||||
# Requirements
|
||||
Accounts to one of the supported bridges
|
||||
* [Mattermost](https://github.com/mattermost/platform/) 3.5.x - 3.7.x
|
||||
* [Mattermost](https://github.com/mattermost/platform/) 3.8.x - 3.10.x, 4.x
|
||||
* [IRC](http://www.mirc.com/servers.html)
|
||||
* [XMPP](https://jabber.org)
|
||||
* [Gitter](https://gitter.im)
|
||||
@@ -38,14 +56,19 @@ Accounts to one of the supported bridges
|
||||
* [Hipchat](https://www.hipchat.com)
|
||||
* [Rocket.chat](https://rocket.chat)
|
||||
* [Matrix](https://matrix.org)
|
||||
* [Steam](https://store.steampowered.com/)
|
||||
* [Twitch](https://twitch.tv)
|
||||
|
||||
# Screenshots
|
||||
See https://github.com/42wim/matterbridge/wiki
|
||||
|
||||
# Installing
|
||||
## Binaries
|
||||
Binaries can be found [here] (https://github.com/42wim/matterbridge/releases/)
|
||||
* Latest release [v0.10.3](https://github.com/42wim/matterbridge/releases/latest)
|
||||
* Latest stable release [v1.7.1](https://github.com/42wim/matterbridge/releases/latest)
|
||||
* Development releases (follows master) can be downloaded [here](https://dl.bintray.com/42wim/nightly/)
|
||||
|
||||
## Building
|
||||
Go 1.6+ is required. Make sure you have [Go](https://golang.org/doc/install) properly installed, including setting up your [GOPATH] (https://golang.org/doc/code.html#GOPATH)
|
||||
Go 1.8+ is required. Make sure you have [Go](https://golang.org/doc/install) properly installed, including setting up your [GOPATH] (https://golang.org/doc/code.html#GOPATH)
|
||||
|
||||
```
|
||||
cd $GOPATH
|
||||
@@ -60,8 +83,11 @@ matterbridge
|
||||
```
|
||||
|
||||
# Configuration
|
||||
## Basic configuration
|
||||
See [howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config) for a step by step walkthrough for creating your configuration.
|
||||
|
||||
## Advanced configuration
|
||||
* [matterbridge.toml.sample](https://github.com/42wim/matterbridge/blob/master/matterbridge.toml.sample) for documentation and an example.
|
||||
* [matterbridge.toml.simple](https://github.com/42wim/matterbridge/blob/master/matterbridge.toml.simple) for a simple example.
|
||||
|
||||
## Examples
|
||||
### Bridge mattermost (off-topic) - irc (#testing)
|
||||
@@ -73,12 +99,12 @@ matterbridge
|
||||
|
||||
[mattermost]
|
||||
[mattermost.work]
|
||||
useAPI=true
|
||||
Server="yourmattermostserver.tld"
|
||||
Team="yourteam"
|
||||
Login="yourlogin"
|
||||
Password="yourpass"
|
||||
PrefixMessagesWithNick=true
|
||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
|
||||
[[gateway]]
|
||||
name="mygateway"
|
||||
@@ -96,7 +122,6 @@ enable=true
|
||||
```
|
||||
[slack]
|
||||
[slack.test]
|
||||
useAPI=true
|
||||
Token="yourslacktoken"
|
||||
PrefixMessagesWithNick=true
|
||||
|
||||
@@ -122,11 +147,8 @@ RemoteNickFormat="[{PROTOCOL}/{BRIDGE}] <{NICK}> "
|
||||
```
|
||||
|
||||
# Running
|
||||
1) Copy the matterbridge.toml.sample to matterbridge.toml
|
||||
2) Edit matterbridge.toml with the settings for your environment.
|
||||
3) Now you can run matterbridge. (```./matterbridge```)
|
||||
|
||||
(Matterbridge will only look for the config file in your current directory, if it isn't there specify -conf "/path/toyour/matterbridge.toml")
|
||||
See [howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config) for a step by step walkthrough for creating your configuration.
|
||||
|
||||
```
|
||||
Usage of ./matterbridge:
|
||||
@@ -151,18 +173,11 @@ See [changelog.md](https://github.com/42wim/matterbridge/blob/master/changelog.m
|
||||
|
||||
# FAQ
|
||||
|
||||
Please look at [matterbridge.toml.sample](https://github.com/42wim/matterbridge/blob/master/matterbridge.toml.sample) for more information first.
|
||||
|
||||
## Mattermost doesn't show the IRC nicks
|
||||
If you're running the webhooks version, this can be fixed by either:
|
||||
* enabling "override usernames". See [mattermost documentation](http://docs.mattermost.com/developer/webhooks-incoming.html#enabling-incoming-webhooks)
|
||||
* setting ```PrefixMessagesWithNick``` to ```true``` in ```mattermost``` section of your matterbridge.toml.
|
||||
|
||||
If you're running the API version you'll need to:
|
||||
* setting ```PrefixMessagesWithNick``` to ```true``` in ```mattermost``` section of your matterbridge.toml.
|
||||
|
||||
Also look at the ```RemoteNickFormat``` setting.
|
||||
See [FAQ](https://github.com/42wim/matterbridge/wiki/FAQ)
|
||||
|
||||
Want to tip ?
|
||||
* eth: 0xb3f9b5387c66ad6be892bcb7bbc67862f3abc16f
|
||||
* btc: 1N7cKHj5SfqBHBzDJ6kad4BzeqUBBS2zhs
|
||||
|
||||
# Thanks
|
||||
Matterbridge wouldn't exist without these libraries:
|
||||
@@ -170,10 +185,10 @@ Matterbridge wouldn't exist without these libraries:
|
||||
* echo - https://github.com/labstack/echo
|
||||
* gitter - https://github.com/sromku/go-gitter
|
||||
* gops - https://github.com/google/gops
|
||||
* irc - https://github.com/thoj/go-ircevent
|
||||
* irc - https://github.com/lrstanley/girc
|
||||
* mattermost - https://github.com/mattermost/platform
|
||||
* matrix - https://github.com/matrix-org/gomatrix
|
||||
* slack - https://github.com/nlopes/slack
|
||||
* steam - https://github.com/Philipp15b/go-steam
|
||||
* telegram - https://github.com/go-telegram-bot-api/telegram-bot-api
|
||||
* xmpp - https://github.com/mattn/go-xmpp
|
||||
|
||||
|
||||
@@ -1,26 +1,29 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"github.com/labstack/echo"
|
||||
"github.com/labstack/echo/middleware"
|
||||
"github.com/zfjagann/golang-ring"
|
||||
"net/http"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Api struct {
|
||||
Config *config.Protocol
|
||||
Remote chan config.Message
|
||||
Account string
|
||||
Messages ring.Ring
|
||||
sync.RWMutex
|
||||
*config.BridgeConfig
|
||||
}
|
||||
|
||||
type ApiMessage struct {
|
||||
Text string `json:"text"`
|
||||
Username string `json:"username"`
|
||||
UserID string `json:"userid"`
|
||||
Avatar string `json:"avatar"`
|
||||
Gateway string `json:"gateway"`
|
||||
}
|
||||
|
||||
var flog *log.Entry
|
||||
@@ -30,18 +33,21 @@ func init() {
|
||||
flog = log.WithFields(log.Fields{"module": protocol})
|
||||
}
|
||||
|
||||
func New(cfg config.Protocol, account string, c chan config.Message) *Api {
|
||||
b := &Api{}
|
||||
func New(cfg *config.BridgeConfig) *Api {
|
||||
b := &Api{BridgeConfig: cfg}
|
||||
e := echo.New()
|
||||
b.Messages = ring.Ring{}
|
||||
b.Messages.SetCapacity(cfg.Buffer)
|
||||
b.Config = &cfg
|
||||
b.Account = account
|
||||
b.Remote = c
|
||||
b.Messages.SetCapacity(b.Config.Buffer)
|
||||
if b.Config.Token != "" {
|
||||
e.Use(middleware.KeyAuth(func(key string, c echo.Context) (bool, error) {
|
||||
return key == b.Config.Token, nil
|
||||
}))
|
||||
}
|
||||
e.GET("/api/messages", b.handleMessages)
|
||||
e.GET("/api/stream", b.handleStream)
|
||||
e.POST("/api/message", b.handlePostMessage)
|
||||
go func() {
|
||||
flog.Fatal(e.Start(cfg.BindAddress))
|
||||
flog.Fatal(e.Start(b.Config.BindAddress))
|
||||
}()
|
||||
return b
|
||||
}
|
||||
@@ -53,16 +59,20 @@ func (b *Api) Disconnect() error {
|
||||
return nil
|
||||
|
||||
}
|
||||
func (b *Api) JoinChannel(channel string) error {
|
||||
func (b *Api) JoinChannel(channel config.ChannelInfo) error {
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func (b *Api) Send(msg config.Message) error {
|
||||
func (b *Api) Send(msg config.Message) (string, error) {
|
||||
b.Lock()
|
||||
defer b.Unlock()
|
||||
// ignore delete messages
|
||||
if msg.Event == config.EVENT_MSG_DELETE {
|
||||
return "", nil
|
||||
}
|
||||
b.Messages.Enqueue(&msg)
|
||||
return nil
|
||||
return "", nil
|
||||
}
|
||||
|
||||
func (b *Api) handlePostMessage(c echo.Context) error {
|
||||
@@ -70,12 +80,16 @@ func (b *Api) handlePostMessage(c echo.Context) error {
|
||||
if err := c.Bind(message); err != nil {
|
||||
return err
|
||||
}
|
||||
flog.Debugf("Sending message from %s on %s to gateway", message.Username, "api")
|
||||
b.Remote <- config.Message{
|
||||
Text: message.Text,
|
||||
Username: message.Username,
|
||||
UserID: message.UserID,
|
||||
Channel: "api",
|
||||
Avatar: message.Avatar,
|
||||
Account: b.Account,
|
||||
Gateway: message.Gateway,
|
||||
Protocol: "api",
|
||||
}
|
||||
return c.JSON(http.StatusOK, message)
|
||||
}
|
||||
@@ -83,9 +97,28 @@ func (b *Api) handlePostMessage(c echo.Context) error {
|
||||
func (b *Api) handleMessages(c echo.Context) error {
|
||||
b.Lock()
|
||||
defer b.Unlock()
|
||||
for _, msg := range b.Messages.Values() {
|
||||
c.JSONPretty(http.StatusOK, msg, " ")
|
||||
}
|
||||
c.JSONPretty(http.StatusOK, b.Messages.Values(), " ")
|
||||
b.Messages = ring.Ring{}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Api) handleStream(c echo.Context) error {
|
||||
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
|
||||
c.Response().WriteHeader(http.StatusOK)
|
||||
closeNotifier := c.Response().CloseNotify()
|
||||
for {
|
||||
select {
|
||||
case <-closeNotifier:
|
||||
return nil
|
||||
default:
|
||||
msg := b.Messages.Dequeue()
|
||||
if msg != nil {
|
||||
if err := json.NewEncoder(c.Response()).Encode(msg); err != nil {
|
||||
return err
|
||||
}
|
||||
c.Response().Flush()
|
||||
}
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@ import (
|
||||
"github.com/42wim/matterbridge/bridge/mattermost"
|
||||
"github.com/42wim/matterbridge/bridge/rocketchat"
|
||||
"github.com/42wim/matterbridge/bridge/slack"
|
||||
"github.com/42wim/matterbridge/bridge/sshchat"
|
||||
"github.com/42wim/matterbridge/bridge/steam"
|
||||
"github.com/42wim/matterbridge/bridge/telegram"
|
||||
"github.com/42wim/matterbridge/bridge/xmpp"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
@@ -18,9 +20,9 @@ import (
|
||||
)
|
||||
|
||||
type Bridger interface {
|
||||
Send(msg config.Message) error
|
||||
Send(msg config.Message) (string, error)
|
||||
Connect() error
|
||||
JoinChannel(channel string) error
|
||||
JoinChannel(channel config.ChannelInfo) error
|
||||
Disconnect() error
|
||||
}
|
||||
|
||||
@@ -30,86 +32,80 @@ type Bridge struct {
|
||||
Name string
|
||||
Account string
|
||||
Protocol string
|
||||
ChannelsIn map[string]config.ChannelOptions
|
||||
ChannelsOut map[string]config.ChannelOptions
|
||||
Channels map[string]config.ChannelInfo
|
||||
Joined map[string]bool
|
||||
}
|
||||
|
||||
func New(cfg *config.Config, bridge *config.Bridge, c chan config.Message) *Bridge {
|
||||
b := new(Bridge)
|
||||
b.ChannelsIn = make(map[string]config.ChannelOptions)
|
||||
b.ChannelsOut = make(map[string]config.ChannelOptions)
|
||||
b.Channels = make(map[string]config.ChannelInfo)
|
||||
accInfo := strings.Split(bridge.Account, ".")
|
||||
protocol := accInfo[0]
|
||||
name := accInfo[1]
|
||||
b.Name = name
|
||||
b.Protocol = protocol
|
||||
b.Account = bridge.Account
|
||||
b.Joined = make(map[string]bool)
|
||||
bridgeConfig := &config.BridgeConfig{General: &cfg.General, Account: bridge.Account, Remote: c}
|
||||
|
||||
// override config from environment
|
||||
config.OverrideCfgFromEnv(cfg, protocol, name)
|
||||
switch protocol {
|
||||
case "mattermost":
|
||||
b.Config = cfg.Mattermost[name]
|
||||
b.Bridger = bmattermost.New(cfg.Mattermost[name], bridge.Account, c)
|
||||
bridgeConfig.Config = cfg.Mattermost[name]
|
||||
b.Bridger = bmattermost.New(bridgeConfig)
|
||||
case "irc":
|
||||
b.Config = cfg.IRC[name]
|
||||
b.Bridger = birc.New(cfg.IRC[name], bridge.Account, c)
|
||||
bridgeConfig.Config = cfg.IRC[name]
|
||||
b.Bridger = birc.New(bridgeConfig)
|
||||
case "gitter":
|
||||
b.Config = cfg.Gitter[name]
|
||||
b.Bridger = bgitter.New(cfg.Gitter[name], bridge.Account, c)
|
||||
bridgeConfig.Config = cfg.Gitter[name]
|
||||
b.Bridger = bgitter.New(bridgeConfig)
|
||||
case "slack":
|
||||
b.Config = cfg.Slack[name]
|
||||
b.Bridger = bslack.New(cfg.Slack[name], bridge.Account, c)
|
||||
bridgeConfig.Config = cfg.Slack[name]
|
||||
b.Bridger = bslack.New(bridgeConfig)
|
||||
case "xmpp":
|
||||
b.Config = cfg.Xmpp[name]
|
||||
b.Bridger = bxmpp.New(cfg.Xmpp[name], bridge.Account, c)
|
||||
bridgeConfig.Config = cfg.Xmpp[name]
|
||||
b.Bridger = bxmpp.New(bridgeConfig)
|
||||
case "discord":
|
||||
b.Config = cfg.Discord[name]
|
||||
b.Bridger = bdiscord.New(cfg.Discord[name], bridge.Account, c)
|
||||
bridgeConfig.Config = cfg.Discord[name]
|
||||
b.Bridger = bdiscord.New(bridgeConfig)
|
||||
case "telegram":
|
||||
b.Config = cfg.Telegram[name]
|
||||
b.Bridger = btelegram.New(cfg.Telegram[name], bridge.Account, c)
|
||||
bridgeConfig.Config = cfg.Telegram[name]
|
||||
b.Bridger = btelegram.New(bridgeConfig)
|
||||
case "rocketchat":
|
||||
b.Config = cfg.Rocketchat[name]
|
||||
b.Bridger = brocketchat.New(cfg.Rocketchat[name], bridge.Account, c)
|
||||
bridgeConfig.Config = cfg.Rocketchat[name]
|
||||
b.Bridger = brocketchat.New(bridgeConfig)
|
||||
case "matrix":
|
||||
b.Config = cfg.Matrix[name]
|
||||
b.Bridger = bmatrix.New(cfg.Matrix[name], bridge.Account, c)
|
||||
bridgeConfig.Config = cfg.Matrix[name]
|
||||
b.Bridger = bmatrix.New(bridgeConfig)
|
||||
case "steam":
|
||||
bridgeConfig.Config = cfg.Steam[name]
|
||||
b.Bridger = bsteam.New(bridgeConfig)
|
||||
case "sshchat":
|
||||
bridgeConfig.Config = cfg.Sshchat[name]
|
||||
b.Bridger = bsshchat.New(bridgeConfig)
|
||||
case "api":
|
||||
b.Config = cfg.Api[name]
|
||||
b.Bridger = api.New(cfg.Api[name], bridge.Account, c)
|
||||
bridgeConfig.Config = cfg.Api[name]
|
||||
b.Bridger = api.New(bridgeConfig)
|
||||
}
|
||||
b.Config = bridgeConfig.Config
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *Bridge) JoinChannels() error {
|
||||
exists := make(map[string]bool)
|
||||
err := b.joinChannels(b.ChannelsIn, exists)
|
||||
if err != nil {
|
||||
err := b.joinChannels(b.Channels, b.Joined)
|
||||
return err
|
||||
}
|
||||
err = b.joinChannels(b.ChannelsOut, exists)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bridge) joinChannels(cMap map[string]config.ChannelOptions, exists map[string]bool) error {
|
||||
mychannel := ""
|
||||
for channel, info := range cMap {
|
||||
if !exists[channel] {
|
||||
mychannel = channel
|
||||
log.Infof("%s: joining %s", b.Account, channel)
|
||||
if b.Protocol == "irc" && info.Key != "" {
|
||||
log.Debugf("using key %s for channel %s", info.Key, channel)
|
||||
mychannel = mychannel + " " + info.Key
|
||||
}
|
||||
err := b.JoinChannel(mychannel)
|
||||
func (b *Bridge) joinChannels(channels map[string]config.ChannelInfo, exists map[string]bool) error {
|
||||
for ID, channel := range channels {
|
||||
if !exists[ID] {
|
||||
log.Infof("%s: joining %s (%s)", b.Account, channel.Name, ID)
|
||||
err := b.JoinChannel(channel)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
exists[channel] = true
|
||||
exists[ID] = true
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -12,60 +12,109 @@ import (
|
||||
const (
|
||||
EVENT_JOIN_LEAVE = "join_leave"
|
||||
EVENT_FAILURE = "failure"
|
||||
EVENT_REJOIN_CHANNELS = "rejoin_channels"
|
||||
EVENT_USER_ACTION = "user_action"
|
||||
EVENT_MSG_DELETE = "msg_delete"
|
||||
)
|
||||
|
||||
type Message struct {
|
||||
Text string
|
||||
Channel string
|
||||
Username string
|
||||
Avatar string
|
||||
Text string `json:"text"`
|
||||
Channel string `json:"channel"`
|
||||
Username string `json:"username"`
|
||||
UserID string `json:"userid"` // userid on the bridge
|
||||
Avatar string `json:"avatar"`
|
||||
Account string `json:"account"`
|
||||
Event string `json:"event"`
|
||||
Protocol string `json:"protocol"`
|
||||
Gateway string `json:"gateway"`
|
||||
Timestamp time.Time `json:"timestamp"`
|
||||
ID string `json:"id"`
|
||||
Extra map[string][]interface{}
|
||||
}
|
||||
|
||||
type FileInfo struct {
|
||||
Name string
|
||||
Data *[]byte
|
||||
Comment string
|
||||
URL string
|
||||
}
|
||||
|
||||
type ChannelInfo struct {
|
||||
Name string
|
||||
Account string
|
||||
Event string
|
||||
Protocol string
|
||||
Timestamp time.Time
|
||||
Direction string
|
||||
ID string
|
||||
SameChannel map[string]bool
|
||||
Options ChannelOptions
|
||||
}
|
||||
|
||||
type Protocol struct {
|
||||
BindAddress string // mattermost, slack
|
||||
AuthCode string // steam
|
||||
BindAddress string // mattermost, slack // DEPRECATED
|
||||
Buffer int // api
|
||||
Charset string // irc
|
||||
Debug bool // general
|
||||
EditSuffix string // mattermost, slack, discord, telegram, gitter
|
||||
EditDisable bool // mattermost, slack, discord, telegram, gitter
|
||||
IconURL string // mattermost, slack
|
||||
IgnoreNicks string // all protocols
|
||||
IgnoreMessages string // all protocols
|
||||
Jid string // xmpp
|
||||
Login string // mattermost, matrix
|
||||
MediaDownloadSize int // all protocols
|
||||
MediaServerDownload string
|
||||
MediaServerUpload string
|
||||
MessageDelay int // IRC, time in millisecond to wait between messages
|
||||
MessageFormat string // telegram
|
||||
MessageLength int // IRC, max length of a message allowed
|
||||
MessageQueue int // IRC, size of message queue for flood control
|
||||
MessageSplit bool // IRC, split long messages with newlines on MessageLength instead of clipping
|
||||
Muc string // xmpp
|
||||
Name string // all protocols
|
||||
Nick string // all protocols
|
||||
NickFormatter string // mattermost, slack
|
||||
NickServNick string // IRC
|
||||
NickServUsername string // IRC
|
||||
NickServPassword string // IRC
|
||||
NicksPerRow int // mattermost, slack
|
||||
NoHomeServerSuffix bool // matrix
|
||||
NoTLS bool // mattermost
|
||||
Password string // IRC,mattermost,XMPP,matrix
|
||||
PrefixMessagesWithNick bool // mattemost, slack
|
||||
Protocol string //all protocols
|
||||
MessageQueue int // IRC, size of message queue for flood control
|
||||
MessageDelay int // IRC, time in millisecond to wait between messages
|
||||
MessageFormat string // telegram
|
||||
Protocol string // all protocols
|
||||
RejoinDelay int // IRC
|
||||
ReplaceMessages [][]string // all protocols
|
||||
ReplaceNicks [][]string // all protocols
|
||||
RemoteNickFormat string // all protocols
|
||||
Server string // IRC,mattermost,XMPP,discord
|
||||
ShowJoinPart bool // all protocols
|
||||
ShowEmbeds bool // discord
|
||||
SkipTLSVerify bool // IRC, mattermost
|
||||
StripNick bool // all protocols
|
||||
Team string // mattermost
|
||||
Token string // gitter, slack, discord
|
||||
URL string // mattermost, slack, matrix
|
||||
Token string // gitter, slack, discord, api
|
||||
URL string // mattermost, slack // DEPRECATED
|
||||
UseAPI bool // mattermost, slack
|
||||
UseSASL bool // IRC
|
||||
UseTLS bool // IRC
|
||||
UseFirstName bool // telegram
|
||||
UseUserName bool // discord
|
||||
UseInsecureURL bool // telegram
|
||||
WebhookBindAddress string // mattermost, slack
|
||||
WebhookURL string // mattermost, slack
|
||||
WebhookUse string // mattermost, slack, discord
|
||||
}
|
||||
|
||||
type ChannelOptions struct {
|
||||
Key string // irc
|
||||
WebhookURL string // discord
|
||||
}
|
||||
|
||||
type Bridge struct {
|
||||
Account string
|
||||
Channel string
|
||||
Options ChannelOptions
|
||||
SameChannel bool
|
||||
}
|
||||
|
||||
type Gateway struct {
|
||||
@@ -89,21 +138,55 @@ type Config struct {
|
||||
Mattermost map[string]Protocol
|
||||
Matrix map[string]Protocol
|
||||
Slack map[string]Protocol
|
||||
Steam map[string]Protocol
|
||||
Gitter map[string]Protocol
|
||||
Xmpp map[string]Protocol
|
||||
Discord map[string]Protocol
|
||||
Telegram map[string]Protocol
|
||||
Rocketchat map[string]Protocol
|
||||
Sshchat map[string]Protocol
|
||||
General Protocol
|
||||
Gateway []Gateway
|
||||
SameChannelGateway []SameChannelGateway
|
||||
}
|
||||
|
||||
type BridgeConfig struct {
|
||||
Config Protocol
|
||||
General *Protocol
|
||||
Account string
|
||||
Remote chan Message
|
||||
}
|
||||
|
||||
func NewConfig(cfgfile string) *Config {
|
||||
var cfg Config
|
||||
if _, err := toml.DecodeFile(cfgfile, &cfg); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
fail := false
|
||||
for k, v := range cfg.Mattermost {
|
||||
res := Deprecated(v, "mattermost."+k)
|
||||
if res {
|
||||
fail = res
|
||||
}
|
||||
}
|
||||
for k, v := range cfg.Slack {
|
||||
res := Deprecated(v, "slack."+k)
|
||||
if res {
|
||||
fail = res
|
||||
}
|
||||
}
|
||||
for k, v := range cfg.Rocketchat {
|
||||
res := Deprecated(v, "rocketchat."+k)
|
||||
if res {
|
||||
fail = res
|
||||
}
|
||||
}
|
||||
if fail {
|
||||
log.Fatalf("Fix your config. Please see changelog for more information")
|
||||
}
|
||||
if cfg.General.MediaDownloadSize == 0 {
|
||||
cfg.General.MediaDownloadSize = 1000000
|
||||
}
|
||||
return &cfg
|
||||
}
|
||||
|
||||
@@ -154,3 +237,17 @@ func GetIconURL(msg *Message, cfg *Protocol) string {
|
||||
iconURL = strings.Replace(iconURL, "{PROTOCOL}", protocol, -1)
|
||||
return iconURL
|
||||
}
|
||||
|
||||
func Deprecated(cfg Protocol, account string) bool {
|
||||
if cfg.BindAddress != "" {
|
||||
log.Printf("ERROR: %s BindAddress is deprecated, you need to change it to WebhookBindAddress.", account)
|
||||
} else if cfg.URL != "" {
|
||||
log.Printf("ERROR: %s URL is deprecated, you need to change it to WebhookURL.", account)
|
||||
} else if cfg.UseAPI {
|
||||
log.Printf("ERROR: %s UseAPI is deprecated, it's enabled by default, please remove it from your config file.", account)
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
//log.Fatalf("ERROR: Fix your config: %s", account)
|
||||
}
|
||||
|
||||
@@ -1,24 +1,27 @@
|
||||
package bdiscord
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"regexp"
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type bdiscord struct {
|
||||
c *discordgo.Session
|
||||
Config *config.Protocol
|
||||
Remote chan config.Message
|
||||
Account string
|
||||
Channels []*discordgo.Channel
|
||||
Nick string
|
||||
UseChannelID bool
|
||||
userMemberMap map[string]*discordgo.Member
|
||||
guildID string
|
||||
webhookID string
|
||||
webhookToken string
|
||||
channelInfoMap map[string]*config.ChannelInfo
|
||||
sync.RWMutex
|
||||
*config.BridgeConfig
|
||||
}
|
||||
|
||||
var flog *log.Entry
|
||||
@@ -28,18 +31,25 @@ func init() {
|
||||
flog = log.WithFields(log.Fields{"module": protocol})
|
||||
}
|
||||
|
||||
func New(cfg config.Protocol, account string, c chan config.Message) *bdiscord {
|
||||
b := &bdiscord{}
|
||||
b.Config = &cfg
|
||||
b.Remote = c
|
||||
b.Account = account
|
||||
func New(cfg *config.BridgeConfig) *bdiscord {
|
||||
b := &bdiscord{BridgeConfig: cfg}
|
||||
b.userMemberMap = make(map[string]*discordgo.Member)
|
||||
b.channelInfoMap = make(map[string]*config.ChannelInfo)
|
||||
if b.Config.WebhookURL != "" {
|
||||
flog.Debug("Configuring Discord Incoming Webhook")
|
||||
b.webhookID, b.webhookToken = b.splitURL(b.Config.WebhookURL)
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *bdiscord) Connect() error {
|
||||
var err error
|
||||
flog.Info("Connecting")
|
||||
if b.Config.WebhookURL == "" {
|
||||
flog.Info("Connecting using token")
|
||||
} else {
|
||||
flog.Info("Connecting using webhookurl (for posting) and token")
|
||||
}
|
||||
if !strings.HasPrefix(b.Config.Token, "Bot ") {
|
||||
b.Config.Token = "Bot " + b.Config.Token
|
||||
}
|
||||
@@ -51,12 +61,14 @@ func (b *bdiscord) Connect() error {
|
||||
flog.Info("Connection succeeded")
|
||||
b.c.AddHandler(b.messageCreate)
|
||||
b.c.AddHandler(b.memberUpdate)
|
||||
b.c.AddHandler(b.messageUpdate)
|
||||
b.c.AddHandler(b.messageDelete)
|
||||
err = b.c.Open()
|
||||
if err != nil {
|
||||
flog.Debugf("%#v", err)
|
||||
return err
|
||||
}
|
||||
guilds, err := b.c.UserGuilds()
|
||||
guilds, err := b.c.UserGuilds(100, "", "")
|
||||
if err != nil {
|
||||
flog.Debugf("%#v", err)
|
||||
return err
|
||||
@@ -84,23 +96,105 @@ func (b *bdiscord) Disconnect() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *bdiscord) JoinChannel(channel string) error {
|
||||
idcheck := strings.Split(channel, "ID:")
|
||||
func (b *bdiscord) JoinChannel(channel config.ChannelInfo) error {
|
||||
b.channelInfoMap[channel.ID] = &channel
|
||||
idcheck := strings.Split(channel.Name, "ID:")
|
||||
if len(idcheck) > 1 {
|
||||
b.UseChannelID = true
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *bdiscord) Send(msg config.Message) error {
|
||||
func (b *bdiscord) Send(msg config.Message) (string, error) {
|
||||
flog.Debugf("Receiving %#v", msg)
|
||||
channelID := b.getChannelID(msg.Channel)
|
||||
if channelID == "" {
|
||||
flog.Errorf("Could not find channelID for %v", msg.Channel)
|
||||
return nil
|
||||
return "", nil
|
||||
}
|
||||
if msg.Event == config.EVENT_USER_ACTION {
|
||||
msg.Text = "_" + msg.Text + "_"
|
||||
}
|
||||
|
||||
wID := b.webhookID
|
||||
wToken := b.webhookToken
|
||||
if ci, ok := b.channelInfoMap[msg.Channel+b.Account]; ok {
|
||||
if ci.Options.WebhookURL != "" {
|
||||
wID, wToken = b.splitURL(ci.Options.WebhookURL)
|
||||
}
|
||||
}
|
||||
|
||||
if wID == "" {
|
||||
flog.Debugf("Broadcasting using token (API)")
|
||||
if msg.Event == config.EVENT_MSG_DELETE {
|
||||
if msg.ID == "" {
|
||||
return "", nil
|
||||
}
|
||||
err := b.c.ChannelMessageDelete(channelID, msg.ID)
|
||||
return "", err
|
||||
}
|
||||
if msg.ID != "" {
|
||||
_, err := b.c.ChannelMessageEdit(channelID, msg.ID, msg.Username+msg.Text)
|
||||
return msg.ID, err
|
||||
}
|
||||
|
||||
if msg.Extra != nil {
|
||||
// check if we have files to upload (from slack, telegram or mattermost)
|
||||
if len(msg.Extra["file"]) > 0 {
|
||||
var err error
|
||||
for _, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
files := []*discordgo.File{}
|
||||
files = append(files, &discordgo.File{fi.Name, "", bytes.NewReader(*fi.Data)})
|
||||
_, err = b.c.ChannelMessageSendComplex(channelID, &discordgo.MessageSend{Content: msg.Username + fi.Comment, Files: files})
|
||||
if err != nil {
|
||||
flog.Errorf("file upload failed: %#v", err)
|
||||
}
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
}
|
||||
|
||||
res, err := b.c.ChannelMessageSend(channelID, msg.Username+msg.Text)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return res.ID, err
|
||||
}
|
||||
flog.Debugf("Broadcasting using Webhook")
|
||||
err := b.c.WebhookExecute(
|
||||
wID,
|
||||
wToken,
|
||||
true,
|
||||
&discordgo.WebhookParams{
|
||||
Content: msg.Text,
|
||||
Username: msg.Username,
|
||||
AvatarURL: msg.Avatar,
|
||||
})
|
||||
return "", err
|
||||
}
|
||||
|
||||
func (b *bdiscord) messageDelete(s *discordgo.Session, m *discordgo.MessageDelete) {
|
||||
rmsg := config.Message{Account: b.Account, ID: m.ID, Event: config.EVENT_MSG_DELETE, Text: config.EVENT_MSG_DELETE}
|
||||
rmsg.Channel = b.getChannelName(m.ChannelID)
|
||||
if b.UseChannelID {
|
||||
rmsg.Channel = "ID:" + m.ChannelID
|
||||
}
|
||||
flog.Debugf("Sending message from %s to gateway", b.Account)
|
||||
flog.Debugf("Message is %#v", rmsg)
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
|
||||
func (b *bdiscord) messageUpdate(s *discordgo.Session, m *discordgo.MessageUpdate) {
|
||||
if b.Config.EditDisable {
|
||||
return
|
||||
}
|
||||
// only when message is actually edited
|
||||
if m.Message.EditedTimestamp != "" {
|
||||
flog.Debugf("Sending edit message")
|
||||
m.Content = m.Content + b.Config.EditSuffix
|
||||
b.messageCreate(s, (*discordgo.MessageCreate)(m))
|
||||
}
|
||||
b.c.ChannelMessageSend(channelID, msg.Username+msg.Text)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
|
||||
@@ -108,25 +202,62 @@ func (b *bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreat
|
||||
if m.Author.Username == b.Nick {
|
||||
return
|
||||
}
|
||||
// if using webhooks, do not relay if it's ours
|
||||
if b.useWebhook() && m.Author.Bot && b.isWebhookID(m.Author.ID) {
|
||||
return
|
||||
}
|
||||
|
||||
if len(m.Attachments) > 0 {
|
||||
for _, attach := range m.Attachments {
|
||||
m.Content = m.Content + "\n" + attach.URL
|
||||
}
|
||||
}
|
||||
if m.Content == "" {
|
||||
return
|
||||
}
|
||||
flog.Debugf("Sending message from %s on %s to gateway", m.Author.Username, b.Account)
|
||||
channelName := b.getChannelName(m.ChannelID)
|
||||
if b.UseChannelID {
|
||||
channelName = "ID:" + m.ChannelID
|
||||
}
|
||||
username := b.getNick(m.Author)
|
||||
|
||||
var text string
|
||||
if m.Content != "" {
|
||||
flog.Debugf("Receiving message %#v", m.Message)
|
||||
if len(m.MentionRoles) > 0 {
|
||||
m.Message.Content = b.replaceRoleMentions(m.Message.Content)
|
||||
}
|
||||
b.Remote <- config.Message{Username: username, Text: m.ContentWithMentionsReplaced(), Channel: channelName,
|
||||
Account: b.Account, Avatar: "https://cdn.discordapp.com/avatars/" + m.Author.ID + "/" + m.Author.Avatar + ".jpg"}
|
||||
m.Message.Content = b.stripCustomoji(m.Message.Content)
|
||||
m.Message.Content = b.replaceChannelMentions(m.Message.Content)
|
||||
text = m.ContentWithMentionsReplaced()
|
||||
}
|
||||
|
||||
rmsg := config.Message{Account: b.Account, Avatar: "https://cdn.discordapp.com/avatars/" + m.Author.ID + "/" + m.Author.Avatar + ".jpg",
|
||||
UserID: m.Author.ID, ID: m.ID}
|
||||
|
||||
rmsg.Channel = b.getChannelName(m.ChannelID)
|
||||
if b.UseChannelID {
|
||||
rmsg.Channel = "ID:" + m.ChannelID
|
||||
}
|
||||
|
||||
if !b.Config.UseUserName {
|
||||
rmsg.Username = b.getNick(m.Author)
|
||||
} else {
|
||||
rmsg.Username = m.Author.Username
|
||||
}
|
||||
|
||||
if b.Config.ShowEmbeds && m.Message.Embeds != nil {
|
||||
for _, embed := range m.Message.Embeds {
|
||||
text = text + "embed: " + embed.Title + " - " + embed.Description + " - " + embed.URL + "\n"
|
||||
}
|
||||
}
|
||||
|
||||
// no empty messages
|
||||
if text == "" {
|
||||
return
|
||||
}
|
||||
|
||||
text, ok := b.replaceAction(text)
|
||||
if ok {
|
||||
rmsg.Event = config.EVENT_USER_ACTION
|
||||
}
|
||||
|
||||
rmsg.Text = text
|
||||
flog.Debugf("Sending message from %s on %s to gateway", m.Author.Username, b.Account)
|
||||
flog.Debugf("Message is %#v", rmsg)
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
|
||||
func (b *bdiscord) memberUpdate(s *discordgo.Session, m *discordgo.GuildMemberUpdate) {
|
||||
@@ -143,6 +274,7 @@ func (b *bdiscord) getNick(user *discordgo.User) string {
|
||||
b.Lock()
|
||||
defer b.Unlock()
|
||||
if _, ok := b.userMemberMap[user.ID]; ok {
|
||||
if b.userMemberMap[user.ID] != nil {
|
||||
if b.userMemberMap[user.ID].Nick != "" {
|
||||
// only return if nick is set
|
||||
return b.userMemberMap[user.ID].Nick
|
||||
@@ -150,11 +282,13 @@ func (b *bdiscord) getNick(user *discordgo.User) string {
|
||||
// otherwise return username
|
||||
return user.Username
|
||||
}
|
||||
}
|
||||
// if we didn't find nick, search for it
|
||||
b.userMemberMap[user.ID], err = b.c.GuildMember(b.guildID, user.ID)
|
||||
member, err := b.c.GuildMember(b.guildID, user.ID)
|
||||
if err != nil {
|
||||
return user.Username
|
||||
}
|
||||
b.userMemberMap[user.ID] = member
|
||||
// only return if nick is set
|
||||
if b.userMemberMap[user.ID].Nick != "" {
|
||||
return b.userMemberMap[user.ID].Nick
|
||||
@@ -195,3 +329,73 @@ func (b *bdiscord) replaceRoleMentions(text string) string {
|
||||
}
|
||||
return text
|
||||
}
|
||||
|
||||
func (b *bdiscord) replaceChannelMentions(text string) string {
|
||||
var err error
|
||||
re := regexp.MustCompile("<#[0-9]+>")
|
||||
text = re.ReplaceAllStringFunc(text, func(m string) string {
|
||||
channel := b.getChannelName(m[2 : len(m)-1])
|
||||
// if at first don't succeed, try again
|
||||
if channel == "" {
|
||||
b.Channels, err = b.c.GuildChannels(b.guildID)
|
||||
if err != nil {
|
||||
return "#unknownchannel"
|
||||
}
|
||||
channel = b.getChannelName(m[2 : len(m)-1])
|
||||
return "#" + channel
|
||||
}
|
||||
return "#" + channel
|
||||
})
|
||||
return text
|
||||
}
|
||||
|
||||
func (b *bdiscord) replaceAction(text string) (string, bool) {
|
||||
if strings.HasPrefix(text, "_") && strings.HasSuffix(text, "_") {
|
||||
return strings.Replace(text, "_", "", -1), true
|
||||
}
|
||||
return text, false
|
||||
}
|
||||
|
||||
func (b *bdiscord) stripCustomoji(text string) string {
|
||||
// <:doge:302803592035958784>
|
||||
re := regexp.MustCompile("<(:.*?:)[0-9]+>")
|
||||
return re.ReplaceAllString(text, `$1`)
|
||||
}
|
||||
|
||||
// splitURL splits a webhookURL and returns the id and token
|
||||
func (b *bdiscord) splitURL(url string) (string, string) {
|
||||
webhookURLSplit := strings.Split(url, "/")
|
||||
return webhookURLSplit[len(webhookURLSplit)-2], webhookURLSplit[len(webhookURLSplit)-1]
|
||||
}
|
||||
|
||||
// useWebhook returns true if we have a webhook defined somewhere
|
||||
func (b *bdiscord) useWebhook() bool {
|
||||
if b.Config.WebhookURL != "" {
|
||||
return true
|
||||
}
|
||||
for _, channel := range b.channelInfoMap {
|
||||
if channel.Options.WebhookURL != "" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// isWebhookID returns true if the specified id is used in a defined webhook
|
||||
func (b *bdiscord) isWebhookID(id string) bool {
|
||||
if b.Config.WebhookURL != "" {
|
||||
wID, _ := b.splitURL(b.Config.WebhookURL)
|
||||
if wID == id {
|
||||
return true
|
||||
}
|
||||
}
|
||||
for _, channel := range b.channelInfoMap {
|
||||
if channel.Options.WebhookURL != "" {
|
||||
wID, _ := b.splitURL(channel.Options.WebhookURL)
|
||||
if wID == id {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -2,19 +2,18 @@ package bgitter
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/42wim/go-gitter"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"github.com/sromku/go-gitter"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Bgitter struct {
|
||||
c *gitter.Gitter
|
||||
Config *config.Protocol
|
||||
Remote chan config.Message
|
||||
Account string
|
||||
User *gitter.User
|
||||
Users []gitter.User
|
||||
Rooms []gitter.Room
|
||||
*config.BridgeConfig
|
||||
}
|
||||
|
||||
var flog *log.Entry
|
||||
@@ -24,19 +23,15 @@ func init() {
|
||||
flog = log.WithFields(log.Fields{"module": protocol})
|
||||
}
|
||||
|
||||
func New(cfg config.Protocol, account string, c chan config.Message) *Bgitter {
|
||||
b := &Bgitter{}
|
||||
b.Config = &cfg
|
||||
b.Remote = c
|
||||
b.Account = account
|
||||
return b
|
||||
func New(cfg *config.BridgeConfig) *Bgitter {
|
||||
return &Bgitter{BridgeConfig: cfg}
|
||||
}
|
||||
|
||||
func (b *Bgitter) Connect() error {
|
||||
var err error
|
||||
flog.Info("Connecting")
|
||||
b.c = gitter.New(b.Config.Token)
|
||||
_, err = b.c.GetUser()
|
||||
b.User, err = b.c.GetUser()
|
||||
if err != nil {
|
||||
flog.Debugf("%#v", err)
|
||||
return err
|
||||
@@ -51,10 +46,10 @@ func (b *Bgitter) Disconnect() error {
|
||||
|
||||
}
|
||||
|
||||
func (b *Bgitter) JoinChannel(channel string) error {
|
||||
roomID, err := b.c.GetRoomId(channel)
|
||||
func (b *Bgitter) JoinChannel(channel config.ChannelInfo) error {
|
||||
roomID, err := b.c.GetRoomId(channel.Name)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not find roomID for %v. Please create the room on gitter.im", channel)
|
||||
return fmt.Errorf("Could not find roomID for %v. Please create the room on gitter.im", channel.Name)
|
||||
}
|
||||
room, err := b.c.GetRoom(roomID)
|
||||
if err != nil {
|
||||
@@ -78,29 +73,74 @@ func (b *Bgitter) JoinChannel(channel string) error {
|
||||
for event := range stream.Event {
|
||||
switch ev := event.Data.(type) {
|
||||
case *gitter.MessageReceived:
|
||||
// check for ZWSP to see if it's not an echo
|
||||
if !strings.HasSuffix(ev.Message.Text, "") {
|
||||
if ev.Message.From.ID != b.User.ID {
|
||||
flog.Debugf("Sending message from %s on %s to gateway", ev.Message.From.Username, b.Account)
|
||||
b.Remote <- config.Message{Username: ev.Message.From.Username, Text: ev.Message.Text, Channel: room,
|
||||
Account: b.Account, Avatar: b.getAvatar(ev.Message.From.Username)}
|
||||
rmsg := config.Message{Username: ev.Message.From.Username, Text: ev.Message.Text, Channel: room,
|
||||
Account: b.Account, Avatar: b.getAvatar(ev.Message.From.Username), UserID: ev.Message.From.ID,
|
||||
ID: ev.Message.ID}
|
||||
if strings.HasPrefix(ev.Message.Text, "@"+ev.Message.From.Username) {
|
||||
rmsg.Event = config.EVENT_USER_ACTION
|
||||
rmsg.Text = strings.Replace(rmsg.Text, "@"+ev.Message.From.Username+" ", "", -1)
|
||||
}
|
||||
flog.Debugf("Message is %#v", rmsg)
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
case *gitter.GitterConnectionClosed:
|
||||
flog.Errorf("connection with gitter closed for room %s", room)
|
||||
}
|
||||
}
|
||||
}(stream, room.Name)
|
||||
}(stream, room.URI)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bgitter) Send(msg config.Message) error {
|
||||
func (b *Bgitter) Send(msg config.Message) (string, error) {
|
||||
flog.Debugf("Receiving %#v", msg)
|
||||
roomID := b.getRoomID(msg.Channel)
|
||||
if roomID == "" {
|
||||
flog.Errorf("Could not find roomID for %v", msg.Channel)
|
||||
return nil
|
||||
return "", nil
|
||||
}
|
||||
// add ZWSP because gitter echoes our own messages
|
||||
return b.c.SendMessage(roomID, msg.Username+msg.Text+" ")
|
||||
if msg.Event == config.EVENT_MSG_DELETE {
|
||||
if msg.ID == "" {
|
||||
return "", nil
|
||||
}
|
||||
// gitter has no delete message api
|
||||
_, err := b.c.UpdateMessage(roomID, msg.ID, "")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
if msg.ID != "" {
|
||||
flog.Debugf("updating message with id %s", msg.ID)
|
||||
_, err := b.c.UpdateMessage(roomID, msg.ID, msg.Username+msg.Text)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
|
||||
if msg.Extra != nil {
|
||||
if len(msg.Extra["file"]) > 0 {
|
||||
for _, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
if fi.URL != "" {
|
||||
msg.Text = fi.URL
|
||||
}
|
||||
_, err := b.c.SendMessage(roomID, msg.Username+msg.Text)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
}
|
||||
|
||||
resp, err := b.c.SendMessage(roomID, msg.Username+msg.Text)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return resp.ID, nil
|
||||
}
|
||||
|
||||
func (b *Bgitter) getRoomID(channel string) string {
|
||||
|
||||
40
bridge/helper/helper.go
Normal file
40
bridge/helper/helper.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package helper
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
func DownloadFile(url string) (*[]byte, error) {
|
||||
var buf bytes.Buffer
|
||||
client := &http.Client{
|
||||
Timeout: time.Second * 5,
|
||||
}
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
resp.Body.Close()
|
||||
return nil, err
|
||||
}
|
||||
io.Copy(&buf, resp.Body)
|
||||
data := buf.Bytes()
|
||||
resp.Body.Close()
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func SplitStringLength(input string, length int) string {
|
||||
a := []rune(input)
|
||||
str := ""
|
||||
for i, r := range a {
|
||||
str = str + string(r)
|
||||
if i > 0 && (i+1)%length == 0 {
|
||||
str += "\n"
|
||||
}
|
||||
}
|
||||
return str
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
/*
|
||||
func tableformatter(nicks []string, nicksPerRow int, continued bool) string {
|
||||
result := "|IRC users"
|
||||
if continued {
|
||||
@@ -29,6 +30,7 @@ func tableformatter(nicks []string, nicksPerRow int, continued bool) string {
|
||||
}
|
||||
return result
|
||||
}
|
||||
*/
|
||||
|
||||
func plainformatter(nicks []string, nicksPerRow int) string {
|
||||
return strings.Join(nicks, ", ") + " currently on IRC"
|
||||
|
||||
@@ -1,12 +1,19 @@
|
||||
package birc
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/42wim/matterbridge/bridge/helper"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
ircm "github.com/sorcix/irc"
|
||||
"github.com/thoj/go-ircevent"
|
||||
"github.com/lrstanley/girc"
|
||||
"github.com/paulrosania/go-charset/charset"
|
||||
_ "github.com/paulrosania/go-charset/data"
|
||||
"github.com/saintfish/chardet"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strconv"
|
||||
@@ -15,14 +22,14 @@ import (
|
||||
)
|
||||
|
||||
type Birc struct {
|
||||
i *irc.Connection
|
||||
i *girc.Client
|
||||
Nick string
|
||||
names map[string][]string
|
||||
Config *config.Protocol
|
||||
Remote chan config.Message
|
||||
connected chan struct{}
|
||||
Local chan config.Message // local queue for flood control
|
||||
Account string
|
||||
FirstConnection bool
|
||||
|
||||
*config.BridgeConfig
|
||||
}
|
||||
|
||||
var flog *log.Entry
|
||||
@@ -32,13 +39,11 @@ func init() {
|
||||
flog = log.WithFields(log.Fields{"module": protocol})
|
||||
}
|
||||
|
||||
func New(cfg config.Protocol, account string, c chan config.Message) *Birc {
|
||||
func New(cfg *config.BridgeConfig) *Birc {
|
||||
b := &Birc{}
|
||||
b.Config = &cfg
|
||||
b.BridgeConfig = cfg
|
||||
b.Nick = b.Config.Nick
|
||||
b.Remote = c
|
||||
b.names = make(map[string][]string)
|
||||
b.Account = account
|
||||
b.connected = make(chan struct{})
|
||||
if b.Config.MessageDelay == 0 {
|
||||
b.Config.MessageDelay = 1300
|
||||
@@ -46,15 +51,19 @@ func New(cfg config.Protocol, account string, c chan config.Message) *Birc {
|
||||
if b.Config.MessageQueue == 0 {
|
||||
b.Config.MessageQueue = 30
|
||||
}
|
||||
if b.Config.MessageLength == 0 {
|
||||
b.Config.MessageLength = 400
|
||||
}
|
||||
b.FirstConnection = true
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *Birc) Command(msg *config.Message) string {
|
||||
switch msg.Text {
|
||||
case "!users":
|
||||
b.i.AddCallback(ircm.RPL_NAMREPLY, b.storeNames)
|
||||
b.i.AddCallback(ircm.RPL_ENDOFNAMES, b.endNames)
|
||||
b.i.SendRaw("NAMES " + msg.Channel)
|
||||
b.i.Handlers.Add(girc.RPL_NAMREPLY, b.storeNames)
|
||||
b.i.Handlers.Add(girc.RPL_ENDOFNAMES, b.endNames)
|
||||
b.i.Cmd.SendRaw("NAMES " + msg.Channel)
|
||||
}
|
||||
return ""
|
||||
}
|
||||
@@ -62,23 +71,60 @@ func (b *Birc) Command(msg *config.Message) string {
|
||||
func (b *Birc) Connect() error {
|
||||
b.Local = make(chan config.Message, b.Config.MessageQueue+10)
|
||||
flog.Infof("Connecting %s", b.Config.Server)
|
||||
i := irc.IRC(b.Config.Nick, b.Config.Nick)
|
||||
if log.GetLevel() == log.DebugLevel {
|
||||
i.Debug = true
|
||||
}
|
||||
i.UseTLS = b.Config.UseTLS
|
||||
i.UseSASL = b.Config.UseSASL
|
||||
i.SASLLogin = b.Config.NickServNick
|
||||
i.SASLPassword = b.Config.NickServPassword
|
||||
i.TLSConfig = &tls.Config{InsecureSkipVerify: b.Config.SkipTLSVerify}
|
||||
if b.Config.Password != "" {
|
||||
i.Password = b.Config.Password
|
||||
}
|
||||
i.AddCallback(ircm.RPL_WELCOME, b.handleNewConnection)
|
||||
err := i.Connect(b.Config.Server)
|
||||
server, portstr, err := net.SplitHostPort(b.Config.Server)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
port, err := strconv.Atoi(portstr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// fix strict user handling of girc
|
||||
user := b.Config.Nick
|
||||
for !girc.IsValidUser(user) {
|
||||
if len(user) == 1 {
|
||||
user = "matterbridge"
|
||||
break
|
||||
}
|
||||
user = user[1:]
|
||||
}
|
||||
|
||||
i := girc.New(girc.Config{
|
||||
Server: server,
|
||||
ServerPass: b.Config.Password,
|
||||
Port: port,
|
||||
Nick: b.Config.Nick,
|
||||
User: user,
|
||||
Name: b.Config.Nick,
|
||||
SSL: b.Config.UseTLS,
|
||||
TLSConfig: &tls.Config{InsecureSkipVerify: b.Config.SkipTLSVerify, ServerName: server},
|
||||
PingDelay: time.Minute,
|
||||
})
|
||||
|
||||
if b.Config.UseSASL {
|
||||
i.Config.SASL = &girc.SASLPlain{b.Config.NickServNick, b.Config.NickServPassword}
|
||||
}
|
||||
|
||||
i.Handlers.Add(girc.RPL_WELCOME, b.handleNewConnection)
|
||||
i.Handlers.Add(girc.RPL_ENDOFMOTD, b.handleOtherAuth)
|
||||
i.Handlers.Add("*", b.handleOther)
|
||||
go func() {
|
||||
for {
|
||||
if err := i.Connect(); err != nil {
|
||||
flog.Errorf("error: %s", err)
|
||||
flog.Info("reconnecting in 30 seconds...")
|
||||
time.Sleep(30 * time.Second)
|
||||
i.Handlers.Clear(girc.RPL_WELCOME)
|
||||
i.Handlers.Add(girc.RPL_WELCOME, func(client *girc.Client, event girc.Event) {
|
||||
b.Remote <- config.Message{Username: "system", Text: "rejoin", Channel: "", Account: b.Account, Event: config.EVENT_REJOIN_CHANNELS}
|
||||
// set our correct nick on reconnect if necessary
|
||||
b.Nick = event.Source.Name
|
||||
})
|
||||
} else {
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
b.i = i
|
||||
select {
|
||||
case <-b.connected:
|
||||
@@ -86,55 +132,99 @@ func (b *Birc) Connect() error {
|
||||
case <-time.After(time.Second * 30):
|
||||
return fmt.Errorf("connection timed out")
|
||||
}
|
||||
i.Debug = false
|
||||
//i.Debug = false
|
||||
i.Handlers.Clear("*")
|
||||
go b.doSend()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Birc) Disconnect() error {
|
||||
b.i.Disconnect()
|
||||
//b.i.Disconnect()
|
||||
close(b.Local)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Birc) JoinChannel(channel string) error {
|
||||
b.i.Join(channel)
|
||||
func (b *Birc) JoinChannel(channel config.ChannelInfo) error {
|
||||
if channel.Options.Key != "" {
|
||||
flog.Debugf("using key %s for channel %s", channel.Options.Key, channel.Name)
|
||||
b.i.Cmd.JoinKey(channel.Name, channel.Options.Key)
|
||||
} else {
|
||||
b.i.Cmd.Join(channel.Name)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Birc) Send(msg config.Message) error {
|
||||
flog.Debugf("Receiving %#v", msg)
|
||||
if msg.Account == b.Account {
|
||||
return nil
|
||||
func (b *Birc) Send(msg config.Message) (string, error) {
|
||||
// ignore delete messages
|
||||
if msg.Event == config.EVENT_MSG_DELETE {
|
||||
return "", nil
|
||||
}
|
||||
flog.Debugf("Receiving %#v", msg)
|
||||
if strings.HasPrefix(msg.Text, "!") {
|
||||
b.Command(&msg)
|
||||
return nil
|
||||
}
|
||||
|
||||
if b.Config.Charset != "" {
|
||||
buf := new(bytes.Buffer)
|
||||
w, err := charset.NewWriter(b.Config.Charset, buf)
|
||||
if err != nil {
|
||||
flog.Errorf("charset from utf-8 conversion failed: %s", err)
|
||||
return "", err
|
||||
}
|
||||
fmt.Fprintf(w, msg.Text)
|
||||
w.Close()
|
||||
msg.Text = buf.String()
|
||||
}
|
||||
|
||||
if msg.Extra != nil {
|
||||
if len(msg.Extra["file"]) > 0 {
|
||||
for _, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
if fi.URL != "" {
|
||||
msg.Text = fi.URL
|
||||
}
|
||||
b.Local <- config.Message{Text: msg.Text, Username: msg.Username, Channel: msg.Channel, Event: msg.Event}
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
}
|
||||
|
||||
// split long messages on messageLength, to avoid clipped messages #281
|
||||
if b.Config.MessageSplit {
|
||||
msg.Text = helper.SplitStringLength(msg.Text, b.Config.MessageLength)
|
||||
}
|
||||
for _, text := range strings.Split(msg.Text, "\n") {
|
||||
input := []rune(text)
|
||||
if len(text) > b.Config.MessageLength {
|
||||
text = string(input[:b.Config.MessageLength]) + " <message clipped>"
|
||||
}
|
||||
if len(b.Local) < b.Config.MessageQueue {
|
||||
if len(b.Local) == b.Config.MessageQueue-1 {
|
||||
text = text + " <message clipped>"
|
||||
}
|
||||
b.Local <- config.Message{Text: text, Username: msg.Username, Channel: msg.Channel}
|
||||
b.Local <- config.Message{Text: text, Username: msg.Username, Channel: msg.Channel, Event: msg.Event}
|
||||
} else {
|
||||
flog.Debugf("flooding, dropping message (queue at %d)", len(b.Local))
|
||||
}
|
||||
}
|
||||
return nil
|
||||
return "", nil
|
||||
}
|
||||
|
||||
func (b *Birc) doSend() {
|
||||
rate := time.Millisecond * time.Duration(b.Config.MessageDelay)
|
||||
throttle := time.Tick(rate)
|
||||
throttle := time.NewTicker(rate)
|
||||
for msg := range b.Local {
|
||||
<-throttle
|
||||
b.i.Privmsg(msg.Channel, msg.Username+msg.Text)
|
||||
<-throttle.C
|
||||
if msg.Event == config.EVENT_USER_ACTION {
|
||||
b.i.Cmd.Action(msg.Channel, msg.Username+msg.Text)
|
||||
} else {
|
||||
b.i.Cmd.Message(msg.Channel, msg.Username+msg.Text)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Birc) endNames(event *irc.Event) {
|
||||
channel := event.Arguments[1]
|
||||
func (b *Birc) endNames(client *girc.Client, event girc.Event) {
|
||||
channel := event.Params[1]
|
||||
sort.Strings(b.names[channel])
|
||||
maxNamesPerPost := (300 / b.nicksPerRow()) * b.nicksPerRow()
|
||||
continued := false
|
||||
@@ -147,121 +237,158 @@ func (b *Birc) endNames(event *irc.Event) {
|
||||
b.Remote <- config.Message{Username: b.Nick, Text: b.formatnicks(b.names[channel], continued),
|
||||
Channel: channel, Account: b.Account}
|
||||
b.names[channel] = nil
|
||||
b.i.ClearCallback(ircm.RPL_NAMREPLY)
|
||||
b.i.ClearCallback(ircm.RPL_ENDOFNAMES)
|
||||
b.i.Handlers.Clear(girc.RPL_NAMREPLY)
|
||||
b.i.Handlers.Clear(girc.RPL_ENDOFNAMES)
|
||||
}
|
||||
|
||||
func (b *Birc) handleNewConnection(event *irc.Event) {
|
||||
func (b *Birc) handleNewConnection(client *girc.Client, event girc.Event) {
|
||||
flog.Debug("Registering callbacks")
|
||||
i := b.i
|
||||
b.Nick = event.Arguments[0]
|
||||
i.AddCallback("PRIVMSG", b.handlePrivMsg)
|
||||
i.AddCallback("CTCP_ACTION", b.handlePrivMsg)
|
||||
i.AddCallback(ircm.RPL_TOPICWHOTIME, b.handleTopicWhoTime)
|
||||
i.AddCallback(ircm.NOTICE, b.handleNotice)
|
||||
//i.AddCallback(ircm.RPL_MYINFO, func(e *irc.Event) { flog.Infof("%s: %s", e.Code, strings.Join(e.Arguments[1:], " ")) })
|
||||
i.AddCallback("PING", func(e *irc.Event) {
|
||||
i.SendRaw("PONG :" + e.Message())
|
||||
flog.Debugf("PING/PONG")
|
||||
})
|
||||
i.AddCallback("JOIN", b.handleJoinPart)
|
||||
i.AddCallback("PART", b.handleJoinPart)
|
||||
i.AddCallback("QUIT", b.handleJoinPart)
|
||||
i.AddCallback("*", b.handleOther)
|
||||
b.Nick = event.Params[0]
|
||||
|
||||
i.Handlers.Add(girc.RPL_ENDOFMOTD, b.handleOtherAuth)
|
||||
i.Handlers.Add("PRIVMSG", b.handlePrivMsg)
|
||||
i.Handlers.Add("CTCP_ACTION", b.handlePrivMsg)
|
||||
i.Handlers.Add(girc.RPL_TOPICWHOTIME, b.handleTopicWhoTime)
|
||||
i.Handlers.Add(girc.NOTICE, b.handleNotice)
|
||||
i.Handlers.Add("JOIN", b.handleJoinPart)
|
||||
i.Handlers.Add("PART", b.handleJoinPart)
|
||||
i.Handlers.Add("QUIT", b.handleJoinPart)
|
||||
i.Handlers.Add("KICK", b.handleJoinPart)
|
||||
// we are now fully connected
|
||||
b.connected <- struct{}{}
|
||||
}
|
||||
|
||||
func (b *Birc) handleJoinPart(event *irc.Event) {
|
||||
flog.Debugf("Sending JOIN_LEAVE event from %s to gateway", b.Account)
|
||||
channel := event.Arguments[0]
|
||||
if event.Code == "QUIT" {
|
||||
if event.Nick == b.Nick && strings.Contains(event.Raw, "Ping timeout") {
|
||||
func (b *Birc) handleJoinPart(client *girc.Client, event girc.Event) {
|
||||
if len(event.Params) == 0 {
|
||||
flog.Debugf("handleJoinPart: empty Params? %#v", event)
|
||||
return
|
||||
}
|
||||
channel := event.Params[0]
|
||||
if event.Command == "KICK" {
|
||||
flog.Infof("Got kicked from %s by %s", channel, event.Source.Name)
|
||||
time.Sleep(time.Duration(b.Config.RejoinDelay) * time.Second)
|
||||
b.Remote <- config.Message{Username: "system", Text: "rejoin", Channel: channel, Account: b.Account, Event: config.EVENT_REJOIN_CHANNELS}
|
||||
return
|
||||
}
|
||||
if event.Command == "QUIT" {
|
||||
if event.Source.Name == b.Nick && strings.Contains(event.Trailing, "Ping timeout") {
|
||||
flog.Infof("%s reconnecting ..", b.Account)
|
||||
b.Remote <- config.Message{Username: "system", Text: "reconnect", Channel: channel, Account: b.Account, Event: config.EVENT_FAILURE}
|
||||
return
|
||||
}
|
||||
}
|
||||
b.Remote <- config.Message{Username: "system", Text: event.Nick + " " + strings.ToLower(event.Code) + "s", Channel: channel, Account: b.Account, Event: config.EVENT_JOIN_LEAVE}
|
||||
if event.Source.Name != b.Nick {
|
||||
flog.Debugf("Sending JOIN_LEAVE event from %s to gateway", b.Account)
|
||||
b.Remote <- config.Message{Username: "system", Text: event.Source.Name + " " + strings.ToLower(event.Command) + "s", Channel: channel, Account: b.Account, Event: config.EVENT_JOIN_LEAVE}
|
||||
return
|
||||
}
|
||||
flog.Debugf("handle %#v", event)
|
||||
}
|
||||
|
||||
func (b *Birc) handleNotice(event *irc.Event) {
|
||||
if strings.Contains(event.Message(), "This nickname is registered") && event.Nick == b.Config.NickServNick {
|
||||
b.i.Privmsg(b.Config.NickServNick, "IDENTIFY "+b.Config.NickServPassword)
|
||||
func (b *Birc) handleNotice(client *girc.Client, event girc.Event) {
|
||||
if strings.Contains(event.String(), "This nickname is registered") && event.Source.Name == b.Config.NickServNick {
|
||||
b.i.Cmd.Message(b.Config.NickServNick, "IDENTIFY "+b.Config.NickServPassword)
|
||||
} else {
|
||||
b.handlePrivMsg(event)
|
||||
b.handlePrivMsg(client, event)
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Birc) handleOther(event *irc.Event) {
|
||||
switch event.Code {
|
||||
func (b *Birc) handleOther(client *girc.Client, event girc.Event) {
|
||||
switch event.Command {
|
||||
case "372", "375", "376", "250", "251", "252", "253", "254", "255", "265", "266", "002", "003", "004", "005":
|
||||
return
|
||||
}
|
||||
flog.Debugf("%#v", event.Raw)
|
||||
flog.Debugf("%#v", event.String())
|
||||
}
|
||||
|
||||
func (b *Birc) handlePrivMsg(event *irc.Event) {
|
||||
func (b *Birc) handleOtherAuth(client *girc.Client, event girc.Event) {
|
||||
if strings.EqualFold(b.Config.NickServNick, "Q@CServe.quakenet.org") {
|
||||
flog.Debugf("Authenticating %s against %s", b.Config.NickServUsername, b.Config.NickServNick)
|
||||
b.i.Cmd.Message(b.Config.NickServNick, "AUTH "+b.Config.NickServUsername+" "+b.Config.NickServPassword)
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Birc) handlePrivMsg(client *girc.Client, event girc.Event) {
|
||||
b.Nick = b.i.GetNick()
|
||||
// freenode doesn't send 001 as first reply
|
||||
if event.Command == "NOTICE" {
|
||||
return
|
||||
}
|
||||
// don't forward queries to the bot
|
||||
if event.Arguments[0] == b.Nick {
|
||||
if event.Params[0] == b.Nick {
|
||||
return
|
||||
}
|
||||
// don't forward message from ourself
|
||||
if event.Nick == b.Nick {
|
||||
if event.Source.Name == b.Nick {
|
||||
return
|
||||
}
|
||||
flog.Debugf("handlePrivMsg() %s %s %#v", event.Nick, event.Message(), event)
|
||||
rmsg := config.Message{Username: event.Source.Name, Channel: strings.ToLower(event.Params[0]), Account: b.Account, UserID: event.Source.Ident + "@" + event.Source.Host}
|
||||
flog.Debugf("handlePrivMsg() %s %s %#v", event.Source.Name, event.Trailing, event)
|
||||
msg := ""
|
||||
if event.Code == "CTCP_ACTION" {
|
||||
msg = event.Nick + " "
|
||||
if event.IsAction() {
|
||||
rmsg.Event = config.EVENT_USER_ACTION
|
||||
}
|
||||
msg += event.Message()
|
||||
msg += event.StripAction()
|
||||
// strip IRC colors
|
||||
re := regexp.MustCompile(`[[:cntrl:]](\d+,|)\d+`)
|
||||
re := regexp.MustCompile(`[[:cntrl:]](?:\d{1,2}(?:,\d{1,2})?)?`)
|
||||
msg = re.ReplaceAllString(msg, "")
|
||||
flog.Debugf("Sending message from %s on %s to gateway", event.Arguments[0], b.Account)
|
||||
b.Remote <- config.Message{Username: event.Nick, Text: msg, Channel: event.Arguments[0], Account: b.Account}
|
||||
|
||||
var r io.Reader
|
||||
var err error
|
||||
mycharset := b.Config.Charset
|
||||
if mycharset == "" {
|
||||
// detect what were sending so that we convert it to utf-8
|
||||
detector := chardet.NewTextDetector()
|
||||
result, err := detector.DetectBest([]byte(msg))
|
||||
if err != nil {
|
||||
flog.Infof("detection failed for msg: %#v", msg)
|
||||
return
|
||||
}
|
||||
flog.Debugf("detected %s confidence %#v", result.Charset, result.Confidence)
|
||||
mycharset = result.Charset
|
||||
// if we're not sure, just pick ISO-8859-1
|
||||
if result.Confidence < 80 {
|
||||
mycharset = "ISO-8859-1"
|
||||
}
|
||||
}
|
||||
r, err = charset.NewReader(mycharset, strings.NewReader(msg))
|
||||
if err != nil {
|
||||
flog.Errorf("charset to utf-8 conversion failed: %s", err)
|
||||
return
|
||||
}
|
||||
output, _ := ioutil.ReadAll(r)
|
||||
msg = string(output)
|
||||
|
||||
flog.Debugf("Sending message from %s on %s to gateway", event.Params[0], b.Account)
|
||||
rmsg.Text = msg
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
|
||||
func (b *Birc) handleTopicWhoTime(event *irc.Event) {
|
||||
parts := strings.Split(event.Arguments[2], "!")
|
||||
t, err := strconv.ParseInt(event.Arguments[3], 10, 64)
|
||||
func (b *Birc) handleTopicWhoTime(client *girc.Client, event girc.Event) {
|
||||
parts := strings.Split(event.Params[2], "!")
|
||||
t, err := strconv.ParseInt(event.Params[3], 10, 64)
|
||||
if err != nil {
|
||||
flog.Errorf("Invalid time stamp: %s", event.Arguments[3])
|
||||
flog.Errorf("Invalid time stamp: %s", event.Params[3])
|
||||
}
|
||||
user := parts[0]
|
||||
if len(parts) > 1 {
|
||||
user += " [" + parts[1] + "]"
|
||||
}
|
||||
flog.Debugf("%s: Topic set by %s [%s]", event.Code, user, time.Unix(t, 0))
|
||||
flog.Debugf("%s: Topic set by %s [%s]", event.Command, user, time.Unix(t, 0))
|
||||
}
|
||||
|
||||
func (b *Birc) nicksPerRow() int {
|
||||
return 4
|
||||
/*
|
||||
if b.Config.Mattermost.NicksPerRow < 1 {
|
||||
return 4
|
||||
}
|
||||
return b.Config.Mattermost.NicksPerRow
|
||||
*/
|
||||
}
|
||||
|
||||
func (b *Birc) storeNames(event *irc.Event) {
|
||||
channel := event.Arguments[2]
|
||||
func (b *Birc) storeNames(client *girc.Client, event girc.Event) {
|
||||
channel := event.Params[2]
|
||||
b.names[channel] = append(
|
||||
b.names[channel],
|
||||
strings.Split(strings.TrimSpace(event.Message()), " ")...)
|
||||
strings.Split(strings.TrimSpace(event.Trailing), " ")...)
|
||||
}
|
||||
|
||||
func (b *Birc) formatnicks(nicks []string, continued bool) string {
|
||||
return plainformatter(nicks, b.nicksPerRow())
|
||||
/*
|
||||
switch b.Config.Mattermost.NickFormatter {
|
||||
case "table":
|
||||
return tableformatter(nicks, b.nicksPerRow(), continued)
|
||||
default:
|
||||
return plainformatter(nicks, b.nicksPerRow())
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
@@ -1,20 +1,24 @@
|
||||
package bmatrix
|
||||
|
||||
import (
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
matrix "github.com/matrix-org/gomatrix"
|
||||
"bytes"
|
||||
"mime"
|
||||
"regexp"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/42wim/matterbridge/bridge/helper"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
matrix "github.com/matterbridge/gomatrix"
|
||||
)
|
||||
|
||||
type Bmatrix struct {
|
||||
mc *matrix.Client
|
||||
Config *config.Protocol
|
||||
Remote chan config.Message
|
||||
Account string
|
||||
UserID string
|
||||
RoomMap map[string]string
|
||||
sync.RWMutex
|
||||
*config.BridgeConfig
|
||||
}
|
||||
|
||||
var flog *log.Entry
|
||||
@@ -24,12 +28,9 @@ func init() {
|
||||
flog = log.WithFields(log.Fields{"module": protocol})
|
||||
}
|
||||
|
||||
func New(cfg config.Protocol, account string, c chan config.Message) *Bmatrix {
|
||||
b := &Bmatrix{}
|
||||
func New(cfg *config.BridgeConfig) *Bmatrix {
|
||||
b := &Bmatrix{BridgeConfig: cfg}
|
||||
b.RoomMap = make(map[string]string)
|
||||
b.Config = &cfg
|
||||
b.Account = account
|
||||
b.Remote = c
|
||||
return b
|
||||
}
|
||||
|
||||
@@ -61,23 +62,83 @@ func (b *Bmatrix) Disconnect() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bmatrix) JoinChannel(channel string) error {
|
||||
resp, err := b.mc.JoinRoom(channel, "", nil)
|
||||
func (b *Bmatrix) JoinChannel(channel config.ChannelInfo) error {
|
||||
resp, err := b.mc.JoinRoom(channel.Name, "", nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.Lock()
|
||||
b.RoomMap[resp.RoomID] = channel
|
||||
b.RoomMap[resp.RoomID] = channel.Name
|
||||
b.Unlock()
|
||||
return err
|
||||
}
|
||||
|
||||
func (b *Bmatrix) Send(msg config.Message) error {
|
||||
func (b *Bmatrix) Send(msg config.Message) (string, error) {
|
||||
flog.Debugf("Receiving %#v", msg)
|
||||
channel := b.getRoomID(msg.Channel)
|
||||
// ignore delete messages
|
||||
if msg.Event == config.EVENT_MSG_DELETE {
|
||||
if msg.ID == "" {
|
||||
return "", nil
|
||||
}
|
||||
resp, err := b.mc.RedactEvent(channel, msg.ID, &matrix.ReqRedact{})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return resp.EventID, err
|
||||
}
|
||||
flog.Debugf("Sending to channel %s", channel)
|
||||
b.mc.SendText(channel, msg.Username+msg.Text)
|
||||
return nil
|
||||
if msg.Event == config.EVENT_USER_ACTION {
|
||||
resp, err := b.mc.SendMessageEvent(channel, "m.room.message",
|
||||
matrix.TextMessage{"m.emote", msg.Username + msg.Text})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return resp.EventID, err
|
||||
}
|
||||
|
||||
if msg.Extra != nil {
|
||||
// check if we have files to upload (from slack, telegram or mattermost)
|
||||
if len(msg.Extra["file"]) > 0 {
|
||||
for _, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
content := bytes.NewReader(*fi.Data)
|
||||
sp := strings.Split(fi.Name, ".")
|
||||
mtype := mime.TypeByExtension("." + sp[len(sp)-1])
|
||||
if strings.Contains(mtype, "image") ||
|
||||
strings.Contains(mtype, "video") {
|
||||
flog.Debugf("uploading file: %s %s", fi.Name, mtype)
|
||||
res, err := b.mc.UploadToContentRepo(content, mtype, int64(len(*fi.Data)))
|
||||
if err != nil {
|
||||
flog.Errorf("file upload failed: %#v", err)
|
||||
continue
|
||||
}
|
||||
if strings.Contains(mtype, "video") {
|
||||
flog.Debugf("sendVideo %s", res.ContentURI)
|
||||
_, err = b.mc.SendVideo(channel, fi.Name, res.ContentURI)
|
||||
if err != nil {
|
||||
flog.Errorf("sendVideo failed: %#v", err)
|
||||
}
|
||||
}
|
||||
if strings.Contains(mtype, "image") {
|
||||
flog.Debugf("sendImage %s", res.ContentURI)
|
||||
_, err = b.mc.SendImage(channel, fi.Name, res.ContentURI)
|
||||
if err != nil {
|
||||
flog.Errorf("sendImage failed: %#v", err)
|
||||
}
|
||||
}
|
||||
flog.Debugf("result: %#v", res)
|
||||
}
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
}
|
||||
|
||||
resp, err := b.mc.SendText(channel, msg.Username+msg.Text)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return resp.EventID, err
|
||||
}
|
||||
|
||||
func (b *Bmatrix) getRoomID(channel string) string {
|
||||
@@ -90,22 +151,11 @@ func (b *Bmatrix) getRoomID(channel string) string {
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (b *Bmatrix) handlematrix() error {
|
||||
syncer := b.mc.Syncer.(*matrix.DefaultSyncer)
|
||||
syncer.OnEventType("m.room.message", func(ev *matrix.Event) {
|
||||
if ev.Content["msgtype"].(string) == "m.text" && ev.Sender != b.UserID {
|
||||
b.RLock()
|
||||
channel, ok := b.RoomMap[ev.RoomID]
|
||||
b.RUnlock()
|
||||
if !ok {
|
||||
flog.Debugf("Unknown room %s", ev.RoomID)
|
||||
return
|
||||
}
|
||||
flog.Debugf("Sending message from %s on %s to gateway", ev.Sender, b.Account)
|
||||
b.Remote <- config.Message{Username: ev.Sender, Text: ev.Content["body"].(string), Channel: channel, Account: b.Account}
|
||||
}
|
||||
flog.Debugf("Received: %#v", ev)
|
||||
})
|
||||
syncer.OnEventType("m.room.redaction", b.handleEvent)
|
||||
syncer.OnEventType("m.room.message", b.handleEvent)
|
||||
go func() {
|
||||
for {
|
||||
if err := b.mc.Sync(); err != nil {
|
||||
@@ -115,3 +165,73 @@ func (b *Bmatrix) handlematrix() error {
|
||||
}()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bmatrix) handleEvent(ev *matrix.Event) {
|
||||
flog.Debugf("Received: %#v", ev)
|
||||
if ev.Sender != b.UserID {
|
||||
b.RLock()
|
||||
channel, ok := b.RoomMap[ev.RoomID]
|
||||
b.RUnlock()
|
||||
if !ok {
|
||||
flog.Debugf("Unknown room %s", ev.RoomID)
|
||||
return
|
||||
}
|
||||
username := ev.Sender[1:]
|
||||
if b.Config.NoHomeServerSuffix {
|
||||
re := regexp.MustCompile("(.*?):.*")
|
||||
username = re.ReplaceAllString(username, `$1`)
|
||||
}
|
||||
var text string
|
||||
text, _ = ev.Content["body"].(string)
|
||||
rmsg := config.Message{Username: username, Text: text, Channel: channel, Account: b.Account, UserID: ev.Sender}
|
||||
rmsg.ID = ev.ID
|
||||
if ev.Type == "m.room.redaction" {
|
||||
rmsg.Event = config.EVENT_MSG_DELETE
|
||||
rmsg.ID = ev.Redacts
|
||||
rmsg.Text = config.EVENT_MSG_DELETE
|
||||
b.Remote <- rmsg
|
||||
return
|
||||
}
|
||||
if ev.Content["msgtype"].(string) == "m.emote" {
|
||||
rmsg.Event = config.EVENT_USER_ACTION
|
||||
}
|
||||
if ev.Content["msgtype"] != nil && ev.Content["msgtype"].(string) == "m.image" ||
|
||||
ev.Content["msgtype"].(string) == "m.video" ||
|
||||
ev.Content["msgtype"].(string) == "m.file" {
|
||||
flog.Debugf("ev: %#v", ev)
|
||||
rmsg.Extra = make(map[string][]interface{})
|
||||
url := ev.Content["url"].(string)
|
||||
url = strings.Replace(url, "mxc://", b.Config.Server+"/_matrix/media/v1/download/", -1)
|
||||
info := ev.Content["info"].(map[string]interface{})
|
||||
size := info["size"].(float64)
|
||||
name := ev.Content["body"].(string)
|
||||
// check if we have an image uploaded without extension
|
||||
if !strings.Contains(name, ".") {
|
||||
if ev.Content["msgtype"].(string) == "m.image" {
|
||||
if mtype, ok := ev.Content["mimetype"].(string); ok {
|
||||
mext, _ := mime.ExtensionsByType(mtype)
|
||||
if len(mext) > 0 {
|
||||
name = name + mext[0]
|
||||
}
|
||||
} else {
|
||||
// just a default .png extension if we don't have mime info
|
||||
name = name + ".png"
|
||||
}
|
||||
}
|
||||
}
|
||||
flog.Debugf("trying to download %#v with size %#v", name, size)
|
||||
if size <= float64(b.General.MediaDownloadSize) {
|
||||
data, err := helper.DownloadFile(url)
|
||||
if err != nil {
|
||||
flog.Errorf("download %s failed %#v", url, err)
|
||||
} else {
|
||||
flog.Debugf("download OK %#v %#v %#v", name, len(*data), len(url))
|
||||
rmsg.Extra["file"] = append(rmsg.Extra["file"], config.FileInfo{Name: name, Data: data})
|
||||
}
|
||||
}
|
||||
rmsg.Text = ""
|
||||
}
|
||||
flog.Debugf("Sending message from %s on %s to gateway", ev.Sender, b.Account)
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
package bmattermost
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/42wim/matterbridge/matterclient"
|
||||
"github.com/42wim/matterbridge/matterhook"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type MMhook struct {
|
||||
@@ -14,23 +17,23 @@ type MMhook struct {
|
||||
type MMapi struct {
|
||||
mc *matterclient.MMClient
|
||||
mmMap map[string]string
|
||||
mmIgnoreNicks []string
|
||||
}
|
||||
|
||||
type MMMessage struct {
|
||||
Text string
|
||||
Channel string
|
||||
Username string
|
||||
UserID string
|
||||
ID string
|
||||
Event string
|
||||
Extra map[string][]interface{}
|
||||
}
|
||||
|
||||
type Bmattermost struct {
|
||||
MMhook
|
||||
MMapi
|
||||
Config *config.Protocol
|
||||
Remote chan config.Message
|
||||
name string
|
||||
TeamId string
|
||||
Account string
|
||||
*config.BridgeConfig
|
||||
}
|
||||
|
||||
var flog *log.Entry
|
||||
@@ -40,11 +43,8 @@ func init() {
|
||||
flog = log.WithFields(log.Fields{"module": protocol})
|
||||
}
|
||||
|
||||
func New(cfg config.Protocol, account string, c chan config.Message) *Bmattermost {
|
||||
b := &Bmattermost{}
|
||||
b.Config = &cfg
|
||||
b.Remote = c
|
||||
b.Account = account
|
||||
func New(cfg *config.BridgeConfig) *Bmattermost {
|
||||
b := &Bmattermost{BridgeConfig: cfg}
|
||||
b.mmMap = make(map[string]string)
|
||||
return b
|
||||
}
|
||||
@@ -54,98 +54,229 @@ func (b *Bmattermost) Command(cmd string) string {
|
||||
}
|
||||
|
||||
func (b *Bmattermost) Connect() error {
|
||||
if !b.Config.UseAPI {
|
||||
flog.Info("Connecting webhooks")
|
||||
b.mh = matterhook.New(b.Config.URL,
|
||||
if b.Config.WebhookBindAddress != "" {
|
||||
if b.Config.WebhookURL != "" {
|
||||
flog.Info("Connecting using webhookurl (sending) and webhookbindaddress (receiving)")
|
||||
b.mh = matterhook.New(b.Config.WebhookURL,
|
||||
matterhook.Config{InsecureSkipVerify: b.Config.SkipTLSVerify,
|
||||
BindAddress: b.Config.BindAddress})
|
||||
} else {
|
||||
b.mc = matterclient.New(b.Config.Login, b.Config.Password,
|
||||
b.Config.Team, b.Config.Server)
|
||||
b.mc.SkipTLSVerify = b.Config.SkipTLSVerify
|
||||
b.mc.NoTLS = b.Config.NoTLS
|
||||
flog.Infof("Connecting %s (team: %s) on %s", b.Config.Login, b.Config.Team, b.Config.Server)
|
||||
err := b.mc.Login()
|
||||
BindAddress: b.Config.WebhookBindAddress})
|
||||
} else if b.Config.Token != "" {
|
||||
flog.Info("Connecting using token (sending)")
|
||||
err := b.apiLogin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
flog.Info("Connection succeeded")
|
||||
b.TeamId = b.mc.GetTeamId()
|
||||
go b.mc.WsReceiver()
|
||||
} else if b.Config.Login != "" {
|
||||
flog.Info("Connecting using login/password (sending)")
|
||||
err := b.apiLogin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
flog.Info("Connecting using webhookbindaddress (receiving)")
|
||||
b.mh = matterhook.New(b.Config.WebhookURL,
|
||||
matterhook.Config{InsecureSkipVerify: b.Config.SkipTLSVerify,
|
||||
BindAddress: b.Config.WebhookBindAddress})
|
||||
}
|
||||
go b.handleMatter()
|
||||
return nil
|
||||
}
|
||||
if b.Config.WebhookURL != "" {
|
||||
flog.Info("Connecting using webhookurl (sending)")
|
||||
b.mh = matterhook.New(b.Config.WebhookURL,
|
||||
matterhook.Config{InsecureSkipVerify: b.Config.SkipTLSVerify,
|
||||
DisableServer: true})
|
||||
if b.Config.Token != "" {
|
||||
flog.Info("Connecting using token (receiving)")
|
||||
err := b.apiLogin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
go b.handleMatter()
|
||||
} else if b.Config.Login != "" {
|
||||
flog.Info("Connecting using login/password (receiving)")
|
||||
err := b.apiLogin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
go b.handleMatter()
|
||||
}
|
||||
return nil
|
||||
} else if b.Config.Token != "" {
|
||||
flog.Info("Connecting using token (sending and receiving)")
|
||||
err := b.apiLogin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
go b.handleMatter()
|
||||
} else if b.Config.Login != "" {
|
||||
flog.Info("Connecting using login/password (sending and receiving)")
|
||||
err := b.apiLogin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
go b.handleMatter()
|
||||
}
|
||||
if b.Config.WebhookBindAddress == "" && b.Config.WebhookURL == "" && b.Config.Login == "" && b.Config.Token == "" {
|
||||
return errors.New("No connection method found. See that you have WebhookBindAddress, WebhookURL or Token/Login/Password/Server/Team configured.")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bmattermost) Disconnect() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bmattermost) JoinChannel(channel string) error {
|
||||
func (b *Bmattermost) JoinChannel(channel config.ChannelInfo) error {
|
||||
// we can only join channels using the API
|
||||
if b.Config.UseAPI {
|
||||
return b.mc.JoinChannel(b.mc.GetChannelId(channel, ""))
|
||||
if b.Config.WebhookURL == "" && b.Config.WebhookBindAddress == "" {
|
||||
id := b.mc.GetChannelId(channel.Name, "")
|
||||
if id == "" {
|
||||
return fmt.Errorf("Could not find channel ID for channel %s", channel.Name)
|
||||
}
|
||||
return b.mc.JoinChannel(id)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bmattermost) Send(msg config.Message) error {
|
||||
func (b *Bmattermost) Send(msg config.Message) (string, error) {
|
||||
flog.Debugf("Receiving %#v", msg)
|
||||
if msg.Event == config.EVENT_USER_ACTION {
|
||||
msg.Text = "*" + msg.Text + "*"
|
||||
}
|
||||
nick := msg.Username
|
||||
message := msg.Text
|
||||
channel := msg.Channel
|
||||
|
||||
if b.Config.PrefixMessagesWithNick {
|
||||
/*if IsMarkup(message) {
|
||||
message = nick + "\n\n" + message
|
||||
} else {
|
||||
*/
|
||||
message = nick + " " + message
|
||||
//}
|
||||
message = nick + message
|
||||
}
|
||||
if !b.Config.UseAPI {
|
||||
if b.Config.WebhookURL != "" {
|
||||
matterMessage := matterhook.OMessage{IconURL: b.Config.IconURL}
|
||||
matterMessage.IconURL = msg.Avatar
|
||||
matterMessage.Channel = channel
|
||||
matterMessage.UserName = nick
|
||||
matterMessage.Type = ""
|
||||
matterMessage.Text = message
|
||||
matterMessage.Text = message
|
||||
matterMessage.Props = make(map[string]interface{})
|
||||
matterMessage.Props["matterbridge"] = true
|
||||
err := b.mh.Send(matterMessage)
|
||||
if err != nil {
|
||||
flog.Info(err)
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
return nil
|
||||
return "", nil
|
||||
}
|
||||
b.mc.PostMessage(b.mc.GetChannelId(channel, ""), message)
|
||||
return nil
|
||||
if msg.Event == config.EVENT_MSG_DELETE {
|
||||
if msg.ID == "" {
|
||||
return "", nil
|
||||
}
|
||||
return msg.ID, b.mc.DeleteMessage(msg.ID)
|
||||
}
|
||||
if msg.Extra != nil {
|
||||
if len(msg.Extra["file"]) > 0 {
|
||||
var err error
|
||||
var res, id string
|
||||
for _, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
id, err = b.mc.UploadFile(*fi.Data, b.mc.GetChannelId(channel, ""), fi.Name)
|
||||
if err != nil {
|
||||
flog.Debugf("ERROR %#v", err)
|
||||
return "", err
|
||||
}
|
||||
message = fi.Comment
|
||||
if b.Config.PrefixMessagesWithNick {
|
||||
message = nick + fi.Comment
|
||||
}
|
||||
res, err = b.mc.PostMessageWithFiles(b.mc.GetChannelId(channel, ""), message, []string{id})
|
||||
}
|
||||
return res, err
|
||||
}
|
||||
}
|
||||
if msg.ID != "" {
|
||||
return b.mc.EditMessage(msg.ID, message)
|
||||
}
|
||||
return b.mc.PostMessage(b.mc.GetChannelId(channel, ""), message)
|
||||
}
|
||||
|
||||
func (b *Bmattermost) handleMatter() {
|
||||
flog.Debugf("Choosing API based Mattermost connection: %t", b.Config.UseAPI)
|
||||
mchan := make(chan *MMMessage)
|
||||
if b.Config.UseAPI {
|
||||
go b.handleMatterClient(mchan)
|
||||
} else {
|
||||
if b.Config.WebhookBindAddress != "" {
|
||||
flog.Debugf("Choosing webhooks based receiving")
|
||||
go b.handleMatterHook(mchan)
|
||||
} else {
|
||||
if b.Config.Token != "" {
|
||||
flog.Debugf("Choosing token based receiving")
|
||||
} else {
|
||||
flog.Debugf("Choosing login/password based receiving")
|
||||
}
|
||||
go b.handleMatterClient(mchan)
|
||||
}
|
||||
for message := range mchan {
|
||||
rmsg := config.Message{Username: message.Username, Channel: message.Channel, Account: b.Account, UserID: message.UserID, ID: message.ID, Event: message.Event, Extra: message.Extra}
|
||||
text, ok := b.replaceAction(message.Text)
|
||||
if ok {
|
||||
rmsg.Event = config.EVENT_USER_ACTION
|
||||
}
|
||||
rmsg.Text = text
|
||||
flog.Debugf("Sending message from %s on %s to gateway", message.Username, b.Account)
|
||||
b.Remote <- config.Message{Text: message.Text, Username: message.Username, Channel: message.Channel, Account: b.Account}
|
||||
flog.Debugf("Message is %#v", rmsg)
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Bmattermost) handleMatterClient(mchan chan *MMMessage) {
|
||||
for message := range b.mc.MessageChan {
|
||||
flog.Debugf("%#v", message.Raw.Data)
|
||||
if message.Type == "system_join_leave" ||
|
||||
message.Type == "system_join_channel" ||
|
||||
message.Type == "system_leave_channel" {
|
||||
flog.Debugf("Sending JOIN_LEAVE event from %s to gateway", b.Account)
|
||||
b.Remote <- config.Message{Username: "system", Text: message.Text, Channel: message.Channel, Account: b.Account, Event: config.EVENT_JOIN_LEAVE}
|
||||
continue
|
||||
}
|
||||
if (message.Raw.Event == "post_edited") && b.Config.EditDisable {
|
||||
continue
|
||||
}
|
||||
|
||||
m := &MMMessage{Extra: make(map[string][]interface{})}
|
||||
|
||||
props := message.Post.Props
|
||||
if props != nil {
|
||||
if _, ok := props["matterbridge"].(bool); ok {
|
||||
flog.Debugf("sent by matterbridge, ignoring")
|
||||
continue
|
||||
}
|
||||
if _, ok := props["override_username"].(string); ok {
|
||||
message.Username = props["override_username"].(string)
|
||||
}
|
||||
if _, ok := props["attachments"].([]interface{}); ok {
|
||||
m.Extra["attachments"] = props["attachments"].([]interface{})
|
||||
}
|
||||
}
|
||||
// do not post our own messages back to irc
|
||||
// only listen to message from our team
|
||||
if message.Raw.Event == "posted" && b.mc.User.Username != message.Username && message.Raw.Data["team_id"].(string) == b.TeamId {
|
||||
if (message.Raw.Event == "posted" || message.Raw.Event == "post_edited" || message.Raw.Event == "post_deleted") &&
|
||||
b.mc.User.Username != message.Username && message.Raw.Data["team_id"].(string) == b.TeamId {
|
||||
// if the message has reactions don't repost it (for now, until we can correlate reaction with message)
|
||||
if message.Post.HasReactions {
|
||||
continue
|
||||
}
|
||||
flog.Debugf("Receiving from matterclient %#v", message)
|
||||
m := &MMMessage{}
|
||||
m.UserID = message.UserID
|
||||
m.Username = message.Username
|
||||
m.Channel = message.Channel
|
||||
m.Text = message.Text
|
||||
m.ID = message.Post.Id
|
||||
if message.Raw.Event == "post_edited" && !b.Config.EditDisable {
|
||||
m.Text = message.Text + b.Config.EditSuffix
|
||||
}
|
||||
if message.Raw.Event == "post_deleted" {
|
||||
m.Event = config.EVENT_MSG_DELETE
|
||||
}
|
||||
if len(message.Post.FileIds) > 0 {
|
||||
for _, link := range b.mc.GetPublicLinks(message.Post.FileIds) {
|
||||
for _, link := range b.mc.GetFileLinks(message.Post.FileIds) {
|
||||
m.Text = m.Text + "\n" + link
|
||||
}
|
||||
}
|
||||
@@ -159,9 +290,39 @@ func (b *Bmattermost) handleMatterHook(mchan chan *MMMessage) {
|
||||
message := b.mh.Receive()
|
||||
flog.Debugf("Receiving from matterhook %#v", message)
|
||||
m := &MMMessage{}
|
||||
m.UserID = message.UserID
|
||||
m.Username = message.UserName
|
||||
m.Text = message.Text
|
||||
m.Channel = message.ChannelName
|
||||
mchan <- m
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Bmattermost) apiLogin() error {
|
||||
password := b.Config.Password
|
||||
if b.Config.Token != "" {
|
||||
password = "MMAUTHTOKEN=" + b.Config.Token
|
||||
}
|
||||
|
||||
b.mc = matterclient.New(b.Config.Login, password,
|
||||
b.Config.Team, b.Config.Server)
|
||||
b.mc.SkipTLSVerify = b.Config.SkipTLSVerify
|
||||
b.mc.NoTLS = b.Config.NoTLS
|
||||
flog.Infof("Connecting %s (team: %s) on %s", b.Config.Login, b.Config.Team, b.Config.Server)
|
||||
err := b.mc.Login()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
flog.Info("Connection succeeded")
|
||||
b.TeamId = b.mc.GetTeamId()
|
||||
go b.mc.WsReceiver()
|
||||
go b.mc.StatusLoop()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bmattermost) replaceAction(text string) (string, bool) {
|
||||
if strings.HasPrefix(text, "*") && strings.HasSuffix(text, "*") {
|
||||
return strings.Replace(text, "*", "", -1), true
|
||||
}
|
||||
return text, false
|
||||
}
|
||||
|
||||
@@ -14,10 +14,7 @@ type MMhook struct {
|
||||
|
||||
type Brocketchat struct {
|
||||
MMhook
|
||||
Config *config.Protocol
|
||||
Remote chan config.Message
|
||||
name string
|
||||
Account string
|
||||
*config.BridgeConfig
|
||||
}
|
||||
|
||||
var flog *log.Entry
|
||||
@@ -27,12 +24,8 @@ func init() {
|
||||
flog = log.WithFields(log.Fields{"module": protocol})
|
||||
}
|
||||
|
||||
func New(cfg config.Protocol, account string, c chan config.Message) *Brocketchat {
|
||||
b := &Brocketchat{}
|
||||
b.Config = &cfg
|
||||
b.Remote = c
|
||||
b.Account = account
|
||||
return b
|
||||
func New(cfg *config.BridgeConfig) *Brocketchat {
|
||||
return &Brocketchat{BridgeConfig: cfg}
|
||||
}
|
||||
|
||||
func (b *Brocketchat) Command(cmd string) string {
|
||||
@@ -41,10 +34,10 @@ func (b *Brocketchat) Command(cmd string) string {
|
||||
|
||||
func (b *Brocketchat) Connect() error {
|
||||
flog.Info("Connecting webhooks")
|
||||
b.mh = matterhook.New(b.Config.URL,
|
||||
b.mh = matterhook.New(b.Config.WebhookURL,
|
||||
matterhook.Config{InsecureSkipVerify: b.Config.SkipTLSVerify,
|
||||
DisableServer: true})
|
||||
b.rh = rockethook.New(b.Config.URL, rockethook.Config{BindAddress: b.Config.BindAddress})
|
||||
b.rh = rockethook.New(b.Config.WebhookURL, rockethook.Config{BindAddress: b.Config.WebhookBindAddress})
|
||||
go b.handleRocketHook()
|
||||
return nil
|
||||
}
|
||||
@@ -54,11 +47,15 @@ func (b *Brocketchat) Disconnect() error {
|
||||
|
||||
}
|
||||
|
||||
func (b *Brocketchat) JoinChannel(channel string) error {
|
||||
func (b *Brocketchat) JoinChannel(channel config.ChannelInfo) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Brocketchat) Send(msg config.Message) error {
|
||||
func (b *Brocketchat) Send(msg config.Message) (string, error) {
|
||||
// ignore delete messages
|
||||
if msg.Event == config.EVENT_MSG_DELETE {
|
||||
return "", nil
|
||||
}
|
||||
flog.Debugf("Receiving %#v", msg)
|
||||
matterMessage := matterhook.OMessage{IconURL: b.Config.IconURL}
|
||||
matterMessage.Channel = msg.Channel
|
||||
@@ -68,9 +65,9 @@ func (b *Brocketchat) Send(msg config.Message) error {
|
||||
err := b.mh.Send(matterMessage)
|
||||
if err != nil {
|
||||
flog.Info(err)
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
return nil
|
||||
return "", nil
|
||||
}
|
||||
|
||||
func (b *Brocketchat) handleRocketHook() {
|
||||
@@ -82,6 +79,6 @@ func (b *Brocketchat) handleRocketHook() {
|
||||
continue
|
||||
}
|
||||
flog.Debugf("Sending message from %s on %s to gateway", message.UserName, b.Account)
|
||||
b.Remote <- config.Message{Text: message.Text, Username: message.UserName, Channel: message.ChannelName, Account: b.Account}
|
||||
b.Remote <- config.Message{Text: message.Text, Username: message.UserName, Channel: message.ChannelName, Account: b.Account, UserID: message.UserID}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
package bslack
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/42wim/matterbridge/matterhook"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"github.com/nlopes/slack"
|
||||
"html"
|
||||
"io"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -15,20 +20,19 @@ type MMMessage struct {
|
||||
Text string
|
||||
Channel string
|
||||
Username string
|
||||
UserID string
|
||||
Raw *slack.MessageEvent
|
||||
}
|
||||
|
||||
type Bslack struct {
|
||||
mh *matterhook.Client
|
||||
sc *slack.Client
|
||||
Config *config.Protocol
|
||||
rtm *slack.RTM
|
||||
Plus bool
|
||||
Remote chan config.Message
|
||||
Users []slack.User
|
||||
Account string
|
||||
si *slack.Info
|
||||
channels []slack.Channel
|
||||
*config.BridgeConfig
|
||||
}
|
||||
|
||||
var flog *log.Entry
|
||||
@@ -38,12 +42,8 @@ func init() {
|
||||
flog = log.WithFields(log.Fields{"module": protocol})
|
||||
}
|
||||
|
||||
func New(cfg config.Protocol, account string, c chan config.Message) *Bslack {
|
||||
b := &Bslack{}
|
||||
b.Config = &cfg
|
||||
b.Remote = c
|
||||
b.Account = account
|
||||
return b
|
||||
func New(cfg *config.BridgeConfig) *Bslack {
|
||||
return &Bslack{BridgeConfig: cfg}
|
||||
}
|
||||
|
||||
func (b *Bslack) Command(cmd string) string {
|
||||
@@ -51,18 +51,53 @@ func (b *Bslack) Command(cmd string) string {
|
||||
}
|
||||
|
||||
func (b *Bslack) Connect() error {
|
||||
flog.Info("Connecting")
|
||||
if !b.Config.UseAPI {
|
||||
b.mh = matterhook.New(b.Config.URL,
|
||||
matterhook.Config{BindAddress: b.Config.BindAddress})
|
||||
} else {
|
||||
if b.Config.WebhookBindAddress != "" {
|
||||
if b.Config.WebhookURL != "" {
|
||||
flog.Info("Connecting using webhookurl (sending) and webhookbindaddress (receiving)")
|
||||
b.mh = matterhook.New(b.Config.WebhookURL,
|
||||
matterhook.Config{InsecureSkipVerify: b.Config.SkipTLSVerify,
|
||||
BindAddress: b.Config.WebhookBindAddress})
|
||||
} else if b.Config.Token != "" {
|
||||
flog.Info("Connecting using token (sending)")
|
||||
b.sc = slack.New(b.Config.Token)
|
||||
b.rtm = b.sc.NewRTM()
|
||||
go b.rtm.ManageConnection()
|
||||
flog.Info("Connecting using webhookbindaddress (receiving)")
|
||||
b.mh = matterhook.New(b.Config.WebhookURL,
|
||||
matterhook.Config{InsecureSkipVerify: b.Config.SkipTLSVerify,
|
||||
BindAddress: b.Config.WebhookBindAddress})
|
||||
} else {
|
||||
flog.Info("Connecting using webhookbindaddress (receiving)")
|
||||
b.mh = matterhook.New(b.Config.WebhookURL,
|
||||
matterhook.Config{InsecureSkipVerify: b.Config.SkipTLSVerify,
|
||||
BindAddress: b.Config.WebhookBindAddress})
|
||||
}
|
||||
flog.Info("Connection succeeded")
|
||||
go b.handleSlack()
|
||||
return nil
|
||||
}
|
||||
if b.Config.WebhookURL != "" {
|
||||
flog.Info("Connecting using webhookurl (sending)")
|
||||
b.mh = matterhook.New(b.Config.WebhookURL,
|
||||
matterhook.Config{InsecureSkipVerify: b.Config.SkipTLSVerify,
|
||||
DisableServer: true})
|
||||
if b.Config.Token != "" {
|
||||
flog.Info("Connecting using token (receiving)")
|
||||
b.sc = slack.New(b.Config.Token)
|
||||
b.rtm = b.sc.NewRTM()
|
||||
go b.rtm.ManageConnection()
|
||||
go b.handleSlack()
|
||||
}
|
||||
} else if b.Config.Token != "" {
|
||||
flog.Info("Connecting using token (sending and receiving)")
|
||||
b.sc = slack.New(b.Config.Token)
|
||||
b.rtm = b.sc.NewRTM()
|
||||
go b.rtm.ManageConnection()
|
||||
go b.handleSlack()
|
||||
}
|
||||
if b.Config.WebhookBindAddress == "" && b.Config.WebhookURL == "" && b.Config.Token == "" {
|
||||
return errors.New("No connection method found. See that you have WebhookBindAddress, WebhookURL or Token configured.")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bslack) Disconnect() error {
|
||||
@@ -70,25 +105,27 @@ func (b *Bslack) Disconnect() error {
|
||||
|
||||
}
|
||||
|
||||
func (b *Bslack) JoinChannel(channel string) error {
|
||||
func (b *Bslack) JoinChannel(channel config.ChannelInfo) error {
|
||||
// we can only join channels using the API
|
||||
if b.Config.UseAPI {
|
||||
if b.sc != nil {
|
||||
if strings.HasPrefix(b.Config.Token, "xoxb") {
|
||||
// TODO check if bot has already joined channel
|
||||
return nil
|
||||
}
|
||||
_, err := b.sc.JoinChannel(channel)
|
||||
_, err := b.sc.JoinChannel(channel.Name)
|
||||
if err != nil {
|
||||
if err.Error() != "name_taken" {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bslack) Send(msg config.Message) error {
|
||||
func (b *Bslack) Send(msg config.Message) (string, error) {
|
||||
flog.Debugf("Receiving %#v", msg)
|
||||
if msg.Account == b.Account {
|
||||
return nil
|
||||
if msg.Event == config.EVENT_USER_ACTION {
|
||||
msg.Text = "_" + msg.Text + "_"
|
||||
}
|
||||
nick := msg.Username
|
||||
message := msg.Text
|
||||
@@ -96,7 +133,7 @@ func (b *Bslack) Send(msg config.Message) error {
|
||||
if b.Config.PrefixMessagesWithNick {
|
||||
message = nick + " " + message
|
||||
}
|
||||
if !b.Config.UseAPI {
|
||||
if b.Config.WebhookURL != "" {
|
||||
matterMessage := matterhook.OMessage{IconURL: b.Config.IconURL}
|
||||
matterMessage.Channel = channel
|
||||
matterMessage.UserName = nick
|
||||
@@ -105,31 +142,70 @@ func (b *Bslack) Send(msg config.Message) error {
|
||||
err := b.mh.Send(matterMessage)
|
||||
if err != nil {
|
||||
flog.Info(err)
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
return nil
|
||||
return "", nil
|
||||
}
|
||||
schannel, err := b.getChannelByName(channel)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
np := slack.NewPostMessageParameters()
|
||||
if b.Config.PrefixMessagesWithNick == true {
|
||||
if b.Config.PrefixMessagesWithNick {
|
||||
np.AsUser = true
|
||||
}
|
||||
np.Username = nick
|
||||
np.IconURL = config.GetIconURL(&msg, b.Config)
|
||||
np.IconURL = config.GetIconURL(&msg, &b.Config)
|
||||
if msg.Avatar != "" {
|
||||
np.IconURL = msg.Avatar
|
||||
}
|
||||
b.sc.PostMessage(schannel.ID, message, np)
|
||||
np.Attachments = append(np.Attachments, slack.Attachment{CallbackID: "matterbridge"})
|
||||
np.Attachments = append(np.Attachments, b.createAttach(msg.Extra)...)
|
||||
|
||||
/*
|
||||
newmsg := b.rtm.NewOutgoingMessage(message, schannel.ID)
|
||||
b.rtm.SendMessage(newmsg)
|
||||
*/
|
||||
// replace mentions
|
||||
np.LinkNames = 1
|
||||
|
||||
return nil
|
||||
if msg.Event == config.EVENT_MSG_DELETE {
|
||||
// some protocols echo deletes, but with empty ID
|
||||
if msg.ID == "" {
|
||||
return "", nil
|
||||
}
|
||||
// we get a "slack <ID>", split it
|
||||
ts := strings.Fields(msg.ID)
|
||||
b.sc.DeleteMessage(schannel.ID, ts[1])
|
||||
return "", nil
|
||||
}
|
||||
// if we have no ID it means we're creating a new message, not updating an existing one
|
||||
if msg.ID != "" {
|
||||
ts := strings.Fields(msg.ID)
|
||||
b.sc.UpdateMessage(schannel.ID, ts[1], message)
|
||||
return "", nil
|
||||
}
|
||||
|
||||
if msg.Extra != nil {
|
||||
// check if we have files to upload (from slack, telegram or mattermost)
|
||||
if len(msg.Extra["file"]) > 0 {
|
||||
var err error
|
||||
for _, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
_, err = b.sc.UploadFile(slack.FileUploadParameters{
|
||||
Reader: bytes.NewReader(*fi.Data),
|
||||
Filename: fi.Name,
|
||||
Channels: []string{schannel.ID},
|
||||
InitialComment: fi.Comment,
|
||||
})
|
||||
if err != nil {
|
||||
flog.Errorf("uploadfile %#v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_, id, err := b.sc.PostMessage(schannel.ID, message, np)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return "slack " + id, nil
|
||||
}
|
||||
|
||||
func (b *Bslack) getAvatar(user string) string {
|
||||
@@ -169,54 +245,139 @@ func (b *Bslack) getChannelByID(ID string) (*slack.Channel, error) {
|
||||
}
|
||||
|
||||
func (b *Bslack) handleSlack() {
|
||||
flog.Debugf("Choosing API based slack connection: %t", b.Config.UseAPI)
|
||||
mchan := make(chan *MMMessage)
|
||||
if b.Config.UseAPI {
|
||||
go b.handleSlackClient(mchan)
|
||||
} else {
|
||||
if b.Config.WebhookBindAddress != "" {
|
||||
flog.Debugf("Choosing webhooks based receiving")
|
||||
go b.handleMatterHook(mchan)
|
||||
} else {
|
||||
flog.Debugf("Choosing token based receiving")
|
||||
go b.handleSlackClient(mchan)
|
||||
}
|
||||
time.Sleep(time.Second)
|
||||
flog.Debug("Start listening for Slack messages")
|
||||
for message := range mchan {
|
||||
// do not send messages from ourself
|
||||
if b.Config.UseAPI && message.Username == b.si.User.Name {
|
||||
if b.Config.WebhookURL == "" && b.Config.WebhookBindAddress == "" && message.Username == b.si.User.Name {
|
||||
continue
|
||||
}
|
||||
texts := strings.Split(message.Text, "\n")
|
||||
for _, text := range texts {
|
||||
flog.Debugf("Sending message from %s on %s to gateway", message.Username, b.Account)
|
||||
b.Remote <- config.Message{Text: text, Username: message.Username, Channel: message.Channel, Account: b.Account, Avatar: b.getAvatar(message.Username)}
|
||||
if (message.Text == "" || message.Username == "") && message.Raw.SubType != "message_deleted" {
|
||||
continue
|
||||
}
|
||||
text := message.Text
|
||||
text = b.replaceURL(text)
|
||||
text = html.UnescapeString(text)
|
||||
flog.Debugf("Sending message from %s on %s to gateway", message.Username, b.Account)
|
||||
msg := config.Message{Text: text, Username: message.Username, Channel: message.Channel, Account: b.Account, Avatar: b.getAvatar(message.Username), UserID: message.UserID, ID: "slack " + message.Raw.Timestamp, Extra: make(map[string][]interface{})}
|
||||
if message.Raw.SubType == "me_message" {
|
||||
msg.Event = config.EVENT_USER_ACTION
|
||||
}
|
||||
if message.Raw.SubType == "channel_leave" || message.Raw.SubType == "channel_join" {
|
||||
msg.Username = "system"
|
||||
msg.Event = config.EVENT_JOIN_LEAVE
|
||||
}
|
||||
// edited messages have a submessage, use this timestamp
|
||||
if message.Raw.SubMessage != nil {
|
||||
msg.ID = "slack " + message.Raw.SubMessage.Timestamp
|
||||
}
|
||||
if message.Raw.SubType == "message_deleted" {
|
||||
msg.Text = config.EVENT_MSG_DELETE
|
||||
msg.Event = config.EVENT_MSG_DELETE
|
||||
msg.ID = "slack " + message.Raw.DeletedTimestamp
|
||||
}
|
||||
|
||||
// if we have a file attached, download it (in memory) and put a pointer to it in msg.Extra
|
||||
if message.Raw.File != nil {
|
||||
// limit to 1MB for now
|
||||
if message.Raw.File.Size <= b.General.MediaDownloadSize {
|
||||
comment := ""
|
||||
data, err := b.downloadFile(message.Raw.File.URLPrivateDownload)
|
||||
if err != nil {
|
||||
flog.Errorf("download %s failed %#v", message.Raw.File.URLPrivateDownload, err)
|
||||
} else {
|
||||
results := regexp.MustCompile(`.*?commented: (.*)`).FindAllStringSubmatch(msg.Text, -1)
|
||||
if len(results) > 0 {
|
||||
comment = results[0][1]
|
||||
}
|
||||
msg.Extra["file"] = append(msg.Extra["file"], config.FileInfo{Name: message.Raw.File.Name, Data: data, Comment: comment})
|
||||
}
|
||||
}
|
||||
}
|
||||
flog.Debugf("Message is %#v", msg)
|
||||
b.Remote <- msg
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Bslack) handleSlackClient(mchan chan *MMMessage) {
|
||||
count := 0
|
||||
for msg := range b.rtm.IncomingEvents {
|
||||
if msg.Type != "user_typing" && msg.Type != "latency_report" {
|
||||
flog.Debugf("Receiving from slackclient %#v", msg.Data)
|
||||
}
|
||||
switch ev := msg.Data.(type) {
|
||||
case *slack.MessageEvent:
|
||||
// ignore first message
|
||||
if count > 0 {
|
||||
flog.Debugf("Receiving from slackclient %#v", ev)
|
||||
if len(ev.Attachments) > 0 {
|
||||
// skip messages we made ourselves
|
||||
if ev.Attachments[0].CallbackID == "matterbridge" {
|
||||
continue
|
||||
}
|
||||
}
|
||||
if !b.Config.EditDisable && ev.SubMessage != nil && ev.SubMessage.ThreadTimestamp != ev.SubMessage.Timestamp {
|
||||
flog.Debugf("SubMessage %#v", ev.SubMessage)
|
||||
ev.User = ev.SubMessage.User
|
||||
ev.Text = ev.SubMessage.Text + b.Config.EditSuffix
|
||||
|
||||
// it seems ev.SubMessage.Edited == nil when slack unfurls
|
||||
// do not forward these messages #266
|
||||
if ev.SubMessage.Edited == nil {
|
||||
continue
|
||||
}
|
||||
}
|
||||
// use our own func because rtm.GetChannelInfo doesn't work for private channels
|
||||
channel, err := b.getChannelByID(ev.Channel)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
m := &MMMessage{}
|
||||
if ev.BotID == "" && ev.SubType != "message_deleted" {
|
||||
user, err := b.rtm.GetUserInfo(ev.User)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
m := &MMMessage{}
|
||||
m.UserID = user.ID
|
||||
m.Username = user.Name
|
||||
if user.Profile.DisplayName != "" {
|
||||
m.Username = user.Profile.DisplayName
|
||||
}
|
||||
}
|
||||
m.Channel = channel.Name
|
||||
m.Text = ev.Text
|
||||
if m.Text == "" {
|
||||
for _, attach := range ev.Attachments {
|
||||
if attach.Text != "" {
|
||||
m.Text = attach.Text
|
||||
} else {
|
||||
m.Text = attach.Fallback
|
||||
}
|
||||
}
|
||||
}
|
||||
m.Raw = ev
|
||||
m.Text = b.replaceMention(m.Text)
|
||||
mchan <- m
|
||||
m.Text = b.replaceVariable(m.Text)
|
||||
m.Text = b.replaceChannel(m.Text)
|
||||
// when using webhookURL we can't check if it's our webhook or not for now
|
||||
if ev.BotID != "" && b.Config.WebhookURL == "" {
|
||||
bot, err := b.rtm.GetBotInfo(ev.BotID)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
count++
|
||||
if bot.Name != "" {
|
||||
m.Username = bot.Name
|
||||
if ev.Username != "" {
|
||||
m.Username = ev.Username
|
||||
}
|
||||
m.UserID = bot.ID
|
||||
}
|
||||
}
|
||||
mchan <- m
|
||||
case *slack.OutgoingErrorEvent:
|
||||
flog.Debugf("%#v", ev.Error())
|
||||
case *slack.ChannelJoinedEvent:
|
||||
@@ -235,6 +396,8 @@ func (b *Bslack) handleSlackClient(mchan chan *MMMessage) {
|
||||
}
|
||||
case *slack.InvalidAuthEvent:
|
||||
flog.Fatalf("Invalid Token %#v", ev)
|
||||
case *slack.ConnectionErrorEvent:
|
||||
flog.Errorf("Connection failed %#v %#v", ev.Error(), ev.ErrorObj)
|
||||
default:
|
||||
}
|
||||
}
|
||||
@@ -248,6 +411,8 @@ func (b *Bslack) handleMatterHook(mchan chan *MMMessage) {
|
||||
m.Username = message.UserName
|
||||
m.Text = message.Text
|
||||
m.Text = b.replaceMention(m.Text)
|
||||
m.Text = b.replaceVariable(m.Text)
|
||||
m.Text = b.replaceChannel(m.Text)
|
||||
m.Channel = message.ChannelName
|
||||
if m.Username == "slackbot" {
|
||||
continue
|
||||
@@ -259,17 +424,91 @@ func (b *Bslack) handleMatterHook(mchan chan *MMMessage) {
|
||||
func (b *Bslack) userName(id string) string {
|
||||
for _, u := range b.Users {
|
||||
if u.ID == id {
|
||||
if u.Profile.DisplayName != "" {
|
||||
return u.Profile.DisplayName
|
||||
}
|
||||
return u.Name
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// @see https://api.slack.com/docs/message-formatting#linking_to_channels_and_users
|
||||
func (b *Bslack) replaceMention(text string) string {
|
||||
results := regexp.MustCompile(`<@([a-zA-z0-9]+)>`).FindAllStringSubmatch(text, -1)
|
||||
for _, r := range results {
|
||||
text = strings.Replace(text, "<@"+r[1]+">", "@"+b.userName(r[1]), -1)
|
||||
|
||||
}
|
||||
return text
|
||||
}
|
||||
|
||||
// @see https://api.slack.com/docs/message-formatting#linking_to_channels_and_users
|
||||
func (b *Bslack) replaceChannel(text string) string {
|
||||
results := regexp.MustCompile(`<#[a-zA-Z0-9]+\|(.+?)>`).FindAllStringSubmatch(text, -1)
|
||||
for _, r := range results {
|
||||
text = strings.Replace(text, r[0], "#"+r[1], -1)
|
||||
}
|
||||
return text
|
||||
}
|
||||
|
||||
// @see https://api.slack.com/docs/message-formatting#variables
|
||||
func (b *Bslack) replaceVariable(text string) string {
|
||||
results := regexp.MustCompile(`<!([a-zA-Z0-9]+)(\|.+?)?>`).FindAllStringSubmatch(text, -1)
|
||||
for _, r := range results {
|
||||
text = strings.Replace(text, r[0], "@"+r[1], -1)
|
||||
}
|
||||
return text
|
||||
}
|
||||
|
||||
// @see https://api.slack.com/docs/message-formatting#linking_to_urls
|
||||
func (b *Bslack) replaceURL(text string) string {
|
||||
results := regexp.MustCompile(`<(.*?)(\|.*?)?>`).FindAllStringSubmatch(text, -1)
|
||||
for _, r := range results {
|
||||
text = strings.Replace(text, r[0], r[1], -1)
|
||||
}
|
||||
return text
|
||||
}
|
||||
|
||||
func (b *Bslack) createAttach(extra map[string][]interface{}) []slack.Attachment {
|
||||
var attachs []slack.Attachment
|
||||
for _, v := range extra["attachments"] {
|
||||
entry := v.(map[string]interface{})
|
||||
s := slack.Attachment{}
|
||||
s.Fallback = entry["fallback"].(string)
|
||||
s.Color = entry["color"].(string)
|
||||
s.Pretext = entry["pretext"].(string)
|
||||
s.AuthorName = entry["author_name"].(string)
|
||||
s.AuthorLink = entry["author_link"].(string)
|
||||
s.AuthorIcon = entry["author_icon"].(string)
|
||||
s.Title = entry["title"].(string)
|
||||
s.TitleLink = entry["title_link"].(string)
|
||||
s.Text = entry["text"].(string)
|
||||
s.ImageURL = entry["image_url"].(string)
|
||||
s.ThumbURL = entry["thumb_url"].(string)
|
||||
s.Footer = entry["footer"].(string)
|
||||
s.FooterIcon = entry["footer_icon"].(string)
|
||||
attachs = append(attachs, s)
|
||||
}
|
||||
return attachs
|
||||
}
|
||||
|
||||
func (b *Bslack) downloadFile(url string) (*[]byte, error) {
|
||||
var buf bytes.Buffer
|
||||
client := &http.Client{
|
||||
Timeout: time.Second * 5,
|
||||
}
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.Header.Add("Authorization", "Bearer "+b.Config.Token)
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
resp.Body.Close()
|
||||
return nil, err
|
||||
}
|
||||
io.Copy(&buf, resp.Body)
|
||||
data := buf.Bytes()
|
||||
resp.Body.Close()
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
132
bridge/sshchat/sshchat.go
Normal file
132
bridge/sshchat/sshchat.go
Normal file
@@ -0,0 +1,132 @@
|
||||
package bsshchat
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"github.com/shazow/ssh-chat/sshd"
|
||||
"io"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Bsshchat struct {
|
||||
r *bufio.Scanner
|
||||
w io.WriteCloser
|
||||
*config.BridgeConfig
|
||||
}
|
||||
|
||||
var flog *log.Entry
|
||||
var protocol = "sshchat"
|
||||
|
||||
func init() {
|
||||
flog = log.WithFields(log.Fields{"module": protocol})
|
||||
}
|
||||
|
||||
func New(cfg *config.BridgeConfig) *Bsshchat {
|
||||
return &Bsshchat{BridgeConfig: cfg}
|
||||
}
|
||||
|
||||
func (b *Bsshchat) Connect() error {
|
||||
var err error
|
||||
flog.Infof("Connecting %s", b.Config.Server)
|
||||
go func() {
|
||||
err = sshd.ConnectShell(b.Config.Server, b.Config.Nick, func(r io.Reader, w io.WriteCloser) error {
|
||||
b.r = bufio.NewScanner(r)
|
||||
b.w = w
|
||||
b.r.Scan()
|
||||
w.Write([]byte("/theme mono\r\n"))
|
||||
b.handleSshChat()
|
||||
return nil
|
||||
})
|
||||
}()
|
||||
if err != nil {
|
||||
flog.Debugf("%#v", err)
|
||||
return err
|
||||
}
|
||||
flog.Info("Connection succeeded")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bsshchat) Disconnect() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bsshchat) JoinChannel(channel config.ChannelInfo) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bsshchat) Send(msg config.Message) (string, error) {
|
||||
// ignore delete messages
|
||||
if msg.Event == config.EVENT_MSG_DELETE {
|
||||
return "", nil
|
||||
}
|
||||
flog.Debugf("Receiving %#v", msg)
|
||||
if msg.Extra != nil {
|
||||
if len(msg.Extra["file"]) > 0 {
|
||||
for _, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
if fi.URL != "" {
|
||||
msg.Text = fi.URL
|
||||
}
|
||||
b.w.Write([]byte(msg.Username + msg.Text))
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
}
|
||||
b.w.Write([]byte(msg.Username + msg.Text + "\r\n"))
|
||||
return "", nil
|
||||
}
|
||||
|
||||
/*
|
||||
func (b *Bsshchat) sshchatKeepAlive() chan bool {
|
||||
done := make(chan bool)
|
||||
go func() {
|
||||
ticker := time.NewTicker(90 * time.Second)
|
||||
defer ticker.Stop()
|
||||
for {
|
||||
select {
|
||||
case <-ticker.C:
|
||||
flog.Debugf("PING")
|
||||
err := b.xc.PingC2S("", "")
|
||||
if err != nil {
|
||||
flog.Debugf("PING failed %#v", err)
|
||||
}
|
||||
case <-done:
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
return done
|
||||
}
|
||||
*/
|
||||
|
||||
func stripPrompt(s string) string {
|
||||
pos := strings.LastIndex(s, "\033[K")
|
||||
if pos < 0 {
|
||||
return s
|
||||
}
|
||||
return s[pos+3:]
|
||||
}
|
||||
|
||||
func (b *Bsshchat) handleSshChat() error {
|
||||
/*
|
||||
done := b.sshchatKeepAlive()
|
||||
defer close(done)
|
||||
*/
|
||||
wait := true
|
||||
for {
|
||||
if b.r.Scan() {
|
||||
res := strings.Split(stripPrompt(b.r.Text()), ":")
|
||||
if res[0] == "-> Set theme" {
|
||||
wait = false
|
||||
log.Debugf("mono found, allowing")
|
||||
continue
|
||||
}
|
||||
if !wait {
|
||||
flog.Debugf("message %#v", res)
|
||||
rmsg := config.Message{Username: res[0], Text: strings.Join(res[1:], ":"), Channel: "sshchat", Account: b.Account, UserID: "nick"}
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
164
bridge/steam/steam.go
Normal file
164
bridge/steam/steam.go
Normal file
@@ -0,0 +1,164 @@
|
||||
package bsteam
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/Philipp15b/go-steam"
|
||||
"github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
"github.com/Philipp15b/go-steam/steamid"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
//"io/ioutil"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Bsteam struct {
|
||||
c *steam.Client
|
||||
connected chan struct{}
|
||||
userMap map[steamid.SteamId]string
|
||||
sync.RWMutex
|
||||
*config.BridgeConfig
|
||||
}
|
||||
|
||||
var flog *log.Entry
|
||||
var protocol = "steam"
|
||||
|
||||
func init() {
|
||||
flog = log.WithFields(log.Fields{"module": protocol})
|
||||
}
|
||||
|
||||
func New(cfg *config.BridgeConfig) *Bsteam {
|
||||
b := &Bsteam{BridgeConfig: cfg}
|
||||
b.userMap = make(map[steamid.SteamId]string)
|
||||
b.connected = make(chan struct{})
|
||||
return b
|
||||
}
|
||||
|
||||
func (b *Bsteam) Connect() error {
|
||||
flog.Info("Connecting")
|
||||
b.c = steam.NewClient()
|
||||
go b.handleEvents()
|
||||
go b.c.Connect()
|
||||
select {
|
||||
case <-b.connected:
|
||||
flog.Info("Connection succeeded")
|
||||
case <-time.After(time.Second * 30):
|
||||
return fmt.Errorf("connection timed out")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bsteam) Disconnect() error {
|
||||
b.c.Disconnect()
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func (b *Bsteam) JoinChannel(channel config.ChannelInfo) error {
|
||||
id, err := steamid.NewId(channel.Name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.c.Social.JoinChat(id)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bsteam) Send(msg config.Message) (string, error) {
|
||||
// ignore delete messages
|
||||
if msg.Event == config.EVENT_MSG_DELETE {
|
||||
return "", nil
|
||||
}
|
||||
id, err := steamid.NewId(msg.Channel)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
b.c.Social.SendMessage(id, steamlang.EChatEntryType_ChatMsg, msg.Username+msg.Text)
|
||||
return "", nil
|
||||
}
|
||||
|
||||
func (b *Bsteam) getNick(id steamid.SteamId) string {
|
||||
b.RLock()
|
||||
defer b.RUnlock()
|
||||
if name, ok := b.userMap[id]; ok {
|
||||
return name
|
||||
}
|
||||
return "unknown"
|
||||
}
|
||||
|
||||
func (b *Bsteam) handleEvents() {
|
||||
myLoginInfo := new(steam.LogOnDetails)
|
||||
myLoginInfo.Username = b.Config.Login
|
||||
myLoginInfo.Password = b.Config.Password
|
||||
myLoginInfo.AuthCode = b.Config.AuthCode
|
||||
// Attempt to read existing auth hash to avoid steam guard.
|
||||
// Maybe works
|
||||
//myLoginInfo.SentryFileHash, _ = ioutil.ReadFile("sentry")
|
||||
for event := range b.c.Events() {
|
||||
//flog.Info(event)
|
||||
switch e := event.(type) {
|
||||
case *steam.ChatMsgEvent:
|
||||
flog.Debugf("Receiving ChatMsgEvent: %#v", e)
|
||||
flog.Debugf("Sending message from %s on %s to gateway", b.getNick(e.ChatterId), b.Account)
|
||||
var channel int64
|
||||
if e.ChatRoomId == 0 {
|
||||
channel = int64(e.ChatterId)
|
||||
} else {
|
||||
// for some reason we have to remove 0x18000000000000
|
||||
channel = int64(e.ChatRoomId) - 0x18000000000000
|
||||
}
|
||||
msg := config.Message{Username: b.getNick(e.ChatterId), Text: e.Message, Channel: strconv.FormatInt(channel, 10), Account: b.Account, UserID: strconv.FormatInt(int64(e.ChatterId), 10)}
|
||||
b.Remote <- msg
|
||||
case *steam.PersonaStateEvent:
|
||||
flog.Debugf("PersonaStateEvent: %#v\n", e)
|
||||
b.Lock()
|
||||
b.userMap[e.FriendId] = e.Name
|
||||
b.Unlock()
|
||||
case *steam.ConnectedEvent:
|
||||
b.c.Auth.LogOn(myLoginInfo)
|
||||
case *steam.MachineAuthUpdateEvent:
|
||||
/*
|
||||
flog.Info("authupdate", e)
|
||||
flog.Info("hash", e.Hash)
|
||||
ioutil.WriteFile("sentry", e.Hash, 0666)
|
||||
*/
|
||||
case *steam.LogOnFailedEvent:
|
||||
flog.Info("Logon failed", e)
|
||||
switch e.Result {
|
||||
case steamlang.EResult_AccountLogonDeniedNeedTwoFactorCode:
|
||||
{
|
||||
flog.Info("Steam guard isn't letting me in! Enter 2FA code:")
|
||||
var code string
|
||||
fmt.Scanf("%s", &code)
|
||||
myLoginInfo.TwoFactorCode = code
|
||||
}
|
||||
case steamlang.EResult_AccountLogonDenied:
|
||||
{
|
||||
flog.Info("Steam guard isn't letting me in! Enter auth code:")
|
||||
var code string
|
||||
fmt.Scanf("%s", &code)
|
||||
myLoginInfo.AuthCode = code
|
||||
}
|
||||
default:
|
||||
log.Errorf("LogOnFailedEvent: %#v ", e.Result)
|
||||
// TODO: Handle EResult_InvalidLoginAuthCode
|
||||
return
|
||||
}
|
||||
case *steam.LoggedOnEvent:
|
||||
flog.Debugf("LoggedOnEvent: %#v", e)
|
||||
b.connected <- struct{}{}
|
||||
flog.Debugf("setting online")
|
||||
b.c.Social.SetPersonaState(steamlang.EPersonaState_Online)
|
||||
case *steam.DisconnectedEvent:
|
||||
flog.Info("Disconnected")
|
||||
flog.Info("Attempting to reconnect...")
|
||||
b.c.Connect()
|
||||
case steam.FatalErrorEvent:
|
||||
flog.Error(e)
|
||||
case error:
|
||||
flog.Error(e)
|
||||
default:
|
||||
flog.Debugf("unknown event %#v", e)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,18 +1,19 @@
|
||||
package btelegram
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/42wim/matterbridge/bridge/helper"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
)
|
||||
|
||||
type Btelegram struct {
|
||||
c *tgbotapi.BotAPI
|
||||
Config *config.Protocol
|
||||
Remote chan config.Message
|
||||
Account string
|
||||
*config.BridgeConfig
|
||||
}
|
||||
|
||||
var flog *log.Entry
|
||||
@@ -22,12 +23,8 @@ func init() {
|
||||
flog = log.WithFields(log.Fields{"module": protocol})
|
||||
}
|
||||
|
||||
func New(cfg config.Protocol, account string, c chan config.Message) *Btelegram {
|
||||
b := &Btelegram{}
|
||||
b.Config = &cfg
|
||||
b.Remote = c
|
||||
b.Account = account
|
||||
return b
|
||||
func New(cfg *config.BridgeConfig) *Btelegram {
|
||||
return &Btelegram{BridgeConfig: cfg}
|
||||
}
|
||||
|
||||
func (b *Btelegram) Connect() error {
|
||||
@@ -38,7 +35,9 @@ func (b *Btelegram) Connect() error {
|
||||
flog.Debugf("%#v", err)
|
||||
return err
|
||||
}
|
||||
updates, err := b.c.GetUpdatesChan(tgbotapi.NewUpdate(0))
|
||||
u := tgbotapi.NewUpdate(0)
|
||||
u.Timeout = 60
|
||||
updates, err := b.c.GetUpdatesChan(u)
|
||||
if err != nil {
|
||||
flog.Debugf("%#v", err)
|
||||
return err
|
||||
@@ -53,61 +52,274 @@ func (b *Btelegram) Disconnect() error {
|
||||
|
||||
}
|
||||
|
||||
func (b *Btelegram) JoinChannel(channel string) error {
|
||||
func (b *Btelegram) JoinChannel(channel config.ChannelInfo) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Btelegram) Send(msg config.Message) error {
|
||||
func (b *Btelegram) Send(msg config.Message) (string, error) {
|
||||
flog.Debugf("Receiving %#v", msg)
|
||||
chatid, err := strconv.ParseInt(msg.Channel, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
|
||||
if b.Config.MessageFormat == "HTML" {
|
||||
msg.Text = makeHTML(msg.Text)
|
||||
}
|
||||
m := tgbotapi.NewMessage(chatid, msg.Username+msg.Text)
|
||||
|
||||
if msg.Event == config.EVENT_MSG_DELETE {
|
||||
if msg.ID == "" {
|
||||
return "", nil
|
||||
}
|
||||
msgid, err := strconv.Atoi(msg.ID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
_, err = b.c.DeleteMessage(tgbotapi.DeleteMessageConfig{ChatID: chatid, MessageID: msgid})
|
||||
return "", err
|
||||
}
|
||||
|
||||
// edit the message if we have a msg ID
|
||||
if msg.ID != "" {
|
||||
msgid, err := strconv.Atoi(msg.ID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
m := tgbotapi.NewEditMessageText(chatid, msgid, msg.Username+msg.Text)
|
||||
if b.Config.MessageFormat == "HTML" {
|
||||
m.ParseMode = tgbotapi.ModeHTML
|
||||
}
|
||||
_, err = b.c.Send(m)
|
||||
return err
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
|
||||
if msg.Extra != nil {
|
||||
// check if we have files to upload (from slack, telegram or mattermost)
|
||||
if len(msg.Extra["file"]) > 0 {
|
||||
var c tgbotapi.Chattable
|
||||
for _, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
file := tgbotapi.FileBytes{fi.Name, *fi.Data}
|
||||
re := regexp.MustCompile(".(jpg|png)$")
|
||||
if re.MatchString(fi.Name) {
|
||||
c = tgbotapi.NewPhotoUpload(chatid, file)
|
||||
} else {
|
||||
c = tgbotapi.NewDocumentUpload(chatid, file)
|
||||
}
|
||||
_, err := b.c.Send(c)
|
||||
if err != nil {
|
||||
log.Errorf("file upload failed: %#v", err)
|
||||
}
|
||||
if fi.Comment != "" {
|
||||
b.sendMessage(chatid, msg.Username+fi.Comment)
|
||||
}
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
}
|
||||
return b.sendMessage(chatid, msg.Username+msg.Text)
|
||||
}
|
||||
|
||||
func (b *Btelegram) handleRecv(updates <-chan tgbotapi.Update) {
|
||||
username := ""
|
||||
text := ""
|
||||
channel := ""
|
||||
for update := range updates {
|
||||
flog.Debugf("Receiving from telegram: %#v", update.Message)
|
||||
var message *tgbotapi.Message
|
||||
username := ""
|
||||
channel := ""
|
||||
text := ""
|
||||
|
||||
fmsg := config.Message{Extra: make(map[string][]interface{})}
|
||||
|
||||
// handle channels
|
||||
if update.ChannelPost != nil {
|
||||
if update.ChannelPost.From != nil {
|
||||
username = update.ChannelPost.From.FirstName
|
||||
if username == "" {
|
||||
username = update.ChannelPost.From.UserName
|
||||
message = update.ChannelPost
|
||||
}
|
||||
}
|
||||
text = update.ChannelPost.Text
|
||||
channel = strconv.FormatInt(update.ChannelPost.Chat.ID, 10)
|
||||
if update.EditedChannelPost != nil && !b.Config.EditDisable {
|
||||
message = update.EditedChannelPost
|
||||
message.Text = message.Text + b.Config.EditSuffix
|
||||
}
|
||||
// handle groups
|
||||
if update.Message != nil {
|
||||
if update.Message.From != nil {
|
||||
username = update.Message.From.FirstName
|
||||
message = update.Message
|
||||
}
|
||||
if update.EditedMessage != nil && !b.Config.EditDisable {
|
||||
message = update.EditedMessage
|
||||
message.Text = message.Text + b.Config.EditSuffix
|
||||
}
|
||||
if message.From != nil {
|
||||
if b.Config.UseFirstName {
|
||||
username = message.From.FirstName
|
||||
}
|
||||
if username == "" {
|
||||
username = update.Message.From.UserName
|
||||
username = message.From.UserName
|
||||
if username == "" {
|
||||
username = message.From.FirstName
|
||||
}
|
||||
}
|
||||
text = update.Message.Text
|
||||
channel = strconv.FormatInt(update.Message.Chat.ID, 10)
|
||||
text = message.Text
|
||||
channel = strconv.FormatInt(message.Chat.ID, 10)
|
||||
}
|
||||
|
||||
if username == "" {
|
||||
username = "unknown"
|
||||
}
|
||||
if text != "" {
|
||||
if message.Sticker != nil {
|
||||
b.handleDownload(message.Sticker, &fmsg)
|
||||
}
|
||||
if message.Video != nil {
|
||||
b.handleDownload(message.Video, &fmsg)
|
||||
}
|
||||
if message.Photo != nil {
|
||||
b.handleDownload(message.Photo, &fmsg)
|
||||
}
|
||||
if message.Document != nil {
|
||||
b.handleDownload(message.Document, &fmsg)
|
||||
}
|
||||
if message.Voice != nil {
|
||||
b.handleDownload(message.Voice, &fmsg)
|
||||
}
|
||||
if message.Audio != nil {
|
||||
b.handleDownload(message.Audio, &fmsg)
|
||||
}
|
||||
|
||||
if message.ForwardFrom != nil {
|
||||
usernameForward := ""
|
||||
if b.Config.UseFirstName {
|
||||
usernameForward = message.ForwardFrom.FirstName
|
||||
}
|
||||
if usernameForward == "" {
|
||||
usernameForward = message.ForwardFrom.UserName
|
||||
if usernameForward == "" {
|
||||
usernameForward = message.ForwardFrom.FirstName
|
||||
}
|
||||
}
|
||||
if usernameForward == "" {
|
||||
usernameForward = "unknown"
|
||||
}
|
||||
text = "Forwarded from " + usernameForward + ": " + text
|
||||
}
|
||||
|
||||
// quote the previous message
|
||||
if message.ReplyToMessage != nil {
|
||||
usernameReply := ""
|
||||
if message.ReplyToMessage.From != nil {
|
||||
if b.Config.UseFirstName {
|
||||
usernameReply = message.ReplyToMessage.From.FirstName
|
||||
}
|
||||
if usernameReply == "" {
|
||||
usernameReply = message.ReplyToMessage.From.UserName
|
||||
if usernameReply == "" {
|
||||
usernameReply = message.ReplyToMessage.From.FirstName
|
||||
}
|
||||
}
|
||||
}
|
||||
if usernameReply == "" {
|
||||
usernameReply = "unknown"
|
||||
}
|
||||
text = text + " (re @" + usernameReply + ":" + message.ReplyToMessage.Text + ")"
|
||||
}
|
||||
|
||||
if text != "" || len(fmsg.Extra) > 0 {
|
||||
flog.Debugf("Sending message from %s on %s to gateway", username, b.Account)
|
||||
b.Remote <- config.Message{Username: username, Text: text, Channel: channel, Account: b.Account}
|
||||
msg := config.Message{Username: username, Text: text, Channel: channel, Account: b.Account, UserID: strconv.Itoa(message.From.ID), ID: strconv.Itoa(message.MessageID), Extra: fmsg.Extra}
|
||||
flog.Debugf("Message is %#v", msg)
|
||||
b.Remote <- msg
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Btelegram) getFileDirectURL(id string) string {
|
||||
res, err := b.c.GetFileDirectURL(id)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (b *Btelegram) handleDownload(file interface{}, msg *config.Message) {
|
||||
size := 0
|
||||
url := ""
|
||||
name := ""
|
||||
text := ""
|
||||
fileid := ""
|
||||
switch v := file.(type) {
|
||||
case *tgbotapi.Audio:
|
||||
size = v.FileSize
|
||||
url = b.getFileDirectURL(v.FileID)
|
||||
urlPart := strings.Split(url, "/")
|
||||
name = urlPart[len(urlPart)-1]
|
||||
text = " " + url
|
||||
fileid = v.FileID
|
||||
case *tgbotapi.Voice:
|
||||
size = v.FileSize
|
||||
url = b.getFileDirectURL(v.FileID)
|
||||
urlPart := strings.Split(url, "/")
|
||||
name = urlPart[len(urlPart)-1]
|
||||
text = " " + url
|
||||
if !strings.HasSuffix(name, ".ogg") {
|
||||
name = name + ".ogg"
|
||||
}
|
||||
fileid = v.FileID
|
||||
case *tgbotapi.Sticker:
|
||||
size = v.FileSize
|
||||
url = b.getFileDirectURL(v.FileID)
|
||||
urlPart := strings.Split(url, "/")
|
||||
name = urlPart[len(urlPart)-1]
|
||||
if !strings.HasSuffix(name, ".webp") {
|
||||
name = name + ".webp"
|
||||
}
|
||||
text = " " + url
|
||||
fileid = v.FileID
|
||||
case *tgbotapi.Video:
|
||||
size = v.FileSize
|
||||
url = b.getFileDirectURL(v.FileID)
|
||||
urlPart := strings.Split(url, "/")
|
||||
name = urlPart[len(urlPart)-1]
|
||||
text = " " + url
|
||||
fileid = v.FileID
|
||||
case *[]tgbotapi.PhotoSize:
|
||||
photos := *v
|
||||
size = photos[len(photos)-1].FileSize
|
||||
url = b.getFileDirectURL(photos[len(photos)-1].FileID)
|
||||
urlPart := strings.Split(url, "/")
|
||||
name = urlPart[len(urlPart)-1]
|
||||
text = " " + url
|
||||
case *tgbotapi.Document:
|
||||
size = v.FileSize
|
||||
url = b.getFileDirectURL(v.FileID)
|
||||
name = v.FileName
|
||||
text = " " + v.FileName + " : " + url
|
||||
fileid = v.FileID
|
||||
}
|
||||
if b.Config.UseInsecureURL {
|
||||
msg.Text = text
|
||||
return
|
||||
}
|
||||
// if we have a file attached, download it (in memory) and put a pointer to it in msg.Extra
|
||||
// limit to 1MB for now
|
||||
flog.Debugf("trying to download %#v fileid %#v with size %#v", name, fileid, size)
|
||||
if size <= b.General.MediaDownloadSize {
|
||||
data, err := helper.DownloadFile(url)
|
||||
if err != nil {
|
||||
flog.Errorf("download %s failed %#v", url, err)
|
||||
} else {
|
||||
flog.Debugf("download OK %#v %#v %#v", name, len(*data), len(url))
|
||||
msg.Extra["file"] = append(msg.Extra["file"], config.FileInfo{Name: name, Data: data})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Btelegram) sendMessage(chatid int64, text string) (string, error) {
|
||||
m := tgbotapi.NewMessage(chatid, text)
|
||||
if b.Config.MessageFormat == "HTML" {
|
||||
m.ParseMode = tgbotapi.ModeHTML
|
||||
}
|
||||
res, err := b.c.Send(m)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return strconv.Itoa(res.MessageID), nil
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"crypto/tls"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"github.com/jpillora/backoff"
|
||||
"github.com/mattn/go-xmpp"
|
||||
|
||||
"strings"
|
||||
@@ -13,9 +14,7 @@ import (
|
||||
type Bxmpp struct {
|
||||
xc *xmpp.Client
|
||||
xmppMap map[string]string
|
||||
Config *config.Protocol
|
||||
Remote chan config.Message
|
||||
Account string
|
||||
*config.BridgeConfig
|
||||
}
|
||||
|
||||
var flog *log.Entry
|
||||
@@ -25,12 +24,9 @@ func init() {
|
||||
flog = log.WithFields(log.Fields{"module": protocol})
|
||||
}
|
||||
|
||||
func New(cfg config.Protocol, account string, c chan config.Message) *Bxmpp {
|
||||
b := &Bxmpp{}
|
||||
func New(cfg *config.BridgeConfig) *Bxmpp {
|
||||
b := &Bxmpp{BridgeConfig: cfg}
|
||||
b.xmppMap = make(map[string]string)
|
||||
b.Config = &cfg
|
||||
b.Account = account
|
||||
b.Remote = c
|
||||
return b
|
||||
}
|
||||
|
||||
@@ -43,7 +39,29 @@ func (b *Bxmpp) Connect() error {
|
||||
return err
|
||||
}
|
||||
flog.Info("Connection succeeded")
|
||||
go b.handleXmpp()
|
||||
go func() {
|
||||
initial := true
|
||||
bf := &backoff.Backoff{
|
||||
Min: time.Second,
|
||||
Max: 5 * time.Minute,
|
||||
Jitter: true,
|
||||
}
|
||||
for {
|
||||
if initial {
|
||||
b.handleXmpp()
|
||||
initial = false
|
||||
}
|
||||
d := bf.Duration()
|
||||
flog.Infof("Disconnected. Reconnecting in %s", d)
|
||||
time.Sleep(d)
|
||||
b.xc, err = b.createXMPP()
|
||||
if err == nil {
|
||||
b.Remote <- config.Message{Username: "system", Text: "rejoin", Channel: "", Account: b.Account, Event: config.EVENT_REJOIN_CHANNELS}
|
||||
b.handleXmpp()
|
||||
bf.Reset()
|
||||
}
|
||||
}
|
||||
}()
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -51,15 +69,32 @@ func (b *Bxmpp) Disconnect() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bxmpp) JoinChannel(channel string) error {
|
||||
b.xc.JoinMUCNoHistory(channel+"@"+b.Config.Muc, b.Config.Nick)
|
||||
func (b *Bxmpp) JoinChannel(channel config.ChannelInfo) error {
|
||||
b.xc.JoinMUCNoHistory(channel.Name+"@"+b.Config.Muc, b.Config.Nick)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bxmpp) Send(msg config.Message) error {
|
||||
func (b *Bxmpp) Send(msg config.Message) (string, error) {
|
||||
// ignore delete messages
|
||||
if msg.Event == config.EVENT_MSG_DELETE {
|
||||
return "", nil
|
||||
}
|
||||
flog.Debugf("Receiving %#v", msg)
|
||||
if msg.Extra != nil {
|
||||
if len(msg.Extra["file"]) > 0 {
|
||||
for _, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
if fi.URL != "" {
|
||||
msg.Text = fi.URL
|
||||
}
|
||||
b.xc.Send(xmpp.Chat{Type: "groupchat", Remote: msg.Channel + "@" + b.Config.Muc, Text: msg.Username + msg.Text})
|
||||
return nil
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
}
|
||||
|
||||
b.xc.Send(xmpp.Chat{Type: "groupchat", Remote: msg.Channel + "@" + b.Config.Muc, Text: msg.Username + msg.Text})
|
||||
return "", nil
|
||||
}
|
||||
|
||||
func (b *Bxmpp) createXMPP() (*xmpp.Client, error) {
|
||||
@@ -75,7 +110,7 @@ func (b *Bxmpp) createXMPP() (*xmpp.Client, error) {
|
||||
TLSConfig: tc,
|
||||
|
||||
//StartTLS: false,
|
||||
Debug: true,
|
||||
Debug: b.General.Debug,
|
||||
Session: true,
|
||||
Status: "",
|
||||
StatusMessage: "",
|
||||
@@ -96,7 +131,11 @@ func (b *Bxmpp) xmppKeepAlive() chan bool {
|
||||
for {
|
||||
select {
|
||||
case <-ticker.C:
|
||||
b.xc.PingC2S("", "")
|
||||
flog.Debugf("PING")
|
||||
err := b.xc.PingC2S("", "")
|
||||
if err != nil {
|
||||
flog.Debugf("PING failed %#v", err)
|
||||
}
|
||||
case <-done:
|
||||
return
|
||||
}
|
||||
@@ -106,6 +145,7 @@ func (b *Bxmpp) xmppKeepAlive() chan bool {
|
||||
}
|
||||
|
||||
func (b *Bxmpp) handleXmpp() error {
|
||||
var ok bool
|
||||
done := b.xmppKeepAlive()
|
||||
defer close(done)
|
||||
nodelay := time.Time{}
|
||||
@@ -119,16 +159,21 @@ func (b *Bxmpp) handleXmpp() error {
|
||||
var channel, nick string
|
||||
if v.Type == "groupchat" {
|
||||
s := strings.Split(v.Remote, "@")
|
||||
if len(s) == 2 {
|
||||
if len(s) >= 2 {
|
||||
channel = s[0]
|
||||
}
|
||||
s = strings.Split(s[1], "/")
|
||||
if len(s) == 2 {
|
||||
nick = s[1]
|
||||
}
|
||||
if nick != b.Config.Nick && v.Stamp == nodelay && v.Text != "" {
|
||||
if nick != b.Config.Nick && v.Stamp == nodelay && v.Text != "" && !strings.Contains(v.Text, "</subject>") {
|
||||
rmsg := config.Message{Username: nick, Text: v.Text, Channel: channel, Account: b.Account, UserID: v.Remote}
|
||||
rmsg.Text, ok = b.replaceAction(rmsg.Text)
|
||||
if ok {
|
||||
rmsg.Event = config.EVENT_USER_ACTION
|
||||
}
|
||||
flog.Debugf("Sending message from %s on %s to gateway", nick, b.Account)
|
||||
b.Remote <- config.Message{Username: nick, Text: v.Text, Channel: channel, Account: b.Account}
|
||||
b.Remote <- rmsg
|
||||
}
|
||||
}
|
||||
case xmpp.Presence:
|
||||
@@ -136,3 +181,10 @@ func (b *Bxmpp) handleXmpp() error {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (b *Bxmpp) replaceAction(text string) (string, bool) {
|
||||
if strings.HasPrefix(text, "/me ") {
|
||||
return strings.Replace(text, "/me ", "", -1), true
|
||||
}
|
||||
return text, false
|
||||
}
|
||||
|
||||
371
changelog.md
371
changelog.md
@@ -1,3 +1,374 @@
|
||||
# v1.7.1
|
||||
## Bugfix
|
||||
* telegram: Enable Long Polling for Telegram. Reduces bandwidth consumption. (#350)
|
||||
|
||||
# v1.7.0
|
||||
## New features
|
||||
* matrix: Add support for deleting messages from/to matrix (matrix). Closes #320
|
||||
* xmpp: Ignore <subject> messages (xmpp). #272
|
||||
* irc: Add twitch support (irc) to README / wiki
|
||||
|
||||
## Bugfix
|
||||
* general: Change RemoteNickFormat replacement order. Closes #336
|
||||
* general: Make edits/delete work for bridges that gets reused. Closes #342
|
||||
* general: Lowercase irc channels in config. Closes #348
|
||||
* matrix: Fix possible panics (matrix). Closes #333
|
||||
* matrix: Add an extension to images without one (matrix). #331
|
||||
* api: Obey the Gateway value from the json (api). Closes #344
|
||||
* xmpp: Print only debug messages when specified (xmpp). Closes #345
|
||||
* xmpp: Allow xmpp to receive the extra messages (file uploads) when text is empty. #295
|
||||
|
||||
# v1.6.3
|
||||
## Bugfix
|
||||
* slack: Fix connection issues
|
||||
* slack: Add more debug messages
|
||||
* irc: Convert received IRC channel names to lowercase. Fixes #329 (#330)
|
||||
|
||||
# v1.6.2
|
||||
## Bugfix
|
||||
* mattermost: Crashes while connecting to Mattermost (regression). Closes #327
|
||||
|
||||
# v1.6.1
|
||||
## Bugfix
|
||||
* general: Display of nicks not longer working (regression). Closes #323
|
||||
|
||||
# v1.6.0
|
||||
## New features
|
||||
* sshchat: New protocol support added (https://github.com/shazow/ssh-chat)
|
||||
* general: Allow specifying maximum download size of media using MediaDownloadSize (slack,telegram,matrix)
|
||||
* api: Add (simple, one listener) long-polling support (api). Closes #307
|
||||
* telegram: Add support for forwarded messages. Closes #313
|
||||
* telegram: Add support for Audio/Voice files (telegram). Closes #314
|
||||
* irc: Add RejoinDelay option. Delay to rejoin after channel kick (irc). Closes #322
|
||||
|
||||
## Bugfix
|
||||
* telegram: Also use HTML in edited messages (telegram). Closes #315
|
||||
* matrix: Fix panic (matrix). Closes #316
|
||||
|
||||
# v1.5.1
|
||||
|
||||
## Bugfix
|
||||
* irc: Fix irc ACTION regression (irc). Closes #306
|
||||
* irc: Split on UTF-8 for MessageSplit (irc). Closes #308
|
||||
|
||||
# v1.5.0
|
||||
## New features
|
||||
* general: remote mediaserver support. See MediaServerDownload and MediaServerUpload in matterbridge.toml.sample
|
||||
more information on https://github.com/42wim/matterbridge/wiki/Mediaserver-setup-%5Badvanced%5D
|
||||
* general: Add support for ReplaceNicks using regexp to replace nicks. Closes #269 (see matterbridge.toml.sample)
|
||||
* general: Add support for ReplaceMessages using regexp to replace messages. #269 (see matterbridge.toml.sample)
|
||||
* irc: Add MessageSplit option to split messages on MessageLength (irc). Closes #281
|
||||
* matrix: Add support for uploading images/video (matrix). Closes #302
|
||||
* matrix: Add support for uploaded images/video (matrix)
|
||||
|
||||
## Bugfix
|
||||
* telegram: Add webp extension to stickers if necessary (telegram)
|
||||
* mattermost: Break when re-login fails (mattermost)
|
||||
|
||||
# v1.4.1
|
||||
## Bugfix
|
||||
* telegram: fix issue with uploading for images/documents/stickers
|
||||
* slack: remove double messages sent to other bridges when uploading files
|
||||
* irc: Fix strict user handling of girc (irc). Closes #298
|
||||
|
||||
# v1.4.0
|
||||
## Breaking changes
|
||||
* general: `[general]` settings don't override the specific bridge settings
|
||||
|
||||
## New features
|
||||
* irc: Replace sorcix/irc and go-ircevent with girc, this should be give better reconnects
|
||||
* steam: Add support for bridging to individual steam chats. (steam) (#294)
|
||||
* telegram: Download files from telegram and reupload to supported bridges (telegram). #278
|
||||
* slack: Add support to upload files to slack, from bridges with private urls like slack/mattermost/telegram. (slack)
|
||||
* discord: Add support to upload files to discord, from bridges with private urls like slack/mattermost/telegram. (discord)
|
||||
* general: Add systemd service file (#291)
|
||||
* general: Add support for DEBUG=1 envvar to enable debug. Closes #283
|
||||
* general: Add StripNick option, only allow alphanumerical nicks. Closes #285
|
||||
|
||||
## Bugfix
|
||||
* gitter: Use room.URI instead of room.Name. (gitter) (#293)
|
||||
* slack: Allow slack messages with variables (eg. @here) to be formatted correctly. (slack) (#288)
|
||||
* slack: Resolve slack channel to human-readable name. (slack) (#282)
|
||||
* slack: Use DisplayName instead of deprecated username (slack). Closes #276
|
||||
* slack: Allowed Slack bridge to extract simpler link format. (#287)
|
||||
* irc: Strip irc colors correct, strip also ctrl chars (irc)
|
||||
|
||||
# v1.3.1
|
||||
## New features
|
||||
* Support mattermost 4.3.0 and every other 4.x as api4 should be stable (mattermost)
|
||||
## Bugfix
|
||||
* Use bot username if specified (slack). Closes #273
|
||||
|
||||
# v1.3.0
|
||||
## New features
|
||||
* Relay slack_attachments from mattermost to slack (slack). Closes #260
|
||||
* Add support for quoting previous message when replying (telegram). #237
|
||||
* Add support for Quakenet auth (irc). Closes #263
|
||||
* Download files (max size 1MB) from slack and reupload to mattermost (slack/mattermost). Closes #255
|
||||
|
||||
## Enhancements
|
||||
* Backoff for 60 seconds when reconnecting too fast (irc) #267
|
||||
* Use override username if specified (mattermost). #260
|
||||
|
||||
## Bugfix
|
||||
* Try to not forward slack unfurls. Closes #266
|
||||
|
||||
# v1.2.0
|
||||
## Breaking changes
|
||||
* If you're running a discord bridge, update to this release before 16 october otherwise
|
||||
it will stop working. (see https://discordapp.com/developers/docs/reference)
|
||||
|
||||
## New features
|
||||
* general: Add delete support. (actually delete the messages on bridges that support it)
|
||||
(mattermost,discord,gitter,slack,telegram)
|
||||
|
||||
## Bugfix
|
||||
* Do not break messages on newline (slack). Closes #258
|
||||
* Update telegram library
|
||||
* Update discord library (supports v6 API now). Old API is deprecated on 16 October
|
||||
|
||||
# v1.1.2
|
||||
## New features
|
||||
* general: also build darwin binaries
|
||||
* mattermost: add support for mattermost 4.2.x
|
||||
|
||||
## Bugfix
|
||||
* mattermost: Send images when text is empty regression. (mattermost). Closes #254
|
||||
* slack: also send the first messsage after connect. #252
|
||||
|
||||
# v1.1.1
|
||||
## Bugfix
|
||||
* mattermost: fix public links
|
||||
|
||||
# v1.1.0
|
||||
## New features
|
||||
* general: Add better editing support. (actually edit the messages on bridges that support it)
|
||||
(mattermost,discord,gitter,slack,telegram)
|
||||
* mattermost: use API v4 (removes support for mattermost < 3.8)
|
||||
* mattermost: add support for personal access tokens (since mattermost 4.1)
|
||||
Use ```Token="yourtoken"``` in mattermost config
|
||||
See https://docs.mattermost.com/developer/personal-access-tokens.html for more info
|
||||
* matrix: Relay notices (matrix). Closes #243
|
||||
* irc: Add a charset option. Closes #247
|
||||
|
||||
## Bugfix
|
||||
* slack: Handle leave/join events (slack). Closes #246
|
||||
* slack: Replace mentions from other bridges. (slack). Closes #233
|
||||
* gitter: remove ZWSP after messages
|
||||
|
||||
# v1.0.1
|
||||
## New features
|
||||
* mattermost: add support for mattermost 4.1.x
|
||||
* discord: allow a webhookURL per channel #239
|
||||
|
||||
# v1.0.0
|
||||
## New features
|
||||
* general: Add action support for slack,mattermost,irc,gitter,matrix,xmpp,discord. #199
|
||||
* discord: Shows the username instead of the server nickname #234
|
||||
|
||||
# v1.0.0-rc1
|
||||
## New features
|
||||
* general: Add action support for slack,mattermost,irc,gitter,matrix,xmpp,discord. #199
|
||||
|
||||
## Bugfix
|
||||
* general: Handle same account in multiple gateways better
|
||||
* mattermost: ignore edited messages with reactions
|
||||
* mattermost: Fix double posting of edited messages by using lru cache
|
||||
* irc: update vendor
|
||||
|
||||
# v0.16.3
|
||||
## Bugfix
|
||||
* general: Fix in/out logic. Closes #224
|
||||
* general: Fix message modification
|
||||
* slack: Disable message from other bots when using webhooks (slack)
|
||||
* mattermost: Return better error messages on mattermost connect
|
||||
|
||||
# v0.16.2
|
||||
## New features
|
||||
* general: binary builds against latest commit are now available on https://bintray.com/42wim/nightly/Matterbridge/_latestVersion
|
||||
|
||||
## Bugfix
|
||||
* slack: fix loop introduced by relaying message of other bots #219
|
||||
* slack: Suppress parent message when child message is received #218
|
||||
* mattermost: fix regression when using webhookurl and webhookbindaddress #221
|
||||
|
||||
# v0.16.1
|
||||
## New features
|
||||
* slack: also relay messages of other bots #213
|
||||
* mattermost: show also links if public links have not been enabled.
|
||||
|
||||
## Bugfix
|
||||
* mattermost, slack: fix connecting logic #216
|
||||
|
||||
# v0.16.0
|
||||
## Breaking Changes
|
||||
* URL,UseAPI,BindAddress is deprecated. Your config has to be updated.
|
||||
* URL => WebhookURL
|
||||
* BindAddress => WebhookBindAddress
|
||||
* UseAPI => removed
|
||||
This change allows you to specify a WebhookURL and a token (slack,discord), so that
|
||||
messages will be sent with the webhook, but received via the token (API)
|
||||
If you have not specified WebhookURL and WebhookBindAddress the API (login or token)
|
||||
will be used automatically. (no need for UseAPI)
|
||||
|
||||
## New features
|
||||
* mattermost: add support for mattermost 4.0
|
||||
* steam: New protocol support added (http://store.steampowered.com/)
|
||||
* discord: Support for embedded messages (sent by other bots)
|
||||
Shows title, description and URL of embedded messages (sent by other bots)
|
||||
To enable add ```ShowEmbeds=true``` to your discord config
|
||||
* discord: ```WebhookURL``` posting support added (thanks @saury07) #204
|
||||
Discord API does not allow to change the name of the user posting, but webhooks does.
|
||||
|
||||
## Changes
|
||||
* general: all :emoji: will be converted to unicode, providing consistent emojis across all bridges
|
||||
* telegram: Add ```UseInsecureURL``` option for telegram (default false)
|
||||
WARNING! If enabled this will relay GIF/stickers/documents and other attachments as URLs
|
||||
Those URLs will contain your bot-token. This may not be what you want.
|
||||
For now there is no secure way to relay GIF/stickers/documents without seeing your token.
|
||||
|
||||
## Bugfix
|
||||
* irc: detect charset and try to convert it to utf-8 before sending it to other bridges. #209 #210
|
||||
* slack: Remove label from URLs (slack). #205
|
||||
* slack: Relay <>& correctly to other bridges #215
|
||||
* steam: Fix channel id bug in steam (channels are off by 0x18000000000000)
|
||||
* general: various improvements
|
||||
* general: samechannelgateway now relays messages correct again #207
|
||||
|
||||
|
||||
# v0.16.0-rc2
|
||||
## Breaking Changes
|
||||
* URL,UseAPI,BindAddress is deprecated. Your config has to be updated.
|
||||
* URL => WebhookURL
|
||||
* BindAddress => WebhookBindAddress
|
||||
* UseAPI => removed
|
||||
This change allows you to specify a WebhookURL and a token (slack,discord), so that
|
||||
messages will be sent with the webhook, but received via the token (API)
|
||||
If you have not specified WebhookURL and WebhookBindAddress the API (login or token)
|
||||
will be used automatically. (no need for UseAPI)
|
||||
|
||||
## Bugfix since rc1
|
||||
* steam: Fix channel id bug in steam (channels are off by 0x18000000000000)
|
||||
* telegram: Add UseInsecureURL option for telegram (default false)
|
||||
WARNING! If enabled this will relay GIF/stickers/documents and other attachments as URLs
|
||||
Those URLs will contain your bot-token. This may not be what you want.
|
||||
For now there is no secure way to relay GIF/stickers/documents without seeing your token.
|
||||
* irc: detect charset and try to convert it to utf-8 before sending it to other bridges. #209 #210
|
||||
* general: various improvements
|
||||
|
||||
|
||||
# v0.16.0-rc1
|
||||
## Breaking Changes
|
||||
* URL,UseAPI,BindAddress is deprecated. Your config has to be updated.
|
||||
* URL => WebhookURL
|
||||
* BindAddress => WebhookBindAddress
|
||||
* UseAPI => removed
|
||||
This change allows you to specify a WebhookURL and a token (slack,discord), so that
|
||||
messages will be sent with the webhook, but received via the token (API)
|
||||
If you have not specified WebhookURL and WebhookBindAddress the API (login or token)
|
||||
will be used automatically. (no need for UseAPI)
|
||||
|
||||
## New features
|
||||
* steam: New protocol support added (http://store.steampowered.com/)
|
||||
* discord: WebhookURL posting support added (thanks @saury07) #204
|
||||
Discord API does not allow to change the name of the user posting, but webhooks does.
|
||||
|
||||
## Bugfix
|
||||
* general: samechannelgateway now relays messages correct again #207
|
||||
* slack: Remove label from URLs (slack). #205
|
||||
|
||||
# v0.15.0
|
||||
## New features
|
||||
* general: add option IgnoreMessages for all protocols (see mattebridge.toml.sample)
|
||||
Messages matching these regexp will be ignored and not sent to other bridges
|
||||
e.g. IgnoreMessages="^~~ badword"
|
||||
* telegram: add support for sticker/video/photo/document #184
|
||||
|
||||
## Changes
|
||||
* api: add userid to each message #200
|
||||
|
||||
## Bugfix
|
||||
* discord: fix crash in memberupdate #198
|
||||
* mattermost: Fix incorrect behaviour of EditDisable (mattermost). Fixes #197
|
||||
* irc: Do not relay join/part of ourselves (irc). Closes #190
|
||||
* irc: make reconnections more robust. #153
|
||||
* gitter: update library, fixes possible crash
|
||||
|
||||
# v0.14.0
|
||||
## New features
|
||||
* api: add token authentication
|
||||
* mattermost: add support for mattermost 3.10.0
|
||||
|
||||
## Changes
|
||||
* api: gateway name is added in JSON messages
|
||||
* api: lowercase JSON keys
|
||||
* api: channel name isn't needed in config #195
|
||||
|
||||
## Bugfix
|
||||
* discord: Add hashtag to channelname (when translating from id) (discord)
|
||||
* mattermost: Fix a panic. #186
|
||||
* mattermost: use teamid cache if possible. Fixes a panic
|
||||
* api: post valid json. #185
|
||||
* api: allow reuse of api in different gateways. #189
|
||||
* general: Fix utf-8 issues for {NOPINGNICK}. #193
|
||||
|
||||
# v0.13.0
|
||||
## New features
|
||||
* irc: Limit message length. ```MessageLength=400```
|
||||
Maximum length of message sent to irc server. If it exceeds <message clipped> will be add to the message.
|
||||
* irc: Add NOPINGNICK option.
|
||||
The string "{NOPINGNICK}" (case sensitive) will be replaced by the actual nick / username, but with a ZWSP inside the nick, so the irc user with the same nick won't get pinged.
|
||||
See https://github.com/42wim/matterbridge/issues/175 for more information
|
||||
|
||||
## Bugfix
|
||||
* slack: Fix sending to different channels on same account (slack). Closes #177
|
||||
* telegram: Fix incorrect usernames being sent. Closes #181
|
||||
|
||||
|
||||
# v0.12.1
|
||||
## New features
|
||||
* telegram: Add UseFirstName option (telegram). Closes #144
|
||||
* matrix: Add NoHomeServerSuffix. Option to disable homeserver on username (matrix). Closes #160.
|
||||
|
||||
## Bugfix
|
||||
* xmpp: Add Compatibility for Cisco Jabber (xmpp) (#166)
|
||||
* irc: Fix JoinChannel argument to use IRC channel key (#172)
|
||||
* discord: Fix possible crash on nil (discord)
|
||||
* discord: Replace long ids in channel metions (discord). Fixes #174
|
||||
|
||||
# v0.12.0
|
||||
## Changes
|
||||
* general: edited messages are now being sent by default on discord/mattermost/telegram/slack. See "New Features"
|
||||
|
||||
## New features
|
||||
* general: add support for edited messages.
|
||||
Add new keyword EditDisable (false/true), default false. Which means by default edited messages will be sent to other bridges.
|
||||
Add new keyword EditSuffix , default "". You can change this eg to "(edited)", this will be appended to every edit message.
|
||||
* mattermost: support mattermost v3.9.x
|
||||
* general: Add support for HTTP{S}_PROXY env variables (#162)
|
||||
* discord: Strip custom emoji metadata (discord). Closes #148
|
||||
|
||||
## Bugfix
|
||||
* slack: Ignore error on private channel join (slack) Fixes #150
|
||||
* mattermost: fix crash on reconnects when server is down. Closes #163
|
||||
* irc: Relay messages starting with ! (irc). Closes #164
|
||||
|
||||
# v0.11.0
|
||||
## New features
|
||||
* general: reusing the same account on multiple gateways now also reuses the connection.
|
||||
This is particuarly useful for irc. See #87
|
||||
* general: the Name is now REQUIRED and needs to be UNIQUE for each gateway configuration
|
||||
* telegram: Support edited messages (telegram). See #141
|
||||
* mattermost: Add support for showing/hiding join/leave messages from mattermost. Closes #147
|
||||
* mattermost: Reconnect on session removal/timeout (mattermost)
|
||||
* mattermost: Support mattermost v3.8.x
|
||||
* irc: Rejoin channel when kicked (irc).
|
||||
|
||||
## Bugfix
|
||||
* mattermost: Remove space after nick (mattermost). Closes #142
|
||||
* mattermost: Modify iconurl correctly (mattermost).
|
||||
* irc: Fix join/leave regression (irc)
|
||||
|
||||
# v0.10.3
|
||||
## Bugfix
|
||||
* slack: Allow bot tokens for now without warning (slack). Closes #140 (fixes user_is_bot message on channel join)
|
||||
|
||||
27
ci/bintray.sh
Executable file
27
ci/bintray.sh
Executable file
@@ -0,0 +1,27 @@
|
||||
#!/bin/bash
|
||||
go version |grep go1.9 || exit
|
||||
VERSION=$(git describe --tags)
|
||||
mkdir ci/binaries
|
||||
GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -X main.githash=$(git log --pretty=format:'%h' -n 1)" -o ci/binaries/matterbridge-$VERSION-windows-amd64.exe
|
||||
GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -X main.githash=$(git log --pretty=format:'%h' -n 1)" -o ci/binaries/matterbridge-$VERSION-linux-amd64
|
||||
GOOS=linux GOARCH=arm go build -ldflags "-s -w -X main.githash=$(git log --pretty=format:'%h' -n 1)" -o ci/binaries/matterbridge-$VERSION-linux-arm
|
||||
GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -X main.githash=$(git log --pretty=format:'%h' -n 1)" -o ci/binaries/matterbridge-$VERSION-darwin-amd64
|
||||
cd ci
|
||||
cat > deploy.json <<EOF
|
||||
{
|
||||
"package": {
|
||||
"name": "Matterbridge",
|
||||
"repo": "nightly",
|
||||
"subject": "42wim"
|
||||
},
|
||||
"version": {
|
||||
"name": "$VERSION"
|
||||
},
|
||||
"files":
|
||||
[
|
||||
{"includePattern": "ci/binaries/(.*)", "uploadPattern":"\$1"}
|
||||
],
|
||||
"publish": true
|
||||
}
|
||||
EOF
|
||||
|
||||
11
contrib/matterbridge.service
Normal file
11
contrib/matterbridge.service
Normal file
@@ -0,0 +1,11 @@
|
||||
[Unit]
|
||||
Description=matterbridge
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/matterbridge -conf /etc/matterbridge/bridge.toml
|
||||
User=matterbridge
|
||||
Group=matterbridge
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
11
docker/arm/Dockerfile
Normal file
11
docker/arm/Dockerfile
Normal file
@@ -0,0 +1,11 @@
|
||||
FROM cmosh/alpine-arm:edge
|
||||
ENTRYPOINT ["/bin/matterbridge"]
|
||||
|
||||
COPY . /go/src/github.com/42wim/matterbridge
|
||||
RUN apk update && apk add go git gcc musl-dev ca-certificates \
|
||||
&& cd /go/src/github.com/42wim/matterbridge \
|
||||
&& export GOPATH=/go \
|
||||
&& go get \
|
||||
&& go build -x -ldflags "-X main.githash=$(git log --pretty=format:'%h' -n 1)" -o /bin/matterbridge \
|
||||
&& rm -rf /go \
|
||||
&& apk del --purge git go gcc musl-dev
|
||||
@@ -1,71 +1,61 @@
|
||||
package gateway
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"github.com/42wim/matterbridge/bridge"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"reflect"
|
||||
// "github.com/davecgh/go-spew/spew"
|
||||
"crypto/sha1"
|
||||
"github.com/hashicorp/golang-lru"
|
||||
"github.com/peterhellberg/emojilib"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Gateway struct {
|
||||
*config.Config
|
||||
Router *Router
|
||||
MyConfig *config.Gateway
|
||||
Bridges map[string]*bridge.Bridge
|
||||
ChannelsOut map[string][]string
|
||||
ChannelsIn map[string][]string
|
||||
Channels map[string]*config.ChannelInfo
|
||||
ChannelOptions map[string]config.ChannelOptions
|
||||
Name string
|
||||
Message chan config.Message
|
||||
DestChannelFunc func(msg *config.Message, dest string) []string
|
||||
Name string
|
||||
Messages *lru.Cache
|
||||
}
|
||||
|
||||
func New(cfg *config.Config, gateway *config.Gateway) *Gateway {
|
||||
gw := &Gateway{}
|
||||
gw.Name = gateway.Name
|
||||
gw.Config = cfg
|
||||
gw.MyConfig = gateway
|
||||
gw.Message = make(chan config.Message)
|
||||
gw.Bridges = make(map[string]*bridge.Bridge)
|
||||
gw.DestChannelFunc = gw.getDestChannel
|
||||
type BrMsgID struct {
|
||||
br *bridge.Bridge
|
||||
ID string
|
||||
ChannelID string
|
||||
}
|
||||
|
||||
func New(cfg config.Gateway, r *Router) *Gateway {
|
||||
gw := &Gateway{Channels: make(map[string]*config.ChannelInfo), Message: r.Message,
|
||||
Router: r, Bridges: make(map[string]*bridge.Bridge), Config: r.Config}
|
||||
cache, _ := lru.New(5000)
|
||||
gw.Messages = cache
|
||||
gw.AddConfig(&cfg)
|
||||
return gw
|
||||
}
|
||||
|
||||
func (gw *Gateway) AddBridge(cfg *config.Bridge) error {
|
||||
for _, br := range gw.Bridges {
|
||||
if br.Account == cfg.Account {
|
||||
return nil
|
||||
br := gw.Router.getBridge(cfg.Account)
|
||||
if br == nil {
|
||||
br = bridge.New(gw.Config, cfg, gw.Message)
|
||||
}
|
||||
}
|
||||
log.Infof("Starting bridge: %s ", cfg.Account)
|
||||
br := bridge.New(gw.Config, cfg, gw.Message)
|
||||
gw.mapChannelsToBridge(br, gw.ChannelsOut)
|
||||
gw.mapChannelsToBridge(br, gw.ChannelsIn)
|
||||
gw.mapChannelsToBridge(br)
|
||||
gw.Bridges[cfg.Account] = br
|
||||
err := br.Connect()
|
||||
if err != nil {
|
||||
return fmt.Errorf("Bridge %s failed to start: %v", br.Account, err)
|
||||
}
|
||||
err = br.JoinChannels()
|
||||
if err != nil {
|
||||
return fmt.Errorf("Bridge %s failed to join channel: %v", br.Account, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (gw *Gateway) mapChannelsToBridge(br *bridge.Bridge, cMap map[string][]string) {
|
||||
for _, channel := range cMap[br.Account] {
|
||||
if _, ok := gw.ChannelOptions[br.Account+channel]; ok {
|
||||
br.ChannelsOut[channel] = gw.ChannelOptions[br.Account+channel]
|
||||
} else {
|
||||
br.ChannelsOut[channel] = config.ChannelOptions{}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (gw *Gateway) Start() error {
|
||||
func (gw *Gateway) AddConfig(cfg *config.Gateway) error {
|
||||
gw.Name = cfg.Name
|
||||
gw.MyConfig = cfg
|
||||
gw.mapChannels()
|
||||
for _, br := range append(gw.MyConfig.In, append(gw.MyConfig.InOut, gw.MyConfig.Out...)...) {
|
||||
err := gw.AddBridge(&br)
|
||||
@@ -73,27 +63,13 @@ func (gw *Gateway) Start() error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
go gw.handleReceive()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (gw *Gateway) handleReceive() {
|
||||
for {
|
||||
select {
|
||||
case msg := <-gw.Message:
|
||||
if msg.Event == config.EVENT_FAILURE {
|
||||
for _, br := range gw.Bridges {
|
||||
if msg.Account == br.Account {
|
||||
go gw.reconnectBridge(br)
|
||||
}
|
||||
}
|
||||
}
|
||||
if !gw.ignoreMessage(&msg) {
|
||||
msg.Timestamp = time.Now()
|
||||
for _, br := range gw.Bridges {
|
||||
gw.handleMessage(msg, br)
|
||||
}
|
||||
}
|
||||
func (gw *Gateway) mapChannelsToBridge(br *bridge.Bridge) {
|
||||
for ID, channel := range gw.Channels {
|
||||
if br.Account == channel.Account {
|
||||
br.Channels[ID] = *channel
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -109,79 +85,156 @@ RECONNECT:
|
||||
time.Sleep(time.Second * 60)
|
||||
goto RECONNECT
|
||||
}
|
||||
br.Joined = make(map[string]bool)
|
||||
br.JoinChannels()
|
||||
}
|
||||
|
||||
func (gw *Gateway) mapChannelConfig(cfg []config.Bridge, direction string) {
|
||||
for _, br := range cfg {
|
||||
if isApi(br.Account) {
|
||||
br.Channel = "api"
|
||||
}
|
||||
// make sure to lowercase irc channels in config #348
|
||||
if strings.HasPrefix(br.Account, "irc.") {
|
||||
br.Channel = strings.ToLower(br.Channel)
|
||||
}
|
||||
ID := br.Channel + br.Account
|
||||
if _, ok := gw.Channels[ID]; !ok {
|
||||
channel := &config.ChannelInfo{Name: br.Channel, Direction: direction, ID: ID, Options: br.Options, Account: br.Account,
|
||||
SameChannel: make(map[string]bool)}
|
||||
channel.SameChannel[gw.Name] = br.SameChannel
|
||||
gw.Channels[channel.ID] = channel
|
||||
} else {
|
||||
// if we already have a key and it's not our current direction it means we have a bidirectional inout
|
||||
if gw.Channels[ID].Direction != direction {
|
||||
gw.Channels[ID].Direction = "inout"
|
||||
}
|
||||
}
|
||||
gw.Channels[ID].SameChannel[gw.Name] = br.SameChannel
|
||||
}
|
||||
}
|
||||
|
||||
func (gw *Gateway) mapChannels() error {
|
||||
options := make(map[string]config.ChannelOptions)
|
||||
m := make(map[string][]string)
|
||||
for _, br := range gw.MyConfig.Out {
|
||||
m[br.Account] = append(m[br.Account], br.Channel)
|
||||
options[br.Account+br.Channel] = br.Options
|
||||
}
|
||||
gw.ChannelsOut = m
|
||||
m = nil
|
||||
m = make(map[string][]string)
|
||||
for _, br := range gw.MyConfig.In {
|
||||
m[br.Account] = append(m[br.Account], br.Channel)
|
||||
options[br.Account+br.Channel] = br.Options
|
||||
}
|
||||
gw.ChannelsIn = m
|
||||
for _, br := range gw.MyConfig.InOut {
|
||||
gw.ChannelsIn[br.Account] = append(gw.ChannelsIn[br.Account], br.Channel)
|
||||
gw.ChannelsOut[br.Account] = append(gw.ChannelsOut[br.Account], br.Channel)
|
||||
options[br.Account+br.Channel] = br.Options
|
||||
}
|
||||
gw.ChannelOptions = options
|
||||
gw.mapChannelConfig(gw.MyConfig.In, "in")
|
||||
gw.mapChannelConfig(gw.MyConfig.Out, "out")
|
||||
gw.mapChannelConfig(gw.MyConfig.InOut, "inout")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (gw *Gateway) getDestChannel(msg *config.Message, dest string) []string {
|
||||
channels := gw.ChannelsIn[msg.Account]
|
||||
// broadcast to every out channel (irc QUIT)
|
||||
if msg.Event == config.EVENT_JOIN_LEAVE && msg.Channel == "" {
|
||||
return gw.ChannelsOut[dest]
|
||||
}
|
||||
for _, channel := range channels {
|
||||
if channel == msg.Channel {
|
||||
return gw.ChannelsOut[dest]
|
||||
}
|
||||
}
|
||||
return []string{}
|
||||
}
|
||||
func (gw *Gateway) getDestChannel(msg *config.Message, dest bridge.Bridge) []config.ChannelInfo {
|
||||
var channels []config.ChannelInfo
|
||||
|
||||
func (gw *Gateway) handleMessage(msg config.Message, dest *bridge.Bridge) {
|
||||
// only relay join/part when configged
|
||||
if msg.Event == config.EVENT_JOIN_LEAVE && !gw.Bridges[dest.Account].Config.ShowJoinPart {
|
||||
return
|
||||
// for messages received from the api check that the gateway is the specified one
|
||||
if msg.Protocol == "api" && gw.Name != msg.Gateway {
|
||||
return channels
|
||||
}
|
||||
|
||||
// if source channel is in only, do nothing
|
||||
for _, channel := range gw.Channels {
|
||||
// lookup the channel from the message
|
||||
if channel.ID == getChannelID(*msg) {
|
||||
// we only have destinations if the original message is from an "in" (sending) channel
|
||||
if !strings.Contains(channel.Direction, "in") {
|
||||
return channels
|
||||
}
|
||||
originchannel := msg.Channel
|
||||
channels := gw.DestChannelFunc(&msg, dest.Account)
|
||||
for _, channel := range channels {
|
||||
// do not send the message to the bridge we come from if also the channel is the same
|
||||
if msg.Account == dest.Account && channel == originchannel {
|
||||
continue
|
||||
}
|
||||
msg.Channel = channel
|
||||
if msg.Channel == "" {
|
||||
log.Debug("empty channel")
|
||||
return
|
||||
}
|
||||
log.Debugf("Sending %#v from %s (%s) to %s (%s)", msg, msg.Account, originchannel, dest.Account, channel)
|
||||
gw.modifyUsername(&msg, dest)
|
||||
for _, channel := range gw.Channels {
|
||||
if _, ok := gw.Channels[getChannelID(*msg)]; !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
// do samechannelgateway logic
|
||||
if channel.SameChannel[msg.Gateway] {
|
||||
if msg.Channel == channel.Name && msg.Account != dest.Account {
|
||||
channels = append(channels, *channel)
|
||||
}
|
||||
continue
|
||||
}
|
||||
if strings.Contains(channel.Direction, "out") && channel.Account == dest.Account && gw.validGatewayDest(msg, channel) {
|
||||
channels = append(channels, *channel)
|
||||
}
|
||||
}
|
||||
return channels
|
||||
}
|
||||
|
||||
func (gw *Gateway) handleMessage(msg config.Message, dest *bridge.Bridge) []*BrMsgID {
|
||||
var brMsgIDs []*BrMsgID
|
||||
|
||||
// TODO refactor
|
||||
// only slack now, check will have to be done in the different bridges.
|
||||
// we need to check if we can't use fallback or text in other bridges
|
||||
if msg.Extra != nil {
|
||||
if dest.Protocol != "discord" &&
|
||||
dest.Protocol != "slack" &&
|
||||
dest.Protocol != "mattermost" &&
|
||||
dest.Protocol != "telegram" &&
|
||||
dest.Protocol != "matrix" &&
|
||||
dest.Protocol != "xmpp" {
|
||||
if msg.Text == "" {
|
||||
return brMsgIDs
|
||||
}
|
||||
}
|
||||
}
|
||||
// only relay join/part when configged
|
||||
if msg.Event == config.EVENT_JOIN_LEAVE && !gw.Bridges[dest.Account].Config.ShowJoinPart {
|
||||
return brMsgIDs
|
||||
}
|
||||
// broadcast to every out channel (irc QUIT)
|
||||
if msg.Channel == "" && msg.Event != config.EVENT_JOIN_LEAVE {
|
||||
log.Debug("empty channel")
|
||||
return brMsgIDs
|
||||
}
|
||||
originchannel := msg.Channel
|
||||
origmsg := msg
|
||||
channels := gw.getDestChannel(&msg, *dest)
|
||||
for _, channel := range channels {
|
||||
// do not send to ourself
|
||||
if channel.ID == getChannelID(origmsg) {
|
||||
continue
|
||||
}
|
||||
log.Debugf("Sending %#v from %s (%s) to %s (%s)", msg, msg.Account, originchannel, dest.Account, channel.Name)
|
||||
msg.Channel = channel.Name
|
||||
msg.Avatar = gw.modifyAvatar(origmsg, dest)
|
||||
msg.Username = gw.modifyUsername(origmsg, dest)
|
||||
msg.ID = ""
|
||||
if res, ok := gw.Messages.Get(origmsg.ID); ok {
|
||||
IDs := res.([]*BrMsgID)
|
||||
for _, id := range IDs {
|
||||
// check protocol, bridge name and channelname
|
||||
// for people that reuse the same bridge multiple times. see #342
|
||||
if dest.Protocol == id.br.Protocol && dest.Name == id.br.Name && channel.ID == id.ChannelID {
|
||||
msg.ID = id.ID
|
||||
}
|
||||
}
|
||||
}
|
||||
// for api we need originchannel as channel
|
||||
if dest.Protocol == "api" {
|
||||
msg.Channel = originchannel
|
||||
}
|
||||
err := dest.Send(msg)
|
||||
mID, err := dest.Send(msg)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
// append the message ID (mID) from this bridge (dest) to our brMsgIDs slice
|
||||
if mID != "" {
|
||||
brMsgIDs = append(brMsgIDs, &BrMsgID{dest, mID, channel.ID})
|
||||
}
|
||||
}
|
||||
return brMsgIDs
|
||||
}
|
||||
|
||||
func (gw *Gateway) ignoreMessage(msg *config.Message) bool {
|
||||
// if we don't have the bridge, ignore it
|
||||
if _, ok := gw.Bridges[msg.Account]; !ok {
|
||||
return true
|
||||
}
|
||||
if msg.Text == "" {
|
||||
// we have an attachment or actual bytes
|
||||
if msg.Extra != nil && (msg.Extra["attachments"] != nil || len(msg.Extra["file"]) > 0) {
|
||||
return false
|
||||
}
|
||||
log.Debugf("ignoring empty message %#v from %s", msg, msg.Account)
|
||||
return true
|
||||
}
|
||||
@@ -191,33 +244,137 @@ func (gw *Gateway) ignoreMessage(msg *config.Message) bool {
|
||||
return true
|
||||
}
|
||||
}
|
||||
// TODO do not compile regexps everytime
|
||||
for _, entry := range strings.Fields(gw.Bridges[msg.Account].Config.IgnoreMessages) {
|
||||
if entry != "" {
|
||||
re, err := regexp.Compile(entry)
|
||||
if err != nil {
|
||||
log.Errorf("incorrect regexp %s for %s", entry, msg.Account)
|
||||
continue
|
||||
}
|
||||
if re.MatchString(msg.Text) {
|
||||
log.Debugf("matching %s. ignoring %s from %s", entry, msg.Text, msg.Account)
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (gw *Gateway) modifyMessage(msg *config.Message, dest *bridge.Bridge) {
|
||||
val := reflect.ValueOf(gw.Config).Elem()
|
||||
for i := 0; i < val.NumField(); i++ {
|
||||
typeField := val.Type().Field(i)
|
||||
// look for the protocol map (both lowercase)
|
||||
if strings.ToLower(typeField.Name) == dest.Protocol {
|
||||
// get the Protocol struct from the map
|
||||
protoCfg := val.Field(i).MapIndex(reflect.ValueOf(dest.Name))
|
||||
//config.SetNickFormat(msg, protoCfg.Interface().(config.Protocol))
|
||||
val.Field(i).SetMapIndex(reflect.ValueOf(dest.Name), protoCfg)
|
||||
func (gw *Gateway) modifyUsername(msg config.Message, dest *bridge.Bridge) string {
|
||||
br := gw.Bridges[msg.Account]
|
||||
msg.Protocol = br.Protocol
|
||||
if gw.Config.General.StripNick || dest.Config.StripNick {
|
||||
re := regexp.MustCompile("[^a-zA-Z0-9]+")
|
||||
msg.Username = re.ReplaceAllString(msg.Username, "")
|
||||
}
|
||||
nick := dest.Config.RemoteNickFormat
|
||||
if nick == "" {
|
||||
nick = gw.Config.General.RemoteNickFormat
|
||||
}
|
||||
|
||||
// loop to replace nicks
|
||||
for _, outer := range br.Config.ReplaceNicks {
|
||||
search := outer[0]
|
||||
replace := outer[1]
|
||||
// TODO move compile to bridge init somewhere
|
||||
re, err := regexp.Compile(search)
|
||||
if err != nil {
|
||||
log.Errorf("regexp in %s failed: %s", msg.Account, err)
|
||||
break
|
||||
}
|
||||
msg.Username = re.ReplaceAllString(msg.Username, replace)
|
||||
}
|
||||
|
||||
if len(msg.Username) > 0 {
|
||||
// fix utf-8 issue #193
|
||||
i := 0
|
||||
for index := range msg.Username {
|
||||
if i == 1 {
|
||||
i = index
|
||||
break
|
||||
}
|
||||
i++
|
||||
}
|
||||
nick = strings.Replace(nick, "{NOPINGNICK}", msg.Username[:i]+""+msg.Username[i:], -1)
|
||||
}
|
||||
nick = strings.Replace(nick, "{BRIDGE}", br.Name, -1)
|
||||
nick = strings.Replace(nick, "{PROTOCOL}", br.Protocol, -1)
|
||||
nick = strings.Replace(nick, "{NICK}", msg.Username, -1)
|
||||
return nick
|
||||
}
|
||||
|
||||
func (gw *Gateway) modifyAvatar(msg config.Message, dest *bridge.Bridge) string {
|
||||
iconurl := gw.Config.General.IconURL
|
||||
if iconurl == "" {
|
||||
iconurl = dest.Config.IconURL
|
||||
}
|
||||
iconurl = strings.Replace(iconurl, "{NICK}", msg.Username, -1)
|
||||
if msg.Avatar == "" {
|
||||
msg.Avatar = iconurl
|
||||
}
|
||||
return msg.Avatar
|
||||
}
|
||||
|
||||
func (gw *Gateway) modifyMessage(msg *config.Message) {
|
||||
// replace :emoji: to unicode
|
||||
msg.Text = emojilib.Replace(msg.Text)
|
||||
br := gw.Bridges[msg.Account]
|
||||
// loop to replace messages
|
||||
for _, outer := range br.Config.ReplaceMessages {
|
||||
search := outer[0]
|
||||
replace := outer[1]
|
||||
// TODO move compile to bridge init somewhere
|
||||
re, err := regexp.Compile(search)
|
||||
if err != nil {
|
||||
log.Errorf("regexp in %s failed: %s", msg.Account, err)
|
||||
break
|
||||
}
|
||||
msg.Text = re.ReplaceAllString(msg.Text, replace)
|
||||
}
|
||||
|
||||
// messages from api have Gateway specified, don't overwrite
|
||||
if msg.Protocol != "api" {
|
||||
msg.Gateway = gw.Name
|
||||
}
|
||||
}
|
||||
|
||||
func (gw *Gateway) handleFiles(msg *config.Message) {
|
||||
if msg.Extra == nil || gw.Config.General.MediaServerUpload == "" {
|
||||
return
|
||||
}
|
||||
if len(msg.Extra["file"]) > 0 {
|
||||
client := &http.Client{
|
||||
Timeout: time.Second * 5,
|
||||
}
|
||||
for i, f := range msg.Extra["file"] {
|
||||
fi := f.(config.FileInfo)
|
||||
sha1sum := fmt.Sprintf("%x", sha1.Sum(*fi.Data))
|
||||
reader := bytes.NewReader(*fi.Data)
|
||||
url := gw.Config.General.MediaServerUpload + "/" + sha1sum + "/" + fi.Name
|
||||
durl := gw.Config.General.MediaServerDownload + "/" + sha1sum + "/" + fi.Name
|
||||
extra := msg.Extra["file"][i].(config.FileInfo)
|
||||
extra.URL = durl
|
||||
msg.Extra["file"][i] = extra
|
||||
req, _ := http.NewRequest("PUT", url, reader)
|
||||
req.Header.Set("Content-Type", "binary/octet-stream")
|
||||
_, err := client.Do(req)
|
||||
if err != nil {
|
||||
log.Errorf("mediaserver upload failed: %#v", err)
|
||||
}
|
||||
log.Debugf("mediaserver download URL = %s", durl)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (gw *Gateway) modifyUsername(msg *config.Message, dest *bridge.Bridge) {
|
||||
br := gw.Bridges[msg.Account]
|
||||
msg.Protocol = br.Protocol
|
||||
nick := gw.Config.General.RemoteNickFormat
|
||||
if nick == "" {
|
||||
nick = dest.Config.RemoteNickFormat
|
||||
}
|
||||
nick = strings.Replace(nick, "{NICK}", msg.Username, -1)
|
||||
nick = strings.Replace(nick, "{BRIDGE}", br.Name, -1)
|
||||
nick = strings.Replace(nick, "{PROTOCOL}", br.Protocol, -1)
|
||||
msg.Username = nick
|
||||
func getChannelID(msg config.Message) string {
|
||||
return msg.Channel + msg.Account
|
||||
}
|
||||
|
||||
func (gw *Gateway) validGatewayDest(msg *config.Message, channel *config.ChannelInfo) bool {
|
||||
return msg.Gateway == gw.Name
|
||||
}
|
||||
|
||||
func isApi(account string) bool {
|
||||
return strings.HasPrefix(account, "api.")
|
||||
}
|
||||
|
||||
288
gateway/gateway_test.go
Normal file
288
gateway/gateway_test.go
Normal file
@@ -0,0 +1,288 @@
|
||||
package gateway
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/BurntSushi/toml"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"strconv"
|
||||
|
||||
"testing"
|
||||
)
|
||||
|
||||
var testconfig = `
|
||||
[irc.freenode]
|
||||
[mattermost.test]
|
||||
[gitter.42wim]
|
||||
[discord.test]
|
||||
[slack.test]
|
||||
|
||||
[[gateway]]
|
||||
name = "bridge1"
|
||||
enable=true
|
||||
|
||||
[[gateway.inout]]
|
||||
account = "irc.freenode"
|
||||
channel = "#wimtesting"
|
||||
|
||||
[[gateway.inout]]
|
||||
account="gitter.42wim"
|
||||
channel="42wim/testroom"
|
||||
#channel="matterbridge/Lobby"
|
||||
|
||||
[[gateway.inout]]
|
||||
account = "discord.test"
|
||||
channel = "general"
|
||||
|
||||
[[gateway.inout]]
|
||||
account="slack.test"
|
||||
channel="testing"
|
||||
`
|
||||
|
||||
var testconfig2 = `
|
||||
[irc.freenode]
|
||||
[mattermost.test]
|
||||
[gitter.42wim]
|
||||
[discord.test]
|
||||
[slack.test]
|
||||
|
||||
[[gateway]]
|
||||
name = "bridge1"
|
||||
enable=true
|
||||
|
||||
[[gateway.in]]
|
||||
account = "irc.freenode"
|
||||
channel = "#wimtesting"
|
||||
|
||||
[[gateway.in]]
|
||||
account="gitter.42wim"
|
||||
channel="42wim/testroom"
|
||||
|
||||
[[gateway.inout]]
|
||||
account = "discord.test"
|
||||
channel = "general"
|
||||
|
||||
[[gateway.out]]
|
||||
account="slack.test"
|
||||
channel="testing"
|
||||
[[gateway]]
|
||||
name = "bridge2"
|
||||
enable=true
|
||||
|
||||
[[gateway.in]]
|
||||
account = "irc.freenode"
|
||||
channel = "#wimtesting2"
|
||||
|
||||
[[gateway.out]]
|
||||
account="gitter.42wim"
|
||||
channel="42wim/testroom"
|
||||
|
||||
[[gateway.out]]
|
||||
account = "discord.test"
|
||||
channel = "general2"
|
||||
`
|
||||
var testconfig3 = `
|
||||
[irc.zzz]
|
||||
[telegram.zzz]
|
||||
[slack.zzz]
|
||||
[[gateway]]
|
||||
name="bridge"
|
||||
enable=true
|
||||
|
||||
[[gateway.inout]]
|
||||
account="irc.zzz"
|
||||
channel="#main"
|
||||
|
||||
[[gateway.inout]]
|
||||
account="telegram.zzz"
|
||||
channel="-1111111111111"
|
||||
|
||||
[[gateway.inout]]
|
||||
account="slack.zzz"
|
||||
channel="irc"
|
||||
|
||||
[[gateway]]
|
||||
name="announcements"
|
||||
enable=true
|
||||
|
||||
[[gateway.in]]
|
||||
account="telegram.zzz"
|
||||
channel="-2222222222222"
|
||||
|
||||
[[gateway.out]]
|
||||
account="irc.zzz"
|
||||
channel="#main"
|
||||
|
||||
[[gateway.out]]
|
||||
account="irc.zzz"
|
||||
channel="#main-help"
|
||||
|
||||
[[gateway.out]]
|
||||
account="telegram.zzz"
|
||||
channel="--333333333333"
|
||||
|
||||
[[gateway.out]]
|
||||
account="slack.zzz"
|
||||
channel="general"
|
||||
|
||||
[[gateway]]
|
||||
name="bridge2"
|
||||
enable=true
|
||||
|
||||
[[gateway.inout]]
|
||||
account="irc.zzz"
|
||||
channel="#main-help"
|
||||
|
||||
[[gateway.inout]]
|
||||
account="telegram.zzz"
|
||||
channel="--444444444444"
|
||||
|
||||
|
||||
[[gateway]]
|
||||
name="bridge3"
|
||||
enable=true
|
||||
|
||||
[[gateway.inout]]
|
||||
account="irc.zzz"
|
||||
channel="#main-telegram"
|
||||
|
||||
[[gateway.inout]]
|
||||
account="telegram.zzz"
|
||||
channel="--333333333333"
|
||||
`
|
||||
|
||||
func maketestRouter(input string) *Router {
|
||||
var cfg *config.Config
|
||||
if _, err := toml.Decode(input, &cfg); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
r, err := NewRouter(cfg)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
return r
|
||||
}
|
||||
func TestNewRouter(t *testing.T) {
|
||||
var cfg *config.Config
|
||||
if _, err := toml.Decode(testconfig, &cfg); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
r, err := NewRouter(cfg)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
assert.Equal(t, 1, len(r.Gateways))
|
||||
assert.Equal(t, 4, len(r.Gateways["bridge1"].Bridges))
|
||||
assert.Equal(t, 4, len(r.Gateways["bridge1"].Channels))
|
||||
|
||||
r = maketestRouter(testconfig2)
|
||||
assert.Equal(t, 2, len(r.Gateways))
|
||||
assert.Equal(t, 4, len(r.Gateways["bridge1"].Bridges))
|
||||
assert.Equal(t, 3, len(r.Gateways["bridge2"].Bridges))
|
||||
assert.Equal(t, 4, len(r.Gateways["bridge1"].Channels))
|
||||
assert.Equal(t, 3, len(r.Gateways["bridge2"].Channels))
|
||||
assert.Equal(t, &config.ChannelInfo{Name: "42wim/testroom", Direction: "out",
|
||||
ID: "42wim/testroomgitter.42wim", Account: "gitter.42wim",
|
||||
SameChannel: map[string]bool{"bridge2": false}},
|
||||
r.Gateways["bridge2"].Channels["42wim/testroomgitter.42wim"])
|
||||
assert.Equal(t, &config.ChannelInfo{Name: "42wim/testroom", Direction: "in",
|
||||
ID: "42wim/testroomgitter.42wim", Account: "gitter.42wim",
|
||||
SameChannel: map[string]bool{"bridge1": false}},
|
||||
r.Gateways["bridge1"].Channels["42wim/testroomgitter.42wim"])
|
||||
assert.Equal(t, &config.ChannelInfo{Name: "general", Direction: "inout",
|
||||
ID: "generaldiscord.test", Account: "discord.test",
|
||||
SameChannel: map[string]bool{"bridge1": false}},
|
||||
r.Gateways["bridge1"].Channels["generaldiscord.test"])
|
||||
}
|
||||
|
||||
func TestGetDestChannel(t *testing.T) {
|
||||
r := maketestRouter(testconfig2)
|
||||
msg := &config.Message{Text: "test", Channel: "general", Account: "discord.test", Gateway: "bridge1", Protocol: "discord", Username: "test"}
|
||||
for _, br := range r.Gateways["bridge1"].Bridges {
|
||||
switch br.Account {
|
||||
case "discord.test":
|
||||
assert.Equal(t, []config.ChannelInfo{{Name: "general", Account: "discord.test", Direction: "inout", ID: "generaldiscord.test", SameChannel: map[string]bool{"bridge1": false}, Options: config.ChannelOptions{Key: ""}}},
|
||||
r.Gateways["bridge1"].getDestChannel(msg, *br))
|
||||
case "slack.test":
|
||||
assert.Equal(t, []config.ChannelInfo{{Name: "testing", Account: "slack.test", Direction: "out", ID: "testingslack.test", SameChannel: map[string]bool{"bridge1": false}, Options: config.ChannelOptions{Key: ""}}},
|
||||
r.Gateways["bridge1"].getDestChannel(msg, *br))
|
||||
case "gitter.42wim":
|
||||
assert.Equal(t, []config.ChannelInfo(nil), r.Gateways["bridge1"].getDestChannel(msg, *br))
|
||||
case "irc.freenode":
|
||||
assert.Equal(t, []config.ChannelInfo(nil), r.Gateways["bridge1"].getDestChannel(msg, *br))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetDestChannelAdvanced(t *testing.T) {
|
||||
r := maketestRouter(testconfig3)
|
||||
var msgs []*config.Message
|
||||
i := 0
|
||||
for _, gw := range r.Gateways {
|
||||
for _, channel := range gw.Channels {
|
||||
msgs = append(msgs, &config.Message{Text: "text" + strconv.Itoa(i), Channel: channel.Name, Account: channel.Account, Gateway: gw.Name, Username: "user" + strconv.Itoa(i)})
|
||||
i++
|
||||
}
|
||||
}
|
||||
hits := make(map[string]int)
|
||||
for _, gw := range r.Gateways {
|
||||
for _, br := range gw.Bridges {
|
||||
for _, msg := range msgs {
|
||||
channels := gw.getDestChannel(msg, *br)
|
||||
if gw.Name != msg.Gateway {
|
||||
assert.Equal(t, []config.ChannelInfo(nil), channels)
|
||||
continue
|
||||
}
|
||||
switch gw.Name {
|
||||
case "bridge":
|
||||
if (msg.Channel == "#main" || msg.Channel == "-1111111111111" || msg.Channel == "irc") && (msg.Account == "irc.zzz" || msg.Account == "telegram.zzz" || msg.Account == "slack.zzz") {
|
||||
hits[gw.Name]++
|
||||
switch br.Account {
|
||||
case "irc.zzz":
|
||||
assert.Equal(t, []config.ChannelInfo{{Name: "#main", Account: "irc.zzz", Direction: "inout", ID: "#mainirc.zzz", SameChannel: map[string]bool{"bridge": false}, Options: config.ChannelOptions{Key: ""}}}, channels)
|
||||
case "telegram.zzz":
|
||||
assert.Equal(t, []config.ChannelInfo{{Name: "-1111111111111", Account: "telegram.zzz", Direction: "inout", ID: "-1111111111111telegram.zzz", SameChannel: map[string]bool{"bridge": false}, Options: config.ChannelOptions{Key: ""}}}, channels)
|
||||
case "slack.zzz":
|
||||
assert.Equal(t, []config.ChannelInfo{{Name: "irc", Account: "slack.zzz", Direction: "inout", ID: "ircslack.zzz", SameChannel: map[string]bool{"bridge": false}, Options: config.ChannelOptions{Key: ""}}}, channels)
|
||||
}
|
||||
}
|
||||
case "bridge2":
|
||||
if (msg.Channel == "#main-help" || msg.Channel == "--444444444444") && (msg.Account == "irc.zzz" || msg.Account == "telegram.zzz") {
|
||||
hits[gw.Name]++
|
||||
switch br.Account {
|
||||
case "irc.zzz":
|
||||
assert.Equal(t, []config.ChannelInfo{{Name: "#main-help", Account: "irc.zzz", Direction: "inout", ID: "#main-helpirc.zzz", SameChannel: map[string]bool{"bridge2": false}, Options: config.ChannelOptions{Key: ""}}}, channels)
|
||||
case "telegram.zzz":
|
||||
assert.Equal(t, []config.ChannelInfo{{Name: "--444444444444", Account: "telegram.zzz", Direction: "inout", ID: "--444444444444telegram.zzz", SameChannel: map[string]bool{"bridge2": false}, Options: config.ChannelOptions{Key: ""}}}, channels)
|
||||
}
|
||||
}
|
||||
case "bridge3":
|
||||
if (msg.Channel == "#main-telegram" || msg.Channel == "--333333333333") && (msg.Account == "irc.zzz" || msg.Account == "telegram.zzz") {
|
||||
hits[gw.Name]++
|
||||
switch br.Account {
|
||||
case "irc.zzz":
|
||||
assert.Equal(t, []config.ChannelInfo{{Name: "#main-telegram", Account: "irc.zzz", Direction: "inout", ID: "#main-telegramirc.zzz", SameChannel: map[string]bool{"bridge3": false}, Options: config.ChannelOptions{Key: ""}}}, channels)
|
||||
case "telegram.zzz":
|
||||
assert.Equal(t, []config.ChannelInfo{{Name: "--333333333333", Account: "telegram.zzz", Direction: "inout", ID: "--333333333333telegram.zzz", SameChannel: map[string]bool{"bridge3": false}, Options: config.ChannelOptions{Key: ""}}}, channels)
|
||||
}
|
||||
}
|
||||
case "announcements":
|
||||
if msg.Channel != "-2222222222222" && msg.Account != "telegram" {
|
||||
assert.Equal(t, []config.ChannelInfo(nil), channels)
|
||||
continue
|
||||
}
|
||||
hits[gw.Name]++
|
||||
switch br.Account {
|
||||
case "irc.zzz":
|
||||
assert.Equal(t, []config.ChannelInfo{{Name: "#main", Account: "irc.zzz", Direction: "out", ID: "#mainirc.zzz", SameChannel: map[string]bool{"announcements": false}, Options: config.ChannelOptions{Key: ""}}, {Name: "#main-help", Account: "irc.zzz", Direction: "out", ID: "#main-helpirc.zzz", SameChannel: map[string]bool{"announcements": false}, Options: config.ChannelOptions{Key: ""}}}, channels)
|
||||
case "slack.zzz":
|
||||
assert.Equal(t, []config.ChannelInfo{{Name: "general", Account: "slack.zzz", Direction: "out", ID: "generalslack.zzz", SameChannel: map[string]bool{"announcements": false}, Options: config.ChannelOptions{Key: ""}}}, channels)
|
||||
case "telegram.zzz":
|
||||
assert.Equal(t, []config.ChannelInfo{{Name: "--333333333333", Account: "telegram.zzz", Direction: "out", ID: "--333333333333telegram.zzz", SameChannel: map[string]bool{"announcements": false}, Options: config.ChannelOptions{Key: ""}}}, channels)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
assert.Equal(t, map[string]int{"bridge3": 4, "bridge": 9, "announcements": 3, "bridge2": 4}, hits)
|
||||
}
|
||||
113
gateway/router.go
Normal file
113
gateway/router.go
Normal file
@@ -0,0 +1,113 @@
|
||||
package gateway
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/42wim/matterbridge/bridge"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/42wim/matterbridge/gateway/samechannel"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
// "github.com/davecgh/go-spew/spew"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Router struct {
|
||||
Gateways map[string]*Gateway
|
||||
Message chan config.Message
|
||||
*config.Config
|
||||
}
|
||||
|
||||
func NewRouter(cfg *config.Config) (*Router, error) {
|
||||
r := &Router{}
|
||||
r.Config = cfg
|
||||
r.Message = make(chan config.Message)
|
||||
r.Gateways = make(map[string]*Gateway)
|
||||
sgw := samechannelgateway.New(cfg)
|
||||
gwconfigs := sgw.GetConfig()
|
||||
|
||||
for _, entry := range append(gwconfigs, cfg.Gateway...) {
|
||||
if !entry.Enable {
|
||||
continue
|
||||
}
|
||||
if entry.Name == "" {
|
||||
return nil, fmt.Errorf("%s", "Gateway without name found")
|
||||
}
|
||||
if _, ok := r.Gateways[entry.Name]; ok {
|
||||
return nil, fmt.Errorf("Gateway with name %s already exists", entry.Name)
|
||||
}
|
||||
r.Gateways[entry.Name] = New(entry, r)
|
||||
}
|
||||
return r, nil
|
||||
}
|
||||
|
||||
func (r *Router) Start() error {
|
||||
m := make(map[string]*bridge.Bridge)
|
||||
for _, gw := range r.Gateways {
|
||||
for _, br := range gw.Bridges {
|
||||
m[br.Account] = br
|
||||
}
|
||||
}
|
||||
for _, br := range m {
|
||||
log.Infof("Starting bridge: %s ", br.Account)
|
||||
err := br.Connect()
|
||||
if err != nil {
|
||||
return fmt.Errorf("Bridge %s failed to start: %v", br.Account, err)
|
||||
}
|
||||
err = br.JoinChannels()
|
||||
if err != nil {
|
||||
return fmt.Errorf("Bridge %s failed to join channel: %v", br.Account, err)
|
||||
}
|
||||
}
|
||||
go r.handleReceive()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Router) getBridge(account string) *bridge.Bridge {
|
||||
for _, gw := range r.Gateways {
|
||||
if br, ok := gw.Bridges[account]; ok {
|
||||
return br
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Router) handleReceive() {
|
||||
for msg := range r.Message {
|
||||
if msg.Event == config.EVENT_FAILURE {
|
||||
Loop:
|
||||
for _, gw := range r.Gateways {
|
||||
for _, br := range gw.Bridges {
|
||||
if msg.Account == br.Account {
|
||||
go gw.reconnectBridge(br)
|
||||
break Loop
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if msg.Event == config.EVENT_REJOIN_CHANNELS {
|
||||
for _, gw := range r.Gateways {
|
||||
for _, br := range gw.Bridges {
|
||||
if msg.Account == br.Account {
|
||||
br.Joined = make(map[string]bool)
|
||||
br.JoinChannels()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, gw := range r.Gateways {
|
||||
// record all the message ID's of the different bridges
|
||||
var msgIDs []*BrMsgID
|
||||
if !gw.ignoreMessage(&msg) {
|
||||
msg.Timestamp = time.Now()
|
||||
gw.modifyMessage(&msg)
|
||||
gw.handleFiles(&msg)
|
||||
for _, br := range gw.Bridges {
|
||||
msgIDs = append(msgIDs, gw.handleMessage(msg, br)...)
|
||||
}
|
||||
// only add the message ID if it doesn't already exists
|
||||
if _, ok := gw.Messages.Get(msg.ID); !ok && msg.ID != "" {
|
||||
gw.Messages.Add(msg.ID, msgIDs)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,48 +2,27 @@ package samechannelgateway
|
||||
|
||||
import (
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/42wim/matterbridge/gateway"
|
||||
)
|
||||
|
||||
type SameChannelGateway struct {
|
||||
*config.Config
|
||||
MyConfig *config.SameChannelGateway
|
||||
Channels []string
|
||||
Name string
|
||||
}
|
||||
|
||||
func New(cfg *config.Config, gatewayCfg *config.SameChannelGateway) *SameChannelGateway {
|
||||
return &SameChannelGateway{
|
||||
MyConfig: gatewayCfg,
|
||||
Channels: gatewayCfg.Channels,
|
||||
Name: gatewayCfg.Name,
|
||||
Config: cfg}
|
||||
func New(cfg *config.Config) *SameChannelGateway {
|
||||
return &SameChannelGateway{Config: cfg}
|
||||
}
|
||||
|
||||
func (sgw *SameChannelGateway) Start() error {
|
||||
gw := gateway.New(sgw.Config, &config.Gateway{Name: sgw.Name})
|
||||
gw.DestChannelFunc = sgw.getDestChannel
|
||||
for _, account := range sgw.MyConfig.Accounts {
|
||||
for _, channel := range sgw.Channels {
|
||||
br := config.Bridge{Account: account, Channel: channel}
|
||||
gw.MyConfig.InOut = append(gw.MyConfig.InOut, br)
|
||||
func (sgw *SameChannelGateway) GetConfig() []config.Gateway {
|
||||
var gwconfigs []config.Gateway
|
||||
cfg := sgw.Config
|
||||
for _, gw := range cfg.SameChannelGateway {
|
||||
gwconfig := config.Gateway{Name: gw.Name, Enable: gw.Enable}
|
||||
for _, account := range gw.Accounts {
|
||||
for _, channel := range gw.Channels {
|
||||
gwconfig.InOut = append(gwconfig.InOut, config.Bridge{Account: account, Channel: channel, SameChannel: true})
|
||||
}
|
||||
}
|
||||
return gw.Start()
|
||||
}
|
||||
|
||||
func (sgw *SameChannelGateway) validChannel(channel string) bool {
|
||||
for _, c := range sgw.Channels {
|
||||
if c == channel {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (sgw *SameChannelGateway) getDestChannel(msg *config.Message, dest string) []string {
|
||||
if sgw.validChannel(msg.Channel) {
|
||||
return []string{msg.Channel}
|
||||
}
|
||||
return []string{}
|
||||
gwconfigs = append(gwconfigs, gwconfig)
|
||||
}
|
||||
return gwconfigs
|
||||
}
|
||||
|
||||
31
gateway/samechannel/samechannel_test.go
Normal file
31
gateway/samechannel/samechannel_test.go
Normal file
@@ -0,0 +1,31 @@
|
||||
package samechannelgateway
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/BurntSushi/toml"
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"testing"
|
||||
)
|
||||
|
||||
var testconfig = `
|
||||
[mattermost.test]
|
||||
[slack.test]
|
||||
|
||||
[[samechannelgateway]]
|
||||
enable = true
|
||||
name = "blah"
|
||||
accounts = [ "mattermost.test","slack.test" ]
|
||||
channels = [ "testing","testing2","testing10"]
|
||||
`
|
||||
|
||||
func TestGetConfig(t *testing.T) {
|
||||
var cfg *config.Config
|
||||
if _, err := toml.Decode(testconfig, &cfg); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
sgw := New(cfg)
|
||||
configs := sgw.GetConfig()
|
||||
assert.Equal(t, []config.Gateway{{Name: "blah", Enable: true, In: []config.Bridge(nil), Out: []config.Bridge(nil), InOut: []config.Bridge{{Account: "mattermost.test", Channel: "testing", Options: config.ChannelOptions{Key: ""}, SameChannel: true}, {Account: "mattermost.test", Channel: "testing2", Options: config.ChannelOptions{Key: ""}, SameChannel: true}, {Account: "mattermost.test", Channel: "testing10", Options: config.ChannelOptions{Key: ""}, SameChannel: true}, {Account: "slack.test", Channel: "testing", Options: config.ChannelOptions{Key: ""}, SameChannel: true}, {Account: "slack.test", Channel: "testing2", Options: config.ChannelOptions{Key: ""}, SameChannel: true}, {Account: "slack.test", Channel: "testing10", Options: config.ChannelOptions{Key: ""}, SameChannel: true}}}}, configs)
|
||||
}
|
||||
@@ -99,10 +99,9 @@ func (c *Client) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// Receive returns an incoming message from mattermost outgoing webhooks URL.
|
||||
func (c *Client) Receive() Message {
|
||||
for {
|
||||
select {
|
||||
case msg := <-c.In:
|
||||
var msg Message
|
||||
for msg = range c.In {
|
||||
return msg
|
||||
}
|
||||
}
|
||||
return msg
|
||||
}
|
||||
|
||||
@@ -5,13 +5,14 @@ import (
|
||||
"fmt"
|
||||
"github.com/42wim/matterbridge/bridge/config"
|
||||
"github.com/42wim/matterbridge/gateway"
|
||||
"github.com/42wim/matterbridge/gateway/samechannel"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"github.com/google/gops/agent"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
version = "0.10.3"
|
||||
version = "1.7.1"
|
||||
githash string
|
||||
)
|
||||
|
||||
@@ -33,37 +34,23 @@ func main() {
|
||||
fmt.Printf("version: %s %s\n", version, githash)
|
||||
return
|
||||
}
|
||||
flag.Parse()
|
||||
if *flagDebug {
|
||||
if *flagDebug || os.Getenv("DEBUG") == "1" {
|
||||
log.Info("Enabling debug")
|
||||
log.SetLevel(log.DebugLevel)
|
||||
}
|
||||
log.Printf("Running version %s %s", version, githash)
|
||||
if strings.Contains(version, "-dev") {
|
||||
log.Println("WARNING: THIS IS A DEVELOPMENT VERSION. Things may break.")
|
||||
}
|
||||
cfg := config.NewConfig(*flagConfig)
|
||||
for _, gw := range cfg.SameChannelGateway {
|
||||
if !gw.Enable {
|
||||
continue
|
||||
}
|
||||
log.Printf("Starting samechannel gateway %#v", gw.Name)
|
||||
g := samechannelgateway.New(cfg, &gw)
|
||||
err := g.Start()
|
||||
cfg.General.Debug = *flagDebug
|
||||
r, err := gateway.NewRouter(cfg)
|
||||
if err != nil {
|
||||
log.Fatalf("Starting gateway failed %#v", err)
|
||||
log.Fatalf("Starting gateway failed: %s", err)
|
||||
}
|
||||
log.Printf("Started samechannel gateway %#v", gw.Name)
|
||||
}
|
||||
|
||||
for _, gw := range cfg.Gateway {
|
||||
if !gw.Enable {
|
||||
continue
|
||||
}
|
||||
log.Printf("Starting gateway %#v", gw.Name)
|
||||
g := gateway.New(cfg, &gw)
|
||||
err := g.Start()
|
||||
err = r.Start()
|
||||
if err != nil {
|
||||
log.Fatalf("Starting gateway failed %#v", err)
|
||||
}
|
||||
log.Printf("Started gateway %#v", gw.Name)
|
||||
log.Fatalf("Starting gateway failed: %s", err)
|
||||
}
|
||||
log.Printf("Gateway(s) started succesfully. Now relaying messages")
|
||||
select {}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#This is configuration for matterbridge.
|
||||
#WARNING: as this file contains credentials, be sure to set correct file permissions
|
||||
###################################################################
|
||||
#IRC section
|
||||
###################################################################
|
||||
@@ -31,16 +32,38 @@ UseSASL=false
|
||||
#OPTIONAL (default false)
|
||||
SkipTLSVerify=true
|
||||
|
||||
#If you know your charset, you can specify it manually.
|
||||
#Otherwise it tries to detect this automatically. Select one below
|
||||
# "iso-8859-2:1987", "iso-8859-9:1989", "866", "latin9", "iso-8859-10:1992", "iso-ir-109", "hebrew",
|
||||
# "cp932", "iso-8859-15", "cp437", "utf-16be", "iso-8859-3:1988", "windows-1251", "utf16", "latin6",
|
||||
# "latin3", "iso-8859-1:1987", "iso-8859-9", "utf-16le", "big5", "cp819", "asmo-708", "utf-8",
|
||||
# "ibm437", "iso-ir-157", "iso-ir-144", "latin4", "850", "iso-8859-5", "iso-8859-5:1988", "l3",
|
||||
# "windows-31j", "utf8", "iso-8859-3", "437", "greek", "iso-8859-8", "l6", "l9-iso-8859-15",
|
||||
# "iso-8859-2", "latin2", "iso-ir-100", "iso-8859-6", "arabic", "iso-ir-148", "us-ascii", "x-sjis",
|
||||
# "utf16be", "iso-8859-8:1988", "utf16le", "l4", "utf-16", "iso-ir-138", "iso-8859-7", "iso-8859-7:1987",
|
||||
# "windows-1252", "l2", "koi8-r", "iso8859-1", "latin1", "ecma-114", "iso-ir-110", "elot-928",
|
||||
# "iso-ir-126", "iso-8859-1", "iso-ir-127", "cp850", "cyrillic", "greek8", "windows-1250", "iso-latin-1",
|
||||
# "l5", "ibm866", "cp866", "ms-kanji", "ibm850", "ecma-118", "iso-ir-101", "ibm819", "l1", "iso-8859-6:1987",
|
||||
# "latin5", "ascii", "sjis", "iso-8859-10", "iso-8859-4", "iso-8859-4:1988", "shift-jis
|
||||
# The select charset will be converted to utf-8 when sent to other bridges.
|
||||
#OPTIONAL (default "")
|
||||
Charset=""
|
||||
|
||||
#Your nick on irc.
|
||||
#REQUIRED
|
||||
Nick="matterbot"
|
||||
|
||||
#If you registered your bot with a service like Nickserv on freenode.
|
||||
#Also being used when UseSASL=true
|
||||
#
|
||||
#Note: if you want do to quakenet auth, set NickServNick="Q@CServe.quakenet.org"
|
||||
#OPTIONAL
|
||||
NickServNick="nickserv"
|
||||
NickServPassword="secret"
|
||||
|
||||
#OPTIONAL only used for quakenet auth
|
||||
NickServUsername="username"
|
||||
|
||||
#Flood control
|
||||
#Delay in milliseconds between each message send to the IRC server
|
||||
#OPTIONAL (default 1300)
|
||||
@@ -48,26 +71,70 @@ MessageDelay=1300
|
||||
|
||||
#Maximum amount of messages to hold in queue. If queue is full
|
||||
#messages will be dropped.
|
||||
#<clipped> will be add to the message that fills the queue.
|
||||
#<message clipped> will be add to the message that fills the queue.
|
||||
#OPTIONAL (default 30)
|
||||
MessageQueue=30
|
||||
|
||||
#Maximum length of message sent to irc server. If it exceeds
|
||||
#<message clipped> will be add to the message.
|
||||
#OPTIONAL (default 400)
|
||||
MessageLength=400
|
||||
|
||||
#Split messages on MessageLength instead of showing the <message clipped>
|
||||
#WARNING: this could lead to flooding
|
||||
#OPTIONAL (default false)
|
||||
MessageSplit=false
|
||||
|
||||
#Delay in seconds to rejoin a channel when kicked
|
||||
#OPTIONAL (default 0)
|
||||
RejoinDelay=0
|
||||
|
||||
#Nicks you want to ignore.
|
||||
#Messages from those users will not be sent to other bridges.
|
||||
#OPTIONAL
|
||||
IgnoreNicks="ircspammer1 ircspammer2"
|
||||
|
||||
#Messages you want to ignore.
|
||||
#Messages matching these regexp will be ignored and not sent to other bridges
|
||||
#See https://regex-golang.appspot.com/assets/html/index.html for more regex info
|
||||
#OPTIONAL (example below ignores messages starting with ~~ or messages containing badword
|
||||
IgnoreMessages="^~~ badword"
|
||||
|
||||
#messages you want to replace.
|
||||
#it replaces outgoing messages from the bridge.
|
||||
#so you need to place it by the sending bridge definition.
|
||||
#regular expressions supported
|
||||
#some examples:
|
||||
#this replaces cat => dog and sleep => awake
|
||||
#replacemessages=[ ["cat","dog"], ["sleep","awake"] ]
|
||||
#this replaces every number with number. 123 => numbernumbernumber
|
||||
#replacemessages=[ ["[0-9]","number"] ]
|
||||
#optional (default empty)
|
||||
ReplaceMessages=[ ["cat","dog"] ]
|
||||
|
||||
#nicks you want to replace.
|
||||
#see replacemessages for syntaxa
|
||||
#optional (default empty)
|
||||
ReplaceNicks=[ ["user--","user"] ]
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge
|
||||
#The string "{PROTOCOL}" (case sensitive) will be replaced by the protocol used by the bridge
|
||||
#The string "{NOPINGNICK}" (case sensitive) will be replaced by the actual nick / username, but with a ZWSP inside the nick, so the irc user with the same nick won't get pinged. See https://github.com/42wim/matterbridge/issues/175 for more information
|
||||
#OPTIONAL (default empty)
|
||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
|
||||
#Enable to show users joins/parts from other bridges (only from irc-bridge at the moment)
|
||||
#Enable to show users joins/parts from other bridges
|
||||
#Only works hiding/show messages from irc and mattermost bridge for now
|
||||
#OPTIONAL (default false)
|
||||
ShowJoinPart=false
|
||||
|
||||
#StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285
|
||||
#It will strip other characters from the nick
|
||||
#OPTIONAL (default false)
|
||||
StripNick=false
|
||||
|
||||
###################################################################
|
||||
#XMPP section
|
||||
###################################################################
|
||||
@@ -107,6 +174,29 @@ SkipTLSVerify=true
|
||||
#OPTIONAL
|
||||
IgnoreNicks="ircspammer1 ircspammer2"
|
||||
|
||||
#Messages you want to ignore.
|
||||
#Messages matching these regexp will be ignored and not sent to other bridges
|
||||
#See https://regex-golang.appspot.com/assets/html/index.html for more regex info
|
||||
#OPTIONAL (example below ignores messages starting with ~~ or messages containing badword
|
||||
IgnoreMessages="^~~ badword"
|
||||
|
||||
#Messages you want to replace.
|
||||
#It replaces outgoing messages from the bridge.
|
||||
#So you need to place it by the sending bridge definition.
|
||||
#Regular expressions supported
|
||||
#Some examples:
|
||||
#This replaces cat => dog and sleep => awake
|
||||
#ReplaceMessages=[ ["cat","dog"], ["sleep","awake"] ]
|
||||
#This Replaces every number with number. 123 => numbernumbernumber
|
||||
#ReplaceMessages=[ ["[0-9]","number"] ]
|
||||
#OPTIONAL (default empty)
|
||||
ReplaceMessages=[ ["cat","dog"] ]
|
||||
|
||||
#Nicks you want to replace.
|
||||
#See ReplaceMessages for syntaxA
|
||||
#OPTIONAL (default empty)
|
||||
ReplaceNicks=[ ["user--","user"] ]
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge
|
||||
@@ -114,10 +204,15 @@ IgnoreNicks="ircspammer1 ircspammer2"
|
||||
#OPTIONAL (default empty)
|
||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
|
||||
#Enable to show users joins/parts from other bridges (only from irc-bridge at the moment)
|
||||
#Enable to show users joins/parts from other bridges
|
||||
#Only works hiding/show messages from irc and mattermost bridge for now
|
||||
#OPTIONAL (default false)
|
||||
ShowJoinPart=false
|
||||
|
||||
#StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285
|
||||
#It will strip other characters from the nick
|
||||
#OPTIONAL (default false)
|
||||
StripNick=false
|
||||
|
||||
###################################################################
|
||||
#hipchat section
|
||||
@@ -150,6 +245,29 @@ Nick="yourlogin"
|
||||
#OPTIONAL
|
||||
IgnoreNicks="spammer1 spammer2"
|
||||
|
||||
#Messages you want to ignore.
|
||||
#Messages matching these regexp will be ignored and not sent to other bridges
|
||||
#See https://regex-golang.appspot.com/assets/html/index.html for more regex info
|
||||
#OPTIONAL (example below ignores messages starting with ~~ or messages containing badword
|
||||
IgnoreMessages="^~~ badword"
|
||||
|
||||
#messages you want to replace.
|
||||
#it replaces outgoing messages from the bridge.
|
||||
#so you need to place it by the sending bridge definition.
|
||||
#regular expressions supported
|
||||
#some examples:
|
||||
#this replaces cat => dog and sleep => awake
|
||||
#replacemessages=[ ["cat","dog"], ["sleep","awake"] ]
|
||||
#this replaces every number with number. 123 => numbernumbernumber
|
||||
#replacemessages=[ ["[0-9]","number"] ]
|
||||
#optional (default empty)
|
||||
ReplaceMessages=[ ["cat","dog"] ]
|
||||
|
||||
#nicks you want to replace.
|
||||
#see replacemessages for syntaxa
|
||||
#optional (default empty)
|
||||
ReplaceNicks=[ ["user--","user"] ]
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge
|
||||
@@ -157,10 +275,15 @@ IgnoreNicks="spammer1 spammer2"
|
||||
#OPTIONAL (default empty)
|
||||
RemoteNickFormat="[{PROTOCOL}/{BRIDGE}] <{NICK}> "
|
||||
|
||||
#Enable to show users joins/parts from other bridges (only from irc-bridge at the moment)
|
||||
#Enable to show users joins/parts from other bridges
|
||||
#Only works hiding/show messages from irc and mattermost bridge for now
|
||||
#OPTIONAL (default false)
|
||||
ShowJoinPart=false
|
||||
|
||||
#StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285
|
||||
#It will strip other characters from the nick
|
||||
#OPTIONAL (default false)
|
||||
StripNick=false
|
||||
|
||||
###################################################################
|
||||
#mattermost section
|
||||
@@ -171,51 +294,53 @@ ShowJoinPart=false
|
||||
#REQUIRED
|
||||
|
||||
[mattermost.work]
|
||||
#### Settings for webhook matterbridge.
|
||||
#### These settings will not be used when useAPI is enabled
|
||||
|
||||
#Url is your incoming webhook url as specified in mattermost.
|
||||
#See account settings - integrations - incoming webhooks on mattermost.
|
||||
#REQUIRED (unless useAPI=true)
|
||||
URL="https://yourdomain/hooks/yourhookkey"
|
||||
|
||||
#Address to listen on for outgoing webhook requests from mattermost.
|
||||
#See account settings - integrations - outgoing webhooks on mattermost.
|
||||
#This setting will not be used when using -plus switch which doesn't use
|
||||
#webhooks
|
||||
#REQUIRED (unless useAPI=true)
|
||||
BindAddress="0.0.0.0:9999"
|
||||
|
||||
#Icon that will be showed in mattermost.
|
||||
#OPTIONAL
|
||||
IconURL="http://youricon.png"
|
||||
|
||||
#### Settings for matterbridge -plus
|
||||
#### Thse settings will only be used when using the -plus switch.
|
||||
|
||||
#### Settings for using matterbridge API
|
||||
#OPTIONAL
|
||||
useAPI=false
|
||||
|
||||
#The mattermost hostname.
|
||||
#REQUIRED (when useAPI=true)
|
||||
#The mattermost hostname. (do not prefix it with http or https)
|
||||
#REQUIRED (when not using webhooks)
|
||||
Server="yourmattermostserver.domain"
|
||||
|
||||
#Your team on mattermost.
|
||||
#REQUIRED (when useAPI=true)
|
||||
#REQUIRED (when not using webhooks)
|
||||
Team="yourteam"
|
||||
|
||||
#login/pass of your bot.
|
||||
#Use a dedicated user for this and not your own!
|
||||
#REQUIRED (when useAPI=true)
|
||||
#REQUIRED (when not using webhooks)
|
||||
Login="yourlogin"
|
||||
Password="yourpass"
|
||||
|
||||
#personal access token of the bot.
|
||||
#new feature since mattermost 4.1. See https://docs.mattermost.com/developer/personal-access-tokens.html
|
||||
#OPTIONAL (you can use token instead of login/password)
|
||||
#Token="abcdefghijklm"
|
||||
|
||||
#Enable this to make a http connection (instead of https) to your mattermost.
|
||||
#OPTIONAL (default false)
|
||||
NoTLS=false
|
||||
|
||||
#### Shared settings for matterbridge and -plus
|
||||
#### Settings for webhook matterbridge.
|
||||
#NOT RECOMMENDED TO USE INCOMING/OUTGOING WEBHOOK. USE DEDICATED BOT USER WHEN POSSIBLE!
|
||||
#You don't need to configure this, if you have configured the settings
|
||||
#above.
|
||||
|
||||
#Url is your incoming webhook url as specified in mattermost.
|
||||
#See account settings - integrations - incoming webhooks on mattermost.
|
||||
#If specified, messages will be sent to mattermost using this URL
|
||||
#OPTIONAL
|
||||
WebhookURL="https://yourdomain/hooks/yourhookkey"
|
||||
|
||||
#Address to listen on for outgoing webhook requests from mattermost.
|
||||
#See account settings - integrations - outgoing webhooks on mattermost.
|
||||
#If specified, messages will be received from mattermost on this ip:port
|
||||
#(this will only work if WebhookURL above is also configured)
|
||||
#OPTIONAL
|
||||
WebhookBindAddress="0.0.0.0:9999"
|
||||
|
||||
#Icon that will be showed in mattermost.
|
||||
#This only works when WebhookURL is configured
|
||||
#OPTIONAL
|
||||
IconURL="http://youricon.png"
|
||||
|
||||
#### End settings for webhook matterbridge.
|
||||
|
||||
#Enable to not verify the certificate on your mattermost server.
|
||||
#e.g. when using selfsigned certificates
|
||||
@@ -238,11 +363,42 @@ NicksPerRow=4
|
||||
#OPTIONAL (default false)
|
||||
PrefixMessagesWithNick=false
|
||||
|
||||
#Disable sending of edits to other bridges
|
||||
#OPTIONAL (default false)
|
||||
EditDisable=false
|
||||
|
||||
#Message to be appended to every edited message
|
||||
#OPTIONAL (default empty)
|
||||
EditSuffix=" (edited)"
|
||||
|
||||
#Nicks you want to ignore.
|
||||
#Messages from those users will not be sent to other bridges.
|
||||
#OPTIONAL
|
||||
IgnoreNicks="ircspammer1 ircspammer2"
|
||||
|
||||
#Messages you want to ignore.
|
||||
#Messages matching these regexp will be ignored and not sent to other bridges
|
||||
#See https://regex-golang.appspot.com/assets/html/index.html for more regex info
|
||||
#OPTIONAL (example below ignores messages starting with ~~ or messages containing badword
|
||||
IgnoreMessages="^~~ badword"
|
||||
|
||||
#messages you want to replace.
|
||||
#it replaces outgoing messages from the bridge.
|
||||
#so you need to place it by the sending bridge definition.
|
||||
#regular expressions supported
|
||||
#some examples:
|
||||
#this replaces cat => dog and sleep => awake
|
||||
#replacemessages=[ ["cat","dog"], ["sleep","awake"] ]
|
||||
#this replaces every number with number. 123 => numbernumbernumber
|
||||
#replacemessages=[ ["[0-9]","number"] ]
|
||||
#optional (default empty)
|
||||
ReplaceMessages=[ ["cat","dog"] ]
|
||||
|
||||
#nicks you want to replace.
|
||||
#see replacemessages for syntaxa
|
||||
#optional (default empty)
|
||||
ReplaceNicks=[ ["user--","user"] ]
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge
|
||||
@@ -250,10 +406,16 @@ IgnoreNicks="ircspammer1 ircspammer2"
|
||||
#OPTIONAL (default empty)
|
||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
|
||||
#Enable to show users joins/parts from other bridges (only from irc-bridge at the moment)
|
||||
#Enable to show users joins/parts from other bridges
|
||||
#Only works hiding/show messages from irc and mattermost bridge for now
|
||||
#OPTIONAL (default false)
|
||||
ShowJoinPart=false
|
||||
|
||||
#StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285
|
||||
#It will strip other characters from the nick
|
||||
#OPTIONAL (default false)
|
||||
StripNick=false
|
||||
|
||||
###################################################################
|
||||
#Gitter section
|
||||
#Best to make a dedicated gitter account for the bot.
|
||||
@@ -275,6 +437,29 @@ Token="Yourtokenhere"
|
||||
#OPTIONAL
|
||||
IgnoreNicks="ircspammer1 ircspammer2"
|
||||
|
||||
#Messages you want to ignore.
|
||||
#Messages matching these regexp will be ignored and not sent to other bridges
|
||||
#See https://regex-golang.appspot.com/assets/html/index.html for more regex info
|
||||
#OPTIONAL (example below ignores messages starting with ~~ or messages containing badword
|
||||
IgnoreMessages="^~~ badword"
|
||||
|
||||
#messages you want to replace.
|
||||
#it replaces outgoing messages from the bridge.
|
||||
#so you need to place it by the sending bridge definition.
|
||||
#regular expressions supported
|
||||
#some examples:
|
||||
#this replaces cat => dog and sleep => awake
|
||||
#replacemessages=[ ["cat","dog"], ["sleep","awake"] ]
|
||||
#this replaces every number with number. 123 => numbernumbernumber
|
||||
#replacemessages=[ ["[0-9]","number"] ]
|
||||
#optional (default empty)
|
||||
ReplaceMessages=[ ["cat","dog"] ]
|
||||
|
||||
#nicks you want to replace.
|
||||
#see replacemessages for syntaxa
|
||||
#optional (default empty)
|
||||
ReplaceNicks=[ ["user--","user"] ]
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge
|
||||
@@ -282,10 +467,16 @@ IgnoreNicks="ircspammer1 ircspammer2"
|
||||
#OPTIONAL (default empty)
|
||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
|
||||
#Enable to show users joins/parts from other bridges (only from irc-bridge at the moment)
|
||||
#Enable to show users joins/parts from other bridges
|
||||
#Only works hiding/show messages from irc and mattermost bridge for now
|
||||
#OPTIONAL (default false)
|
||||
ShowJoinPart=false
|
||||
|
||||
#StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285
|
||||
#It will strip other characters from the nick
|
||||
#OPTIONAL (default false)
|
||||
StripNick=false
|
||||
|
||||
###################################################################
|
||||
#slack section
|
||||
###################################################################
|
||||
@@ -295,37 +486,28 @@ ShowJoinPart=false
|
||||
#In this example we use [slack.hobby]
|
||||
#REQUIRED
|
||||
[slack.hobby]
|
||||
#### Settings for webhook matterbridge.
|
||||
#### These settings will not be used when useAPI is enabled
|
||||
#Token to connect with the Slack API
|
||||
#You'll have to use a test/api-token using a dedicated user and not a bot token.
|
||||
#See https://github.com/42wim/matterbridge/issues/75 for more info.
|
||||
#Use https://api.slack.com/custom-integrations/legacy-tokens
|
||||
#REQUIRED (when not using webhooks)
|
||||
Token="yourslacktoken"
|
||||
|
||||
#### Settings for webhook matterbridge.
|
||||
#NOT RECOMMENDED TO USE INCOMING/OUTGOING WEBHOOK. USE SLACK API
|
||||
#AND DEDICATED BOT USER WHEN POSSIBLE!
|
||||
#Url is your incoming webhook url as specified in slack
|
||||
#See account settings - integrations - incoming webhooks on slack
|
||||
#REQUIRED (unless useAPI=true)
|
||||
URL="https://hooks.slack.com/services/yourhook"
|
||||
#OPTIONAL
|
||||
WebhookURL="https://hooks.slack.com/services/yourhook"
|
||||
|
||||
#NOT RECOMMENDED TO USE INCOMING/OUTGOING WEBHOOK. USE SLACK API
|
||||
#AND DEDICATED BOT USER WHEN POSSIBLE!
|
||||
#Address to listen on for outgoing webhook requests from slack
|
||||
#See account settings - integrations - outgoing webhooks on slack
|
||||
#This setting will not be used when useAPI is eanbled
|
||||
#webhooks
|
||||
#REQUIRED (unless useAPI=true)
|
||||
BindAddress="0.0.0.0:9999"
|
||||
|
||||
#### Settings for using slack API (RECOMMENDED)
|
||||
#OPTIONAL
|
||||
useAPI=false
|
||||
|
||||
#Token to connect with the Slack API
|
||||
#You'll have to use a test/api-token using a dedicated user and not a bot token.
|
||||
#See https://github.com/42wim/matterbridge/issues/75 for more info.
|
||||
#Use https://api.slack.com/custom-integrations/legacy-tokens
|
||||
#REQUIRED (when useAPI=true)
|
||||
Token="yourslacktoken"
|
||||
|
||||
#### Shared settings for webhooks and API
|
||||
WebhookBindAddress="0.0.0.0:9999"
|
||||
|
||||
#Icon that will be showed in slack
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
@@ -342,6 +524,14 @@ NickFormatter="plain"
|
||||
#OPTIONAL (default 4)
|
||||
NicksPerRow=4
|
||||
|
||||
#Disable sending of edits to other bridges
|
||||
#OPTIONAL (default false)
|
||||
EditDisable=true
|
||||
|
||||
#Message to be appended to every edited message
|
||||
#OPTIONAL (default empty)
|
||||
EditSuffix=" (edited)"
|
||||
|
||||
#Whether to prefix messages from other bridges to mattermost with RemoteNickFormat
|
||||
#Useful if username overrides for incoming webhooks isn't enabled on the
|
||||
#slack server. If you set PrefixMessagesWithNick to true, each message
|
||||
@@ -355,6 +545,29 @@ PrefixMessagesWithNick=false
|
||||
#OPTIONAL
|
||||
IgnoreNicks="ircspammer1 ircspammer2"
|
||||
|
||||
#Messages you want to ignore.
|
||||
#Messages matching these regexp will be ignored and not sent to other bridges
|
||||
#See https://regex-golang.appspot.com/assets/html/index.html for more regex info
|
||||
#OPTIONAL (example below ignores messages starting with ~~ or messages containing badword
|
||||
IgnoreMessages="^~~ badword"
|
||||
|
||||
#messages you want to replace.
|
||||
#it replaces outgoing messages from the bridge.
|
||||
#so you need to place it by the sending bridge definition.
|
||||
#regular expressions supported
|
||||
#some examples:
|
||||
#this replaces cat => dog and sleep => awake
|
||||
#replacemessages=[ ["cat","dog"], ["sleep","awake"] ]
|
||||
#this replaces every number with number. 123 => numbernumbernumber
|
||||
#replacemessages=[ ["[0-9]","number"] ]
|
||||
#optional (default empty)
|
||||
ReplaceMessages=[ ["cat","dog"] ]
|
||||
|
||||
#nicks you want to replace.
|
||||
#see replacemessages for syntaxa
|
||||
#optional (default empty)
|
||||
ReplaceNicks=[ ["user--","user"] ]
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge
|
||||
@@ -362,10 +575,16 @@ IgnoreNicks="ircspammer1 ircspammer2"
|
||||
#OPTIONAL (default empty)
|
||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
|
||||
#Enable to show users joins/parts from other bridges (only from irc-bridge at the moment)
|
||||
#Enable to show users joins/parts from other bridges
|
||||
#Only works hiding/show messages from irc and mattermost bridge for now
|
||||
#OPTIONAL (default false)
|
||||
ShowJoinPart=false
|
||||
|
||||
#StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285
|
||||
#It will strip other characters from the nick
|
||||
#OPTIONAL (default false)
|
||||
StripNick=false
|
||||
|
||||
###################################################################
|
||||
#discord section
|
||||
###################################################################
|
||||
@@ -385,11 +604,55 @@ Token="Yourtokenhere"
|
||||
#REQUIRED
|
||||
Server="yourservername"
|
||||
|
||||
#Shows title, description and URL of embedded messages (sent by other bots)
|
||||
#OPTIONAL (default false)
|
||||
ShowEmbeds=false
|
||||
|
||||
#Shows the username (minus the discriminator) instead of the server nickname
|
||||
#OPTIONAL (default false)
|
||||
UseUserName=false
|
||||
|
||||
#Specify WebhookURL. If given, will relay messages using the Webhook, which gives a better look to messages.
|
||||
#This only works if you have one discord channel, if you have multiple discord channels you'll have to specify it in the gateway config
|
||||
#OPTIONAL (default empty)
|
||||
WebhookURL="Yourwebhooktokenhere"
|
||||
|
||||
#Disable sending of edits to other bridges
|
||||
#OPTIONAL (default false)
|
||||
EditDisable=false
|
||||
|
||||
#Message to be appended to every edited message
|
||||
#OPTIONAL (default empty)
|
||||
EditSuffix=" (edited)"
|
||||
|
||||
#Nicks you want to ignore.
|
||||
#Messages from those users will not be sent to other bridges.
|
||||
#OPTIONAL
|
||||
IgnoreNicks="ircspammer1 ircspammer2"
|
||||
|
||||
#Messages you want to ignore.
|
||||
#Messages matching these regexp will be ignored and not sent to other bridges
|
||||
#See https://regex-golang.appspot.com/assets/html/index.html for more regex info
|
||||
#OPTIONAL (example below ignores messages starting with ~~ or messages containing badword
|
||||
IgnoreMessages="^~~ badword"
|
||||
|
||||
#messages you want to replace.
|
||||
#it replaces outgoing messages from the bridge.
|
||||
#so you need to place it by the sending bridge definition.
|
||||
#regular expressions supported
|
||||
#some examples:
|
||||
#this replaces cat => dog and sleep => awake
|
||||
#replacemessages=[ ["cat","dog"], ["sleep","awake"] ]
|
||||
#this replaces every number with number. 123 => numbernumbernumber
|
||||
#replacemessages=[ ["[0-9]","number"] ]
|
||||
#optional (default empty)
|
||||
ReplaceMessages=[ ["cat","dog"] ]
|
||||
|
||||
#nicks you want to replace.
|
||||
#see replacemessages for syntaxa
|
||||
#optional (default empty)
|
||||
ReplaceNicks=[ ["user--","user"] ]
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge
|
||||
@@ -397,10 +660,16 @@ IgnoreNicks="ircspammer1 ircspammer2"
|
||||
#OPTIONAL (default empty)
|
||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
|
||||
#Enable to show users joins/parts from other bridges (only from irc-bridge at the moment)
|
||||
#Enable to show users joins/parts from other bridges
|
||||
#Only works hiding/show messages from irc and mattermost bridge for now
|
||||
#OPTIONAL (default false)
|
||||
ShowJoinPart=false
|
||||
|
||||
#StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285
|
||||
#It will strip other characters from the nick
|
||||
#OPTIONAL (default false)
|
||||
StripNick=false
|
||||
|
||||
###################################################################
|
||||
#telegram section
|
||||
###################################################################
|
||||
@@ -420,11 +689,54 @@ Token="Yourtokenhere"
|
||||
#See https://core.telegram.org/bots/api#html-style
|
||||
MessageFormat=""
|
||||
|
||||
#If enabled use the "First Name" as username. If this is empty use the Username
|
||||
#If disabled use the "Username" as username. If this is empty use the First Name
|
||||
#If all names are empty, username will be "unknown"
|
||||
#OPTIONAL (default false)
|
||||
UseFirstName=false
|
||||
|
||||
#WARNING! If enabled this will relay GIF/stickers/documents and other attachments as URLs
|
||||
#Those URLs will contain your bot-token. This may not be what you want.
|
||||
#For now there is no secure way to relay GIF/stickers/documents without seeing your token.
|
||||
#OPTIONAL (default false)
|
||||
UseInsecureURL=false
|
||||
|
||||
#Disable sending of edits to other bridges
|
||||
#OPTIONAL (default false)
|
||||
EditDisable=false
|
||||
|
||||
#Message to be appended to every edited message
|
||||
#OPTIONAL (default empty)
|
||||
EditSuffix=" (edited)"
|
||||
|
||||
#Nicks you want to ignore.
|
||||
#Messages from those users will not be sent to other bridges.
|
||||
#OPTIONAL
|
||||
IgnoreNicks="spammer1 spammer2"
|
||||
|
||||
#Messages you want to ignore.
|
||||
#Messages matching these regexp will be ignored and not sent to other bridges
|
||||
#See https://regex-golang.appspot.com/assets/html/index.html for more regex info
|
||||
#OPTIONAL (example below ignores messages starting with ~~ or messages containing badword
|
||||
IgnoreMessages="^~~ badword"
|
||||
|
||||
#messages you want to replace.
|
||||
#it replaces outgoing messages from the bridge.
|
||||
#so you need to place it by the sending bridge definition.
|
||||
#regular expressions supported
|
||||
#some examples:
|
||||
#this replaces cat => dog and sleep => awake
|
||||
#replacemessages=[ ["cat","dog"], ["sleep","awake"] ]
|
||||
#this replaces every number with number. 123 => numbernumbernumber
|
||||
#replacemessages=[ ["[0-9]","number"] ]
|
||||
#optional (default empty)
|
||||
ReplaceMessages=[ ["cat","dog"] ]
|
||||
|
||||
#nicks you want to replace.
|
||||
#see replacemessages for syntaxa
|
||||
#optional (default empty)
|
||||
ReplaceNicks=[ ["user--","user"] ]
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge
|
||||
@@ -432,10 +744,15 @@ IgnoreNicks="spammer1 spammer2"
|
||||
#OPTIONAL (default empty)
|
||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
|
||||
#Enable to show users joins/parts from other bridges (only from irc-bridge at the moment)
|
||||
#Enable to show users joins/parts from other bridges
|
||||
#Only works hiding/show messages from irc and mattermost bridge for now
|
||||
#OPTIONAL (default false)
|
||||
ShowJoinPart=false
|
||||
|
||||
#StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285
|
||||
#It will strip other characters from the nick
|
||||
#OPTIONAL (default false)
|
||||
StripNick=false
|
||||
|
||||
###################################################################
|
||||
#rocketchat section
|
||||
@@ -450,12 +767,12 @@ ShowJoinPart=false
|
||||
#Read #https://rocket.chat/docs/administrator-guides/integrations/#how-to-create-a-new-incoming-webhook
|
||||
#See administration - integrations - new integration - incoming webhook
|
||||
#REQUIRED
|
||||
URL="https://yourdomain/hooks/yourhookkey"
|
||||
WebhookURL="https://yourdomain/hooks/yourhookkey"
|
||||
|
||||
#Address to listen on for outgoing webhook requests from rocketchat.
|
||||
#See administration - integrations - new integration - outgoing webhook
|
||||
#REQUIRED
|
||||
BindAddress="0.0.0.0:9999"
|
||||
WebhookBindAddress="0.0.0.0:9999"
|
||||
|
||||
#Your nick/username as specified in your incoming webhook "Post as" setting
|
||||
#REQUIRED
|
||||
@@ -482,6 +799,29 @@ PrefixMessagesWithNick=false
|
||||
#OPTIONAL
|
||||
IgnoreNicks="ircspammer1 ircspammer2"
|
||||
|
||||
#Messages you want to ignore.
|
||||
#Messages matching these regexp will be ignored and not sent to other bridges
|
||||
#See https://regex-golang.appspot.com/assets/html/index.html for more regex info
|
||||
#OPTIONAL (example below ignores messages starting with ~~ or messages containing badword
|
||||
IgnoreMessages="^~~ badword"
|
||||
|
||||
#messages you want to replace.
|
||||
#it replaces outgoing messages from the bridge.
|
||||
#so you need to place it by the sending bridge definition.
|
||||
#regular expressions supported
|
||||
#some examples:
|
||||
#this replaces cat => dog and sleep => awake
|
||||
#replacemessages=[ ["cat","dog"], ["sleep","awake"] ]
|
||||
#this replaces every number with number. 123 => numbernumbernumber
|
||||
#replacemessages=[ ["[0-9]","number"] ]
|
||||
#optional (default empty)
|
||||
ReplaceMessages=[ ["cat","dog"] ]
|
||||
|
||||
#nicks you want to replace.
|
||||
#see replacemessages for syntaxa
|
||||
#optional (default empty)
|
||||
ReplaceNicks=[ ["user--","user"] ]
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge
|
||||
@@ -489,10 +829,16 @@ IgnoreNicks="ircspammer1 ircspammer2"
|
||||
#OPTIONAL (default empty)
|
||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
|
||||
#Enable to show users joins/parts from other bridges (only from irc-bridge at the moment)
|
||||
#Enable to show users joins/parts from other bridges
|
||||
#Only works hiding/show messages from irc and mattermost bridge for now
|
||||
#OPTIONAL (default false)
|
||||
ShowJoinPart=false
|
||||
|
||||
#StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285
|
||||
#It will strip other characters from the nick
|
||||
#OPTIONAL (default false)
|
||||
StripNick=false
|
||||
|
||||
###################################################################
|
||||
#matrix section
|
||||
###################################################################
|
||||
@@ -513,6 +859,11 @@ Server="https://matrix.org"
|
||||
Login="yourlogin"
|
||||
Password="yourpass"
|
||||
|
||||
#Whether to send the homeserver suffix. eg ":matrix.org" in @username:matrix.org
|
||||
#to other bridges, or only send "username".(true only sends username)
|
||||
#OPTIONAL (default false)
|
||||
NoHomeServerSuffix=false
|
||||
|
||||
#Whether to prefix messages from other bridges to matrix with the sender's nick.
|
||||
#Useful if username overrides for incoming webhooks isn't enabled on the
|
||||
#matrix server. If you set PrefixMessagesWithNick to true, each message
|
||||
@@ -525,6 +876,29 @@ PrefixMessagesWithNick=false
|
||||
#OPTIONAL
|
||||
IgnoreNicks="spammer1 spammer2"
|
||||
|
||||
#Messages you want to ignore.
|
||||
#Messages matching these regexp will be ignored and not sent to other bridges
|
||||
#See https://regex-golang.appspot.com/assets/html/index.html for more regex info
|
||||
#OPTIONAL (example below ignores messages starting with ~~ or messages containing badword
|
||||
IgnoreMessages="^~~ badword"
|
||||
|
||||
#messages you want to replace.
|
||||
#it replaces outgoing messages from the bridge.
|
||||
#so you need to place it by the sending bridge definition.
|
||||
#regular expressions supported
|
||||
#some examples:
|
||||
#this replaces cat => dog and sleep => awake
|
||||
#replacemessages=[ ["cat","dog"], ["sleep","awake"] ]
|
||||
#this replaces every number with number. 123 => numbernumbernumber
|
||||
#replacemessages=[ ["[0-9]","number"] ]
|
||||
#optional (default empty)
|
||||
ReplaceMessages=[ ["cat","dog"] ]
|
||||
|
||||
#nicks you want to replace.
|
||||
#see replacemessages for syntaxa
|
||||
#optional (default empty)
|
||||
ReplaceNicks=[ ["user--","user"] ]
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge
|
||||
@@ -532,10 +906,86 @@ IgnoreNicks="spammer1 spammer2"
|
||||
#OPTIONAL (default empty)
|
||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
|
||||
#Enable to show users joins/parts from other bridges (only from irc-bridge at the moment)
|
||||
#Enable to show users joins/parts from other bridges
|
||||
#Only works hiding/show messages from irc and mattermost bridge for now
|
||||
#OPTIONAL (default false)
|
||||
ShowJoinPart=false
|
||||
|
||||
#StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285
|
||||
#It will strip other characters from the nick
|
||||
#OPTIONAL (default false)
|
||||
StripNick=false
|
||||
|
||||
###################################################################
|
||||
#steam section
|
||||
###################################################################
|
||||
[steam]
|
||||
#You can configure multiple servers "[steam.name]" or "[steam.name2]"
|
||||
#In this example we use [steam.gamechat]
|
||||
#REQUIRED
|
||||
|
||||
[steam.gamechat]
|
||||
#login/pass of your bot.
|
||||
#Use a dedicated user for this and not your own account!
|
||||
#REQUIRED
|
||||
Login="yourlogin"
|
||||
Password="yourpass"
|
||||
|
||||
#steamguard mail authcode (not the 2FA code)
|
||||
#OPTIONAL
|
||||
Authcode="ABCE12"
|
||||
|
||||
#Whether to prefix messages from other bridges to matrix with the sender's nick.
|
||||
#Useful if username overrides for incoming webhooks isn't enabled on the
|
||||
#matrix server. If you set PrefixMessagesWithNick to true, each message
|
||||
#from bridge to matrix will by default be prefixed by the RemoteNickFormat setting. i
|
||||
#OPTIONAL (default false)
|
||||
PrefixMessagesWithNick=false
|
||||
|
||||
#Nicks you want to ignore.
|
||||
#Messages from those users will not be sent to other bridges.
|
||||
#OPTIONAL
|
||||
IgnoreNicks="spammer1 spammer2"
|
||||
|
||||
#Messages you want to ignore.
|
||||
#Messages matching these regexp will be ignored and not sent to other bridges
|
||||
#See https://regex-golang.appspot.com/assets/html/index.html for more regex info
|
||||
#OPTIONAL (example below ignores messages starting with ~~ or messages containing badword
|
||||
IgnoreMessages="^~~ badword"
|
||||
|
||||
#messages you want to replace.
|
||||
#it replaces outgoing messages from the bridge.
|
||||
#so you need to place it by the sending bridge definition.
|
||||
#regular expressions supported
|
||||
#some examples:
|
||||
#this replaces cat => dog and sleep => awake
|
||||
#replacemessages=[ ["cat","dog"], ["sleep","awake"] ]
|
||||
#this replaces every number with number. 123 => numbernumbernumber
|
||||
#replacemessages=[ ["[0-9]","number"] ]
|
||||
#optional (default empty)
|
||||
ReplaceMessages=[ ["cat","dog"] ]
|
||||
|
||||
#nicks you want to replace.
|
||||
#see replacemessages for syntaxa
|
||||
#optional (default empty)
|
||||
ReplaceNicks=[ ["user--","user"] ]
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge
|
||||
#The string "{PROTOCOL}" (case sensitive) will be replaced by the protocol used by the bridge
|
||||
#OPTIONAL (default empty)
|
||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
|
||||
#Enable to show users joins/parts from other bridges
|
||||
#Only works hiding/show messages from irc and mattermost bridge for now
|
||||
#OPTIONAL (default false)
|
||||
ShowJoinPart=false
|
||||
|
||||
#StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285
|
||||
#It will strip other characters from the nick
|
||||
#OPTIONAL (default false)
|
||||
StripNick=false
|
||||
|
||||
###################################################################
|
||||
#API
|
||||
@@ -553,6 +1003,11 @@ BindAddress="127.0.0.1:4242"
|
||||
#Amount of messages to keep in memory
|
||||
Buffer=1000
|
||||
|
||||
#Bearer token used for authentication
|
||||
#curl -H "Authorization: Bearer token" http://localhost:4242/api/messages
|
||||
#OPTIONAL (no authorization if token is empty)
|
||||
Token="mytoken"
|
||||
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
#The string "{BRIDGE}" (case sensitive) will be replaced by the sending bridge
|
||||
@@ -560,10 +1015,12 @@ Buffer=1000
|
||||
#OPTIONAL (default empty)
|
||||
RemoteNickFormat="{NICK}"
|
||||
|
||||
|
||||
|
||||
###################################################################
|
||||
#General configuration
|
||||
###################################################################
|
||||
#Settings here override specific settings for each protocol
|
||||
# Settings here are defaults that each protocol can override
|
||||
[general]
|
||||
#RemoteNickFormat defines how remote users appear on this bridge
|
||||
#The string "{NICK}" (case sensitive) will be replaced by the actual nick / username.
|
||||
@@ -572,6 +1029,35 @@ RemoteNickFormat="{NICK}"
|
||||
#OPTIONAL (default empty)
|
||||
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
|
||||
#StripNick only allows alphanumerical nicks. See https://github.com/42wim/matterbridge/issues/285
|
||||
#It will strip other characters from the nick
|
||||
#OPTIONAL (default false)
|
||||
StripNick=false
|
||||
|
||||
|
||||
#MediaServerUpload and MediaServerDownload are used for uploading images/files/video to
|
||||
#a remote "mediaserver" (a webserver like caddy for example).
|
||||
#When configured images/files uploaded on bridges like mattermost,slack, telegram will be downloaded
|
||||
#and uploaded again to MediaServerUpload URL
|
||||
#The MediaServerDownload will be used so that bridges without native uploading support:
|
||||
#gitter, irc and xmpp will be shown links to the files on MediaServerDownload
|
||||
#
|
||||
#More information https://github.com/42wim/matterbridge/wiki/Mediaserver-setup-%5Badvanced%5D
|
||||
#OPTIONAL (default empty)
|
||||
MediaServerUpload="https://user:pass@yourserver.com/upload"
|
||||
#OPTIONAL (default empty)
|
||||
MediaServerDownload="https://youserver.com/download"
|
||||
|
||||
#MediaDownloadSize is the maximum size of attachments, videos, images
|
||||
#matterbridge will download and upload this file to bridges that also support uploading files.
|
||||
#eg downloading from slack to upload it to mattermost
|
||||
#
|
||||
#It will only download from bridges that don't have public links available, which are for the moment
|
||||
#slack, telegram and matrix
|
||||
#
|
||||
#Optional (default 1000000 (1 megabyte))
|
||||
MediaDownloadSize=1000000
|
||||
|
||||
###################################################################
|
||||
#Gateway configuration
|
||||
###################################################################
|
||||
@@ -587,7 +1073,7 @@ RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
|
||||
#
|
||||
|
||||
[[gateway]]
|
||||
#OPTIONAL (not used for now)
|
||||
#REQUIRED and UNIQUE
|
||||
name="gateway1"
|
||||
#Enable enables this gateway
|
||||
##OPTIONAL (default false)
|
||||
@@ -603,19 +1089,23 @@ enable=true
|
||||
#channel to connect on that account
|
||||
#How to specify them for the different bridges:
|
||||
#
|
||||
#irc - #channel (# is required)
|
||||
#irc - #channel (# is required) (this needs to be lowercase!)
|
||||
#mattermost - channel (the channel name as seen in the URL, not the displayname)
|
||||
#gitter - username/room
|
||||
#xmpp - channel
|
||||
#slack - channel (the channel name as seen in the URL, not the displayname)
|
||||
#slack - channel (without the #)
|
||||
#discord - channel (without the #)
|
||||
# - ID:123456789 (where 123456789 is the channel ID)
|
||||
# (https://github.com/42wim/matterbridge/issues/57)
|
||||
#telegram - chatid (a large negative number, eg -123456789)
|
||||
# see (https://www.linkedin.com/pulse/telegram-bots-beginners-marco-frau)
|
||||
#hipchat - id_channel (see https://www.hipchat.com/account/xmpp for the correct channel)
|
||||
#rocketchat - #channel (# is required)
|
||||
#rocketchat - #channel (# is required (also needed for private channels!)
|
||||
#matrix - #channel:server (eg #yourchannel:matrix.org)
|
||||
# - encrypted rooms are not supported in matrix
|
||||
#steam - chatid (a large number).
|
||||
# The number in the URL when you click "enter chat room" in the browser
|
||||
#
|
||||
#REQUIRED
|
||||
channel="#testing"
|
||||
|
||||
@@ -646,12 +1136,22 @@ enable=true
|
||||
#OPTIONAL - your irc channel key
|
||||
key="yourkey"
|
||||
|
||||
[[gateway.inout]]
|
||||
account="discord.game"
|
||||
channel="mygreatgame"
|
||||
|
||||
#OPTIONAL - webhookurl only works for discord (it needs a different URL for each cahnnel)
|
||||
[gateway.inout.options]
|
||||
webhookurl=""https://discordapp.com/api/webhooks/123456789123456789/C9WPqExYWONPDZabcdef-def1434FGFjstasJX9pYht73y"
|
||||
|
||||
#API example
|
||||
#[[gateway.inout]]
|
||||
#account="api.local"
|
||||
#channel="api"
|
||||
#To send data to the api:
|
||||
#curl -XPOST -H 'Content-Type: application/json' -d '{"text":"test","username":"randomuser"}' http://localhost:4242/api/message
|
||||
#curl -XPOST -H 'Content-Type: application/json' -d '{"text":"test","username":"randomuser","gateway":"gateway1"}' http://localhost:4242/api/message
|
||||
#To read from the api:
|
||||
#curl http://localhost:4242/api/messages
|
||||
|
||||
#If you want to do a 1:1 mapping between protocols where the channelnames are the same
|
||||
#e.g. slack and mattermost you can use the samechannelgateway configuration
|
||||
@@ -659,6 +1159,7 @@ enable=true
|
||||
#channel testing on slack and vice versa. (and for the channel testing2 and testing3)
|
||||
|
||||
[[samechannelgateway]]
|
||||
name="samechannel1"
|
||||
enable = false
|
||||
accounts = [ "mattermost.work","slack.hobby" ]
|
||||
channels = [ "testing","testing2","testing3"]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#WARNING: as this file contains credentials, be sure to set correct file permissions
|
||||
[irc]
|
||||
[irc.freenode]
|
||||
Server="irc.freenode.net:6667"
|
||||
@@ -5,7 +6,7 @@
|
||||
|
||||
[mattermost]
|
||||
[mattermost.work]
|
||||
useAPI=true
|
||||
#do not prefix it wit http:// or https://
|
||||
Server="yourmattermostserver.domain"
|
||||
Team="yourteam"
|
||||
Login="yourlogin"
|
||||
@@ -15,19 +16,11 @@
|
||||
[[gateway]]
|
||||
name="gateway1"
|
||||
enable=true
|
||||
[[gateway.in]]
|
||||
[[gateway.inout]]
|
||||
account="irc.freenode"
|
||||
channel="#testing"
|
||||
|
||||
[[gateway.out]]
|
||||
account="irc.freenode"
|
||||
channel="#testing"
|
||||
|
||||
[[gateway.in]]
|
||||
account="mattermost.work"
|
||||
channel="off-topic"
|
||||
|
||||
[[gateway.out]]
|
||||
[[gateway.inout]]
|
||||
account="mattermost.work"
|
||||
channel="off-topic"
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
package matterclient
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/http/cookiejar"
|
||||
"net/url"
|
||||
@@ -14,6 +16,7 @@ import (
|
||||
log "github.com/Sirupsen/logrus"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/hashicorp/golang-lru"
|
||||
"github.com/jpillora/backoff"
|
||||
"github.com/mattermost/platform/model"
|
||||
)
|
||||
@@ -34,13 +37,15 @@ type Message struct {
|
||||
Channel string
|
||||
Username string
|
||||
Text string
|
||||
Type string
|
||||
UserID string
|
||||
}
|
||||
|
||||
type Team struct {
|
||||
Team *model.Team
|
||||
Id string
|
||||
Channels *model.ChannelList
|
||||
MoreChannels *model.ChannelList
|
||||
Channels []*model.Channel
|
||||
MoreChannels []*model.Channel
|
||||
Users map[string]*model.User
|
||||
}
|
||||
|
||||
@@ -49,7 +54,7 @@ type MMClient struct {
|
||||
*Credentials
|
||||
Team *Team
|
||||
OtherTeams []*Team
|
||||
Client *model.Client
|
||||
Client *model.Client4
|
||||
User *model.User
|
||||
Users map[string]*model.User
|
||||
MessageChan chan *Message
|
||||
@@ -60,6 +65,9 @@ type MMClient struct {
|
||||
WsConnected bool
|
||||
WsSequence int64
|
||||
WsPingChan chan *model.WebSocketResponse
|
||||
ServerVersion string
|
||||
OnWsConnect func()
|
||||
lruCache *lru.Cache
|
||||
}
|
||||
|
||||
func New(login, pass, team, server string) *MMClient {
|
||||
@@ -67,6 +75,7 @@ func New(login, pass, team, server string) *MMClient {
|
||||
mmclient := &MMClient{Credentials: cred, MessageChan: make(chan *Message, 100), Users: make(map[string]*model.User)}
|
||||
mmclient.log = log.WithFields(log.Fields{"module": "matterclient"})
|
||||
log.SetFormatter(&log.TextFormatter{FullTimestamp: true})
|
||||
mmclient.lruCache, _ = lru.New(500)
|
||||
return mmclient
|
||||
}
|
||||
|
||||
@@ -82,7 +91,7 @@ func (m *MMClient) SetLogLevel(level string) {
|
||||
func (m *MMClient) Login() error {
|
||||
// check if this is a first connect or a reconnection
|
||||
firstConnection := true
|
||||
if m.WsConnected == true {
|
||||
if m.WsConnected {
|
||||
firstConnection = false
|
||||
}
|
||||
m.WsConnected = false
|
||||
@@ -95,39 +104,62 @@ func (m *MMClient) Login() error {
|
||||
Jitter: true,
|
||||
}
|
||||
uriScheme := "https://"
|
||||
wsScheme := "wss://"
|
||||
if m.NoTLS {
|
||||
uriScheme = "http://"
|
||||
wsScheme = "ws://"
|
||||
}
|
||||
// login to mattermost
|
||||
m.Client = model.NewClient(uriScheme + m.Credentials.Server)
|
||||
m.Client.HttpClient.Transport = &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: m.SkipTLSVerify}}
|
||||
m.Client = model.NewAPIv4Client(uriScheme + m.Credentials.Server)
|
||||
m.Client.HttpClient.Transport = &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: m.SkipTLSVerify}, Proxy: http.ProxyFromEnvironment}
|
||||
m.Client.HttpClient.Timeout = time.Second * 10
|
||||
var myinfo *model.Result
|
||||
|
||||
for {
|
||||
d := b.Duration()
|
||||
// bogus call to get the serverversion
|
||||
_, resp := m.Client.Logout()
|
||||
if resp.Error != nil {
|
||||
return fmt.Errorf("%#v", resp.Error.Error())
|
||||
}
|
||||
if firstConnection && !supportedVersion(resp.ServerVersion) {
|
||||
return fmt.Errorf("unsupported mattermost version: %s", resp.ServerVersion)
|
||||
}
|
||||
m.ServerVersion = resp.ServerVersion
|
||||
if m.ServerVersion == "" {
|
||||
m.log.Debugf("Server not up yet, reconnecting in %s", d)
|
||||
time.Sleep(d)
|
||||
} else {
|
||||
m.log.Infof("Found version %s", m.ServerVersion)
|
||||
break
|
||||
}
|
||||
}
|
||||
b.Reset()
|
||||
|
||||
var resp *model.Response
|
||||
//var myinfo *model.Result
|
||||
var appErr *model.AppError
|
||||
var logmsg = "trying login"
|
||||
for {
|
||||
m.log.Debugf("%s %s %s %s", logmsg, m.Credentials.Team, m.Credentials.Login, m.Credentials.Server)
|
||||
if strings.Contains(m.Credentials.Pass, model.SESSION_COOKIE_TOKEN) {
|
||||
m.log.Debugf(logmsg+" with %s", model.SESSION_COOKIE_TOKEN)
|
||||
m.log.Debugf(logmsg + " with token")
|
||||
token := strings.Split(m.Credentials.Pass, model.SESSION_COOKIE_TOKEN+"=")
|
||||
if len(token) != 2 {
|
||||
return errors.New("incorrect MMAUTHTOKEN. valid input is MMAUTHTOKEN=yourtoken")
|
||||
}
|
||||
m.Client.HttpClient.Jar = m.createCookieJar(token[1])
|
||||
m.Client.MockSession(token[1])
|
||||
myinfo, appErr = m.Client.GetMe("")
|
||||
if appErr != nil {
|
||||
return errors.New(appErr.DetailedError)
|
||||
m.Client.AuthToken = token[1]
|
||||
m.Client.AuthType = model.HEADER_BEARER
|
||||
m.User, resp = m.Client.GetMe("")
|
||||
if resp.Error != nil {
|
||||
return resp.Error
|
||||
}
|
||||
if myinfo.Data.(*model.User) == nil {
|
||||
if m.User == nil {
|
||||
m.log.Errorf("LOGIN TOKEN: %s is invalid", m.Credentials.Pass)
|
||||
return errors.New("invalid " + model.SESSION_COOKIE_TOKEN)
|
||||
}
|
||||
} else {
|
||||
myinfo, appErr = m.Client.Login(m.Credentials.Login, m.Credentials.Pass)
|
||||
m.User, resp = m.Client.Login(m.Credentials.Login, m.Credentials.Pass)
|
||||
}
|
||||
appErr = resp.Error
|
||||
if appErr != nil {
|
||||
d := b.Duration()
|
||||
m.log.Debug(appErr.DetailedError)
|
||||
@@ -155,17 +187,34 @@ func (m *MMClient) Login() error {
|
||||
if m.Team == nil {
|
||||
return errors.New("team not found")
|
||||
}
|
||||
// set our team id as default route
|
||||
m.Client.SetTeamId(m.Team.Id)
|
||||
|
||||
m.wsConnect()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MMClient) wsConnect() {
|
||||
b := &backoff.Backoff{
|
||||
Min: time.Second,
|
||||
Max: 5 * time.Minute,
|
||||
Jitter: true,
|
||||
}
|
||||
|
||||
m.WsConnected = false
|
||||
wsScheme := "wss://"
|
||||
if m.NoTLS {
|
||||
wsScheme = "ws://"
|
||||
}
|
||||
|
||||
// setup websocket connection
|
||||
wsurl := wsScheme + m.Credentials.Server + model.API_URL_SUFFIX_V3 + "/users/websocket"
|
||||
wsurl := wsScheme + m.Credentials.Server + model.API_URL_SUFFIX_V4 + "/websocket"
|
||||
header := http.Header{}
|
||||
header.Set(model.HEADER_AUTH, "BEARER "+m.Client.AuthToken)
|
||||
|
||||
m.log.Debugf("WsClient: making connection: %s", wsurl)
|
||||
for {
|
||||
wsDialer := &websocket.Dialer{Proxy: http.ProxyFromEnvironment, TLSClientConfig: &tls.Config{InsecureSkipVerify: m.SkipTLSVerify}}
|
||||
var err error
|
||||
m.WsClient, _, err = wsDialer.Dial(wsurl, header)
|
||||
if err != nil {
|
||||
d := b.Duration()
|
||||
@@ -175,14 +224,12 @@ func (m *MMClient) Login() error {
|
||||
}
|
||||
break
|
||||
}
|
||||
b.Reset()
|
||||
|
||||
m.log.Debug("WsClient: connected")
|
||||
m.WsSequence = 1
|
||||
m.WsPingChan = make(chan *model.WebSocketResponse)
|
||||
// only start to parse WS messages when login is completely done
|
||||
m.WsConnected = true
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MMClient) Logout() error {
|
||||
@@ -190,9 +237,13 @@ func (m *MMClient) Logout() error {
|
||||
m.WsQuit = true
|
||||
m.WsClient.Close()
|
||||
m.WsClient.UnderlyingConn().Close()
|
||||
_, err := m.Client.Logout()
|
||||
if err != nil {
|
||||
return err
|
||||
if strings.Contains(m.Credentials.Pass, model.SESSION_COOKIE_TOKEN) {
|
||||
m.log.Debug("Not invalidating session in logout, credential is a token")
|
||||
return nil
|
||||
}
|
||||
_, resp := m.Client.Logout()
|
||||
if resp.Error != nil {
|
||||
return resp.Error
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -215,21 +266,31 @@ func (m *MMClient) WsReceiver() {
|
||||
if _, rawMsg, err = m.WsClient.ReadMessage(); err != nil {
|
||||
m.log.Error("error:", err)
|
||||
// reconnect
|
||||
m.Login()
|
||||
m.wsConnect()
|
||||
}
|
||||
|
||||
var event model.WebSocketEvent
|
||||
if err := json.Unmarshal(rawMsg, &event); err == nil && event.IsValid() {
|
||||
m.log.Debugf("WsReceiver: %#v", event)
|
||||
m.log.Debugf("WsReceiver event: %#v", event)
|
||||
msg := &Message{Raw: &event, Team: m.Credentials.Team}
|
||||
m.parseMessage(msg)
|
||||
// check if we didn't empty the message
|
||||
if msg.Text != "" {
|
||||
m.MessageChan <- msg
|
||||
continue
|
||||
}
|
||||
// if we have file attached but the message is empty, also send it
|
||||
if msg.Post != nil {
|
||||
if msg.Text != "" || len(msg.Post.FileIds) > 0 || msg.Post.Type == "slack_attachment" {
|
||||
m.MessageChan <- msg
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
var response model.WebSocketResponse
|
||||
if err := json.Unmarshal(rawMsg, &response); err == nil && response.IsValid() {
|
||||
m.log.Debugf("WsReceiver: %#v", response)
|
||||
m.log.Debugf("WsReceiver response: %#v", response)
|
||||
m.parseResponse(response)
|
||||
continue
|
||||
}
|
||||
@@ -238,7 +299,7 @@ func (m *MMClient) WsReceiver() {
|
||||
|
||||
func (m *MMClient) parseMessage(rmsg *Message) {
|
||||
switch rmsg.Raw.Event {
|
||||
case model.WEBSOCKET_EVENT_POSTED:
|
||||
case model.WEBSOCKET_EVENT_POSTED, model.WEBSOCKET_EVENT_POST_EDITED, model.WEBSOCKET_EVENT_POST_DELETED:
|
||||
m.parseActionPost(rmsg)
|
||||
/*
|
||||
case model.ACTION_USER_REMOVED:
|
||||
@@ -259,46 +320,70 @@ func (m *MMClient) parseResponse(rmsg model.WebSocketResponse) {
|
||||
}
|
||||
|
||||
func (m *MMClient) parseActionPost(rmsg *Message) {
|
||||
// add post to cache, if it already exists don't relay this again.
|
||||
// this should fix reposts
|
||||
if ok, _ := m.lruCache.ContainsOrAdd(digestString(rmsg.Raw.Data["post"].(string)), true); ok {
|
||||
m.log.Debugf("message %#v in cache, not processing again", rmsg.Raw.Data["post"].(string))
|
||||
rmsg.Text = ""
|
||||
return
|
||||
}
|
||||
data := model.PostFromJson(strings.NewReader(rmsg.Raw.Data["post"].(string)))
|
||||
// we don't have the user, refresh the userlist
|
||||
if m.GetUser(data.UserId) == nil {
|
||||
m.UpdateUsers()
|
||||
m.log.Infof("User %s is not known, ignoring message %s", data)
|
||||
return
|
||||
}
|
||||
rmsg.Username = m.GetUser(data.UserId).Username
|
||||
rmsg.Username = m.GetUserName(data.UserId)
|
||||
rmsg.Channel = m.GetChannelName(data.ChannelId)
|
||||
rmsg.Team = m.GetTeamName(rmsg.Raw.Data["team_id"].(string))
|
||||
rmsg.UserID = data.UserId
|
||||
rmsg.Type = data.Type
|
||||
teamid, _ := rmsg.Raw.Data["team_id"].(string)
|
||||
// edit messsages have no team_id for some reason
|
||||
if teamid == "" {
|
||||
// we can find the team_id from the channelid
|
||||
teamid = m.GetChannelTeamId(data.ChannelId)
|
||||
rmsg.Raw.Data["team_id"] = teamid
|
||||
}
|
||||
if teamid != "" {
|
||||
rmsg.Team = m.GetTeamName(teamid)
|
||||
}
|
||||
// direct message
|
||||
if rmsg.Raw.Data["channel_type"] == "D" {
|
||||
rmsg.Channel = m.GetUser(data.UserId).Username
|
||||
}
|
||||
rmsg.Text = data.Message
|
||||
rmsg.Post = data
|
||||
return
|
||||
}
|
||||
|
||||
func (m *MMClient) UpdateUsers() error {
|
||||
mmusers, err := m.Client.GetProfiles(0, 50000, "")
|
||||
if err != nil {
|
||||
return errors.New(err.DetailedError)
|
||||
mmusers, resp := m.Client.GetUsers(0, 50000, "")
|
||||
if resp.Error != nil {
|
||||
return errors.New(resp.Error.DetailedError)
|
||||
}
|
||||
m.Lock()
|
||||
m.Users = mmusers.Data.(map[string]*model.User)
|
||||
for _, user := range mmusers {
|
||||
m.Users[user.Id] = user
|
||||
}
|
||||
m.Unlock()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MMClient) UpdateChannels() error {
|
||||
mmchannels, err := m.Client.GetChannels("")
|
||||
if err != nil {
|
||||
return errors.New(err.DetailedError)
|
||||
}
|
||||
mmchannels2, err := m.Client.GetMoreChannels("")
|
||||
if err != nil {
|
||||
return errors.New(err.DetailedError)
|
||||
mmchannels, resp := m.Client.GetChannelsForTeamForUser(m.Team.Id, m.User.Id, "")
|
||||
if resp.Error != nil {
|
||||
return errors.New(resp.Error.DetailedError)
|
||||
}
|
||||
m.Lock()
|
||||
m.Team.Channels = mmchannels.Data.(*model.ChannelList)
|
||||
m.Team.MoreChannels = mmchannels2.Data.(*model.ChannelList)
|
||||
m.Team.Channels = mmchannels
|
||||
m.Unlock()
|
||||
|
||||
mmchannels, resp = m.Client.GetPublicChannelsForTeam(m.Team.Id, 0, 5000, "")
|
||||
if resp.Error != nil {
|
||||
return errors.New(resp.Error.DetailedError)
|
||||
}
|
||||
|
||||
m.Lock()
|
||||
m.Team.MoreChannels = mmchannels
|
||||
m.Unlock()
|
||||
return nil
|
||||
}
|
||||
@@ -307,12 +392,24 @@ func (m *MMClient) GetChannelName(channelId string) string {
|
||||
m.RLock()
|
||||
defer m.RUnlock()
|
||||
for _, t := range m.OtherTeams {
|
||||
for _, channel := range append(*t.Channels, *t.MoreChannels...) {
|
||||
if t == nil {
|
||||
continue
|
||||
}
|
||||
if t.Channels != nil {
|
||||
for _, channel := range t.Channels {
|
||||
if channel.Id == channelId {
|
||||
return channel.Name
|
||||
}
|
||||
}
|
||||
}
|
||||
if t.MoreChannels != nil {
|
||||
for _, channel := range t.MoreChannels {
|
||||
if channel.Id == channelId {
|
||||
return channel.Name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
@@ -324,7 +421,7 @@ func (m *MMClient) GetChannelId(name string, teamId string) string {
|
||||
}
|
||||
for _, t := range m.OtherTeams {
|
||||
if t.Id == teamId {
|
||||
for _, channel := range append(*t.Channels, *t.MoreChannels...) {
|
||||
for _, channel := range append(t.Channels, t.MoreChannels...) {
|
||||
if channel.Name == name {
|
||||
return channel.Id
|
||||
}
|
||||
@@ -334,11 +431,24 @@ func (m *MMClient) GetChannelId(name string, teamId string) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *MMClient) GetChannelTeamId(id string) string {
|
||||
m.RLock()
|
||||
defer m.RUnlock()
|
||||
for _, t := range append(m.OtherTeams, m.Team) {
|
||||
for _, channel := range append(t.Channels, t.MoreChannels...) {
|
||||
if channel.Id == id {
|
||||
return channel.TeamId
|
||||
}
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *MMClient) GetChannelHeader(channelId string) string {
|
||||
m.RLock()
|
||||
defer m.RUnlock()
|
||||
for _, t := range m.OtherTeams {
|
||||
for _, channel := range append(*t.Channels, *t.MoreChannels...) {
|
||||
for _, channel := range append(t.Channels, t.MoreChannels...) {
|
||||
if channel.Id == channelId {
|
||||
return channel.Header
|
||||
}
|
||||
@@ -348,55 +458,85 @@ func (m *MMClient) GetChannelHeader(channelId string) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *MMClient) PostMessage(channelId string, text string) {
|
||||
func (m *MMClient) PostMessage(channelId string, text string) (string, error) {
|
||||
post := &model.Post{ChannelId: channelId, Message: text}
|
||||
m.Client.CreatePost(post)
|
||||
res, resp := m.Client.CreatePost(post)
|
||||
if resp.Error != nil {
|
||||
return "", resp.Error
|
||||
}
|
||||
return res.Id, nil
|
||||
}
|
||||
|
||||
func (m *MMClient) PostMessageWithFiles(channelId string, text string, fileIds []string) (string, error) {
|
||||
post := &model.Post{ChannelId: channelId, Message: text, FileIds: fileIds}
|
||||
res, resp := m.Client.CreatePost(post)
|
||||
if resp.Error != nil {
|
||||
return "", resp.Error
|
||||
}
|
||||
return res.Id, nil
|
||||
}
|
||||
|
||||
func (m *MMClient) EditMessage(postId string, text string) (string, error) {
|
||||
post := &model.Post{Message: text}
|
||||
res, resp := m.Client.UpdatePost(postId, post)
|
||||
if resp.Error != nil {
|
||||
return "", resp.Error
|
||||
}
|
||||
return res.Id, nil
|
||||
}
|
||||
|
||||
func (m *MMClient) DeleteMessage(postId string) error {
|
||||
_, resp := m.Client.DeletePost(postId)
|
||||
if resp.Error != nil {
|
||||
return resp.Error
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MMClient) JoinChannel(channelId string) error {
|
||||
m.RLock()
|
||||
defer m.RUnlock()
|
||||
for _, c := range *m.Team.Channels {
|
||||
for _, c := range m.Team.Channels {
|
||||
if c.Id == channelId {
|
||||
m.log.Debug("Not joining ", channelId, " already joined.")
|
||||
return nil
|
||||
}
|
||||
}
|
||||
m.log.Debug("Joining ", channelId)
|
||||
_, err := m.Client.JoinChannel(channelId)
|
||||
if err != nil {
|
||||
return errors.New("failed to join")
|
||||
_, resp := m.Client.AddChannelMember(channelId, m.User.Id)
|
||||
if resp.Error != nil {
|
||||
return resp.Error
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MMClient) GetPostsSince(channelId string, time int64) *model.PostList {
|
||||
res, err := m.Client.GetPostsSince(channelId, time)
|
||||
if err != nil {
|
||||
res, resp := m.Client.GetPostsSince(channelId, time)
|
||||
if resp.Error != nil {
|
||||
return nil
|
||||
}
|
||||
return res.Data.(*model.PostList)
|
||||
return res
|
||||
}
|
||||
|
||||
func (m *MMClient) SearchPosts(query string) *model.PostList {
|
||||
res, err := m.Client.SearchPosts(query, false)
|
||||
if err != nil {
|
||||
res, resp := m.Client.SearchPosts(m.Team.Id, query, false)
|
||||
if resp.Error != nil {
|
||||
return nil
|
||||
}
|
||||
return res.Data.(*model.PostList)
|
||||
return res
|
||||
}
|
||||
|
||||
func (m *MMClient) GetPosts(channelId string, limit int) *model.PostList {
|
||||
res, err := m.Client.GetPosts(channelId, 0, limit, "")
|
||||
if err != nil {
|
||||
res, resp := m.Client.GetPostsForChannel(channelId, 0, limit, "")
|
||||
if resp.Error != nil {
|
||||
return nil
|
||||
}
|
||||
return res.Data.(*model.PostList)
|
||||
return res
|
||||
}
|
||||
|
||||
func (m *MMClient) GetPublicLink(filename string) string {
|
||||
res, err := m.Client.GetPublicLink(filename)
|
||||
if err != nil {
|
||||
res, resp := m.Client.GetFileLink(filename)
|
||||
if resp.Error != nil {
|
||||
return ""
|
||||
}
|
||||
return res
|
||||
@@ -405,8 +545,27 @@ func (m *MMClient) GetPublicLink(filename string) string {
|
||||
func (m *MMClient) GetPublicLinks(filenames []string) []string {
|
||||
var output []string
|
||||
for _, f := range filenames {
|
||||
res, err := m.Client.GetPublicLink(f)
|
||||
if err != nil {
|
||||
res, resp := m.Client.GetFileLink(f)
|
||||
if resp.Error != nil {
|
||||
continue
|
||||
}
|
||||
output = append(output, res)
|
||||
}
|
||||
return output
|
||||
}
|
||||
|
||||
func (m *MMClient) GetFileLinks(filenames []string) []string {
|
||||
uriScheme := "https://"
|
||||
if m.NoTLS {
|
||||
uriScheme = "http://"
|
||||
}
|
||||
|
||||
var output []string
|
||||
for _, f := range filenames {
|
||||
res, resp := m.Client.GetFileLink(f)
|
||||
if resp.Error != nil {
|
||||
// public links is probably disabled, create the link ourselves
|
||||
output = append(output, uriScheme+m.Credentials.Server+model.API_URL_SUFFIX_V3+"/files/"+f+"/get")
|
||||
continue
|
||||
}
|
||||
output = append(output, res)
|
||||
@@ -415,36 +574,43 @@ func (m *MMClient) GetPublicLinks(filenames []string) []string {
|
||||
}
|
||||
|
||||
func (m *MMClient) UpdateChannelHeader(channelId string, header string) {
|
||||
data := make(map[string]string)
|
||||
data["channel_id"] = channelId
|
||||
data["channel_header"] = header
|
||||
channel := &model.Channel{Id: channelId, Header: header}
|
||||
m.log.Debugf("updating channelheader %#v, %#v", channelId, header)
|
||||
_, err := m.Client.UpdateChannelHeader(data)
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
_, resp := m.Client.UpdateChannel(channel)
|
||||
if resp.Error != nil {
|
||||
log.Error(resp.Error)
|
||||
}
|
||||
}
|
||||
|
||||
func (m *MMClient) UpdateLastViewed(channelId string) {
|
||||
m.log.Debugf("posting lastview %#v", channelId)
|
||||
_, err := m.Client.UpdateLastViewedAt(channelId, true)
|
||||
if err != nil {
|
||||
m.log.Error(err)
|
||||
view := &model.ChannelView{ChannelId: channelId}
|
||||
res, _ := m.Client.ViewChannel(m.User.Id, view)
|
||||
if !res {
|
||||
m.log.Errorf("ChannelView update for %s failed", channelId)
|
||||
}
|
||||
}
|
||||
|
||||
func (m *MMClient) UpdateUserNick(nick string) error {
|
||||
user := m.User
|
||||
user.Nickname = nick
|
||||
_, resp := m.Client.UpdateUser(user)
|
||||
if resp.Error != nil {
|
||||
return resp.Error
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MMClient) UsernamesInChannel(channelId string) []string {
|
||||
res, err := m.Client.GetMyChannelMembers()
|
||||
if err != nil {
|
||||
m.log.Errorf("UsernamesInChannel(%s) failed: %s", channelId, err)
|
||||
res, resp := m.Client.GetChannelMembers(channelId, 0, 50000, "")
|
||||
if resp.Error != nil {
|
||||
m.log.Errorf("UsernamesInChannel(%s) failed: %s", channelId, resp.Error)
|
||||
return []string{}
|
||||
}
|
||||
members := res.Data.(*model.ChannelMembers)
|
||||
allusers := m.GetUsers()
|
||||
result := []string{}
|
||||
for _, channel := range *members {
|
||||
if channel.ChannelId == channelId {
|
||||
result = append(result, m.GetUser(channel.UserId).Username)
|
||||
}
|
||||
for _, member := range *res {
|
||||
result = append(result, allusers[member.UserId].Nickname)
|
||||
}
|
||||
return result
|
||||
}
|
||||
@@ -468,22 +634,15 @@ func (m *MMClient) createCookieJar(token string) *cookiejar.Jar {
|
||||
func (m *MMClient) SendDirectMessage(toUserId string, msg string) {
|
||||
m.log.Debugf("SendDirectMessage to %s, msg %s", toUserId, msg)
|
||||
// create DM channel (only happens on first message)
|
||||
_, err := m.Client.CreateDirectChannel(toUserId)
|
||||
if err != nil {
|
||||
m.log.Debugf("SendDirectMessage to %#v failed: %s", toUserId, err)
|
||||
_, resp := m.Client.CreateDirectChannel(m.User.Id, toUserId)
|
||||
if resp.Error != nil {
|
||||
m.log.Debugf("SendDirectMessage to %#v failed: %s", toUserId, resp.Error)
|
||||
return
|
||||
}
|
||||
channelName := model.GetDMNameFromIds(toUserId, m.User.Id)
|
||||
|
||||
// update our channels
|
||||
mmchannels, err := m.Client.GetChannels("")
|
||||
if err != nil {
|
||||
m.log.Debug("SendDirectMessage: Couldn't update channels")
|
||||
return
|
||||
}
|
||||
m.Lock()
|
||||
m.Team.Channels = mmchannels.Data.(*model.ChannelList)
|
||||
m.Unlock()
|
||||
m.UpdateChannels()
|
||||
|
||||
// build & send the message
|
||||
msg = strings.Replace(msg, "\r", "", -1)
|
||||
@@ -509,10 +668,10 @@ func (m *MMClient) GetChannels() []*model.Channel {
|
||||
defer m.RUnlock()
|
||||
var channels []*model.Channel
|
||||
// our primary team channels first
|
||||
channels = append(channels, *m.Team.Channels...)
|
||||
channels = append(channels, m.Team.Channels...)
|
||||
for _, t := range m.OtherTeams {
|
||||
if t.Id != m.Team.Id {
|
||||
channels = append(channels, *t.Channels...)
|
||||
channels = append(channels, t.Channels...)
|
||||
}
|
||||
}
|
||||
return channels
|
||||
@@ -524,7 +683,7 @@ func (m *MMClient) GetMoreChannels() []*model.Channel {
|
||||
defer m.RUnlock()
|
||||
var channels []*model.Channel
|
||||
for _, t := range m.OtherTeams {
|
||||
channels = append(channels, *t.MoreChannels...)
|
||||
channels = append(channels, t.MoreChannels...)
|
||||
}
|
||||
return channels
|
||||
}
|
||||
@@ -535,8 +694,10 @@ func (m *MMClient) GetTeamFromChannel(channelId string) string {
|
||||
defer m.RUnlock()
|
||||
var channels []*model.Channel
|
||||
for _, t := range m.OtherTeams {
|
||||
channels = append(channels, *t.Channels...)
|
||||
channels = append(channels, *t.MoreChannels...)
|
||||
channels = append(channels, t.Channels...)
|
||||
if t.MoreChannels != nil {
|
||||
channels = append(channels, t.MoreChannels...)
|
||||
}
|
||||
for _, c := range channels {
|
||||
if c.Id == channelId {
|
||||
return t.Id
|
||||
@@ -549,12 +710,11 @@ func (m *MMClient) GetTeamFromChannel(channelId string) string {
|
||||
func (m *MMClient) GetLastViewedAt(channelId string) int64 {
|
||||
m.RLock()
|
||||
defer m.RUnlock()
|
||||
res, err := m.Client.GetChannel(channelId, "")
|
||||
if err != nil {
|
||||
res, resp := m.Client.GetChannelMember(channelId, m.User.Id, "")
|
||||
if resp.Error != nil {
|
||||
return model.GetMillis()
|
||||
}
|
||||
data := res.Data.(*model.ChannelData)
|
||||
return data.Member.LastViewedAt
|
||||
return res.LastViewedAt
|
||||
}
|
||||
|
||||
func (m *MMClient) GetUsers() map[string]*model.User {
|
||||
@@ -568,42 +728,58 @@ func (m *MMClient) GetUsers() map[string]*model.User {
|
||||
}
|
||||
|
||||
func (m *MMClient) GetUser(userId string) *model.User {
|
||||
m.RLock()
|
||||
defer m.RUnlock()
|
||||
m.Lock()
|
||||
defer m.Unlock()
|
||||
_, ok := m.Users[userId]
|
||||
if !ok {
|
||||
res, resp := m.Client.GetUser(userId, "")
|
||||
if resp.Error != nil {
|
||||
return nil
|
||||
}
|
||||
m.Users[userId] = res
|
||||
}
|
||||
return m.Users[userId]
|
||||
}
|
||||
|
||||
func (m *MMClient) GetUserName(userId string) string {
|
||||
user := m.GetUser(userId)
|
||||
if user != nil {
|
||||
return user.Username
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *MMClient) GetStatus(userId string) string {
|
||||
res, err := m.Client.GetStatuses()
|
||||
if err != nil {
|
||||
res, resp := m.Client.GetUserStatus(userId, "")
|
||||
if resp.Error != nil {
|
||||
return ""
|
||||
}
|
||||
status := res.Data.(map[string]string)
|
||||
if status[userId] == model.STATUS_AWAY {
|
||||
if res.Status == model.STATUS_AWAY {
|
||||
return "away"
|
||||
}
|
||||
if status[userId] == model.STATUS_ONLINE {
|
||||
if res.Status == model.STATUS_ONLINE {
|
||||
return "online"
|
||||
}
|
||||
return "offline"
|
||||
}
|
||||
|
||||
func (m *MMClient) GetStatuses() map[string]string {
|
||||
var ok bool
|
||||
var ids []string
|
||||
statuses := make(map[string]string)
|
||||
res, err := m.Client.GetStatuses()
|
||||
if err != nil {
|
||||
for id := range m.Users {
|
||||
ids = append(ids, id)
|
||||
}
|
||||
res, resp := m.Client.GetUsersStatusesByIds(ids)
|
||||
if resp.Error != nil {
|
||||
return statuses
|
||||
}
|
||||
if statuses, ok = res.Data.(map[string]string); ok {
|
||||
for userId, status := range statuses {
|
||||
statuses[userId] = "offline"
|
||||
if status == model.STATUS_AWAY {
|
||||
statuses[userId] = "away"
|
||||
}
|
||||
if status == model.STATUS_ONLINE {
|
||||
statuses[userId] = "online"
|
||||
for _, status := range res {
|
||||
statuses[status.UserId] = "offline"
|
||||
if status.Status == model.STATUS_AWAY {
|
||||
statuses[status.UserId] = "away"
|
||||
}
|
||||
if status.Status == model.STATUS_ONLINE {
|
||||
statuses[status.UserId] = "online"
|
||||
}
|
||||
}
|
||||
return statuses
|
||||
@@ -613,7 +789,21 @@ func (m *MMClient) GetTeamId() string {
|
||||
return m.Team.Id
|
||||
}
|
||||
|
||||
func (m *MMClient) UploadFile(data []byte, channelId string, filename string) (string, error) {
|
||||
f, resp := m.Client.UploadFile(data, channelId, filename)
|
||||
if resp.Error != nil {
|
||||
return "", resp.Error
|
||||
}
|
||||
return f.FileInfos[0].Id, nil
|
||||
}
|
||||
|
||||
func (m *MMClient) StatusLoop() {
|
||||
retries := 0
|
||||
backoff := time.Second * 60
|
||||
if m.OnWsConnect != nil {
|
||||
m.OnWsConnect()
|
||||
}
|
||||
m.log.Debug("StatusLoop:", m.OnWsConnect)
|
||||
for {
|
||||
if m.WsQuit {
|
||||
return
|
||||
@@ -624,13 +814,28 @@ func (m *MMClient) StatusLoop() {
|
||||
select {
|
||||
case <-m.WsPingChan:
|
||||
m.log.Debug("WS PONG received")
|
||||
backoff = time.Second * 60
|
||||
case <-time.After(time.Second * 5):
|
||||
if retries > 3 {
|
||||
m.log.Debug("StatusLoop() timeout")
|
||||
m.Logout()
|
||||
m.WsQuit = false
|
||||
m.Login()
|
||||
err := m.Login()
|
||||
if err != nil {
|
||||
log.Errorf("Login failed: %#v", err)
|
||||
break
|
||||
}
|
||||
if m.OnWsConnect != nil {
|
||||
m.OnWsConnect()
|
||||
}
|
||||
go m.WsReceiver()
|
||||
} else {
|
||||
retries++
|
||||
backoff = time.Second * 5
|
||||
}
|
||||
}
|
||||
time.Sleep(time.Second * 60)
|
||||
}
|
||||
time.Sleep(backoff)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -638,36 +843,39 @@ func (m *MMClient) StatusLoop() {
|
||||
func (m *MMClient) initUser() error {
|
||||
m.Lock()
|
||||
defer m.Unlock()
|
||||
initLoad, err := m.Client.GetInitialLoad()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
initData := initLoad.Data.(*model.InitialLoad)
|
||||
m.User = initData.User
|
||||
// we only load all team data on initial login.
|
||||
// all other updates are for channels from our (primary) team only.
|
||||
//m.log.Debug("initUser(): loading all team data")
|
||||
for _, v := range initData.Teams {
|
||||
m.Client.SetTeamId(v.Id)
|
||||
mmusers, err := m.Client.GetProfiles(0, 50000, "")
|
||||
if err != nil {
|
||||
return errors.New(err.DetailedError)
|
||||
teams, resp := m.Client.GetTeamsForUser(m.User.Id, "")
|
||||
if resp.Error != nil {
|
||||
return resp.Error
|
||||
}
|
||||
t := &Team{Team: v, Users: mmusers.Data.(map[string]*model.User), Id: v.Id}
|
||||
mmchannels, err := m.Client.GetChannels("")
|
||||
if err != nil {
|
||||
return errors.New(err.DetailedError)
|
||||
for _, team := range teams {
|
||||
mmusers, resp := m.Client.GetUsersInTeam(team.Id, 0, 50000, "")
|
||||
if resp.Error != nil {
|
||||
return errors.New(resp.Error.DetailedError)
|
||||
}
|
||||
t.Channels = mmchannels.Data.(*model.ChannelList)
|
||||
mmchannels, err = m.Client.GetMoreChannels("")
|
||||
if err != nil {
|
||||
return errors.New(err.DetailedError)
|
||||
usermap := make(map[string]*model.User)
|
||||
for _, user := range mmusers {
|
||||
usermap[user.Id] = user
|
||||
}
|
||||
t.MoreChannels = mmchannels.Data.(*model.ChannelList)
|
||||
|
||||
t := &Team{Team: team, Users: usermap, Id: team.Id}
|
||||
|
||||
mmchannels, resp := m.Client.GetChannelsForTeamForUser(team.Id, m.User.Id, "")
|
||||
if resp.Error != nil {
|
||||
return resp.Error
|
||||
}
|
||||
t.Channels = mmchannels
|
||||
mmchannels, resp = m.Client.GetPublicChannelsForTeam(team.Id, 0, 5000, "")
|
||||
if resp.Error != nil {
|
||||
return resp.Error
|
||||
}
|
||||
t.MoreChannels = mmchannels
|
||||
m.OtherTeams = append(m.OtherTeams, t)
|
||||
if v.Name == m.Credentials.Team {
|
||||
if team.Name == m.Credentials.Team {
|
||||
m.Team = t
|
||||
m.log.Debugf("initUser(): found our team %s (id: %s)", v.Name, v.Id)
|
||||
m.log.Debugf("initUser(): found our team %s (id: %s)", team.Name, team.Id)
|
||||
}
|
||||
// add all users
|
||||
for k, v := range t.Users {
|
||||
@@ -687,3 +895,17 @@ func (m *MMClient) sendWSRequest(action string, data map[string]interface{}) err
|
||||
m.WsClient.WriteJSON(req)
|
||||
return nil
|
||||
}
|
||||
|
||||
func supportedVersion(version string) bool {
|
||||
if strings.HasPrefix(version, "3.8.0") ||
|
||||
strings.HasPrefix(version, "3.9.0") ||
|
||||
strings.HasPrefix(version, "3.10.0") ||
|
||||
strings.HasPrefix(version, "4.") {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func digestString(s string) string {
|
||||
return fmt.Sprintf("%x", md5.Sum([]byte(s)))
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ type OMessage struct {
|
||||
Text string `json:"text"`
|
||||
Attachments interface{} `json:"attachments,omitempty"`
|
||||
Type string `json:"type,omitempty"`
|
||||
Props map[string]interface{} `json:"props"`
|
||||
}
|
||||
|
||||
// IMessage for mattermost outgoing webhook. (received from mattermost)
|
||||
@@ -43,6 +44,7 @@ type IMessage struct {
|
||||
ServiceId string `schema:"service_id"`
|
||||
Text string `schema:"text"`
|
||||
TriggerWord string `schema:"trigger_word"`
|
||||
FileIDs string `schema:"file_ids"`
|
||||
}
|
||||
|
||||
// Client for Mattermost.
|
||||
@@ -134,12 +136,11 @@ func (c *Client) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// Receive returns an incoming message from mattermost outgoing webhooks URL.
|
||||
func (c *Client) Receive() IMessage {
|
||||
for {
|
||||
select {
|
||||
case msg := <-c.In:
|
||||
var msg IMessage
|
||||
for msg := range c.In {
|
||||
return msg
|
||||
}
|
||||
}
|
||||
return msg
|
||||
}
|
||||
|
||||
// Send sends a msg to mattermost incoming webhooks URL.
|
||||
|
||||
50
migration.md
50
migration.md
@@ -1,50 +0,0 @@
|
||||
# Breaking changes from 0.4 to 0.5 for matterbridge (webhooks version)
|
||||
## IRC section
|
||||
### Server
|
||||
Port removed, added to server
|
||||
```
|
||||
server="irc.freenode.net"
|
||||
port=6667
|
||||
```
|
||||
changed to
|
||||
```
|
||||
server="irc.freenode.net:6667"
|
||||
```
|
||||
### Channel
|
||||
Removed see Channels section below
|
||||
|
||||
### UseSlackCircumfix=true
|
||||
Removed, can be done by using ```RemoteNickFormat="<{NICK}> "```
|
||||
|
||||
## Mattermost section
|
||||
### BindAddress
|
||||
Port removed, added to BindAddress
|
||||
|
||||
```
|
||||
BindAddress="0.0.0.0"
|
||||
port=9999
|
||||
```
|
||||
|
||||
changed to
|
||||
|
||||
```
|
||||
BindAddress="0.0.0.0:9999"
|
||||
```
|
||||
|
||||
### Token
|
||||
Removed
|
||||
|
||||
## Channels section
|
||||
```
|
||||
[Token "outgoingwebhooktoken1"]
|
||||
IRCChannel="#off-topic"
|
||||
MMChannel="off-topic"
|
||||
```
|
||||
|
||||
changed to
|
||||
|
||||
```
|
||||
[Channel "channelnameofchoice"]
|
||||
IRC="#off-topic"
|
||||
Mattermost="off-topic"
|
||||
```
|
||||
@@ -205,17 +205,43 @@ func (gitter *Gitter) GetMessage(roomID, messageID string) (*Message, error) {
|
||||
}
|
||||
|
||||
// SendMessage sends a message to a room
|
||||
func (gitter *Gitter) SendMessage(roomID, text string) error {
|
||||
func (gitter *Gitter) SendMessage(roomID, text string) (*Message, error) {
|
||||
|
||||
message := Message{Text: text}
|
||||
body, _ := json.Marshal(message)
|
||||
_, err := gitter.post(gitter.config.apiBaseURL+"rooms/"+roomID+"/chatMessages", body)
|
||||
response, err := gitter.post(gitter.config.apiBaseURL+"rooms/"+roomID+"/chatMessages", body)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return nil
|
||||
err = json.Unmarshal(response, &message)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &message, nil
|
||||
}
|
||||
|
||||
// UpdateMessage updates a message in a room
|
||||
func (gitter *Gitter) UpdateMessage(roomID, msgID, text string) (*Message, error) {
|
||||
|
||||
message := Message{Text: text}
|
||||
body, _ := json.Marshal(message)
|
||||
response, err := gitter.put(gitter.config.apiBaseURL+"rooms/"+roomID+"/chatMessages/"+msgID, body)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(response, &message)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &message, nil
|
||||
}
|
||||
|
||||
// JoinRoom joins a room
|
||||
@@ -265,7 +291,7 @@ func (gitter *Gitter) SearchRooms(room string) ([]Room, error) {
|
||||
Results []Room `json:"results"`
|
||||
}
|
||||
|
||||
response, err := gitter.get(gitter.config.apiBaseURL + "rooms?q=" + room )
|
||||
response, err := gitter.get(gitter.config.apiBaseURL + "rooms?q=" + room)
|
||||
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
@@ -414,6 +440,39 @@ func (gitter *Gitter) post(url string, body []byte) ([]byte, error) {
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (gitter *Gitter) put(url string, body []byte) ([]byte, error) {
|
||||
r, err := http.NewRequest("PUT", url, bytes.NewBuffer(body))
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
r.Header.Set("Content-Type", "application/json")
|
||||
r.Header.Set("Accept", "application/json")
|
||||
r.Header.Set("Authorization", "Bearer "+gitter.config.token)
|
||||
|
||||
resp, err := gitter.config.client.Do(r)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
err = APIError{What: fmt.Sprintf("Status code: %v", resp.StatusCode)}
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
gitter.log(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (gitter *Gitter) delete(url string) ([]byte, error) {
|
||||
r, err := http.NewRequest("delete", url, nil)
|
||||
if err != nil {
|
||||
@@ -137,7 +137,10 @@ func (stream *Stream) connect() {
|
||||
|
||||
res, err := stream.gitter.getResponse(stream.url, stream)
|
||||
if err != nil || res.StatusCode != 200 {
|
||||
stream.gitter.log(fmt.Sprintf("Failed to get response, trying reconnect (Status code: %v)", res.StatusCode))
|
||||
stream.gitter.log("Failed to get response, trying reconnect")
|
||||
if res != nil {
|
||||
stream.gitter.log(fmt.Sprintf("Status code: %v", res.StatusCode))
|
||||
}
|
||||
stream.gitter.log(err)
|
||||
|
||||
// sleep and wait
|
||||
117
vendor/github.com/thoj/go-ircevent/irc.go → vendor/github.com/42wim/go-ircevent/irc.go
generated
vendored
117
vendor/github.com/thoj/go-ircevent/irc.go → vendor/github.com/42wim/go-ircevent/irc.go
generated
vendored
@@ -87,6 +87,17 @@ func (irc *Connection) readLoop() {
|
||||
}
|
||||
}
|
||||
|
||||
// Unescape tag values as defined in the IRCv3.2 message tags spec
|
||||
// http://ircv3.net/specs/core/message-tags-3.2.html
|
||||
func unescapeTagValue(value string) string {
|
||||
value = strings.Replace(value, "\\:", ";", -1)
|
||||
value = strings.Replace(value, "\\s", " ", -1)
|
||||
value = strings.Replace(value, "\\\\", "\\", -1)
|
||||
value = strings.Replace(value, "\\r", "\r", -1)
|
||||
value = strings.Replace(value, "\\n", "\n", -1)
|
||||
return value
|
||||
}
|
||||
|
||||
//Parse raw irc messages
|
||||
func parseToEvent(msg string) (*Event, error) {
|
||||
msg = strings.TrimSuffix(msg, "\n") //Remove \r\n
|
||||
@@ -95,6 +106,26 @@ func parseToEvent(msg string) (*Event, error) {
|
||||
if len(msg) < 5 {
|
||||
return nil, errors.New("Malformed msg from server")
|
||||
}
|
||||
|
||||
if msg[0] == '@' {
|
||||
// IRCv3 Message Tags
|
||||
if i := strings.Index(msg, " "); i > -1 {
|
||||
event.Tags = make(map[string]string)
|
||||
tags := strings.Split(msg[1:i], ";")
|
||||
for _, data := range tags {
|
||||
parts := strings.SplitN(data, "=", 2)
|
||||
if len(parts) == 1 {
|
||||
event.Tags[parts[0]] = ""
|
||||
} else {
|
||||
event.Tags[parts[0]] = unescapeTagValue(parts[1])
|
||||
}
|
||||
}
|
||||
msg = msg[i+1 : len(msg)]
|
||||
} else {
|
||||
return nil, errors.New("Malformed msg from server")
|
||||
}
|
||||
}
|
||||
|
||||
if msg[0] == ':' {
|
||||
if i := strings.Index(msg, " "); i > -1 {
|
||||
event.Source = msg[1:i]
|
||||
@@ -196,12 +227,17 @@ func (irc *Connection) isQuitting() bool {
|
||||
// Main loop to control the connection.
|
||||
func (irc *Connection) Loop() {
|
||||
errChan := irc.ErrorChan()
|
||||
connTime := time.Now()
|
||||
for !irc.isQuitting() {
|
||||
err := <-errChan
|
||||
close(irc.end)
|
||||
irc.Wait()
|
||||
for !irc.isQuitting() {
|
||||
irc.Log.Printf("Error, disconnected: %s\n", err)
|
||||
if time.Now().Sub(connTime) < time.Second*5 {
|
||||
irc.Log.Println("Rreconnecting too fast, sleeping 60 seconds")
|
||||
time.Sleep(60 * time.Second)
|
||||
}
|
||||
if err = irc.Reconnect(); err != nil {
|
||||
irc.Log.Printf("Error while reconnecting: %s\n", err)
|
||||
time.Sleep(60 * time.Second)
|
||||
@@ -210,6 +246,7 @@ func (irc *Connection) Loop() {
|
||||
break
|
||||
}
|
||||
}
|
||||
connTime = time.Now()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -430,26 +467,84 @@ func (irc *Connection) Connect(server string) error {
|
||||
irc.pwrite <- fmt.Sprintf("PASS %s\r\n", irc.Password)
|
||||
}
|
||||
|
||||
resChan := make(chan *SASLResult)
|
||||
err = irc.negotiateCaps()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
irc.pwrite <- fmt.Sprintf("NICK %s\r\n", irc.nick)
|
||||
irc.pwrite <- fmt.Sprintf("USER %s 0.0.0.0 0.0.0.0 :%s\r\n", irc.user, irc.user)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Negotiate IRCv3 capabilities
|
||||
func (irc *Connection) negotiateCaps() error {
|
||||
saslResChan := make(chan *SASLResult)
|
||||
if irc.UseSASL {
|
||||
irc.RequestCaps = append(irc.RequestCaps, "sasl")
|
||||
irc.setupSASLCallbacks(saslResChan)
|
||||
}
|
||||
|
||||
if len(irc.RequestCaps) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
cap_chan := make(chan bool, len(irc.RequestCaps))
|
||||
irc.AddCallback("CAP", func(e *Event) {
|
||||
if len(e.Arguments) != 3 {
|
||||
return
|
||||
}
|
||||
command := e.Arguments[1]
|
||||
|
||||
if command == "LS" {
|
||||
missing_caps := len(irc.RequestCaps)
|
||||
for _, cap_name := range strings.Split(e.Arguments[2], " ") {
|
||||
for _, req_cap := range irc.RequestCaps {
|
||||
if cap_name == req_cap {
|
||||
irc.pwrite <- fmt.Sprintf("CAP REQ :%s\r\n", cap_name)
|
||||
missing_caps--
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for i := 0; i < missing_caps; i++ {
|
||||
cap_chan <- true
|
||||
}
|
||||
} else if command == "ACK" || command == "NAK" {
|
||||
for _, cap_name := range strings.Split(strings.TrimSpace(e.Arguments[2]), " ") {
|
||||
if cap_name == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
if command == "ACK" {
|
||||
irc.AcknowledgedCaps = append(irc.AcknowledgedCaps, cap_name)
|
||||
}
|
||||
cap_chan <- true
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
irc.pwrite <- "CAP LS\r\n"
|
||||
|
||||
if irc.UseSASL {
|
||||
irc.setupSASLCallbacks(resChan)
|
||||
irc.pwrite <- fmt.Sprintf("CAP LS\r\n")
|
||||
// request SASL
|
||||
irc.pwrite <- fmt.Sprintf("CAP REQ :sasl\r\n")
|
||||
// if sasl request doesn't complete in 15 seconds, close chan and timeout
|
||||
select {
|
||||
case res := <-resChan:
|
||||
case res := <-saslResChan:
|
||||
if res.Failed {
|
||||
close(resChan)
|
||||
close(saslResChan)
|
||||
return res.Err
|
||||
}
|
||||
case <-time.After(time.Second * 15):
|
||||
close(resChan)
|
||||
close(saslResChan)
|
||||
return errors.New("SASL setup timed out. This shouldn't happen.")
|
||||
}
|
||||
}
|
||||
irc.pwrite <- fmt.Sprintf("NICK %s\r\n", irc.nick)
|
||||
irc.pwrite <- fmt.Sprintf("USER %s 0.0.0.0 0.0.0.0 :%s\r\n", irc.user, irc.user)
|
||||
|
||||
// Wait for all capabilities to be ACKed or NAKed before ending negotiation
|
||||
for i := 0; i < len(irc.RequestCaps); i++ {
|
||||
<-cap_chan
|
||||
}
|
||||
irc.pwrite <- fmt.Sprintf("CAP END\r\n")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -43,7 +43,6 @@ func (irc *Connection) setupSASLCallbacks(result chan<- *SASLResult) {
|
||||
result <- &SASLResult{true, errors.New(e.Arguments[1])}
|
||||
})
|
||||
irc.AddCallback("903", func(e *Event) {
|
||||
irc.SendRaw("CAP END")
|
||||
result <- &SASLResult{false, nil}
|
||||
})
|
||||
irc.AddCallback("904", func(e *Event) {
|
||||
@@ -20,6 +20,8 @@ type Connection struct {
|
||||
Password string
|
||||
UseTLS bool
|
||||
UseSASL bool
|
||||
RequestCaps []string
|
||||
AcknowledgedCaps []string
|
||||
SASLLogin string
|
||||
SASLPassword string
|
||||
SASLMech string
|
||||
@@ -59,6 +61,7 @@ type Event struct {
|
||||
Source string //<host>
|
||||
User string //<usr>
|
||||
Arguments []string
|
||||
Tags map[string]string
|
||||
Connection *Connection
|
||||
}
|
||||
|
||||
26
vendor/github.com/Philipp15b/go-steam/LICENSE.txt
generated
vendored
Normal file
26
vendor/github.com/Philipp15b/go-steam/LICENSE.txt
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
Copyright (c) 2014 The go-steam Authors. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* The names of its contributors may not be used to endorse or promote
|
||||
products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
178
vendor/github.com/Philipp15b/go-steam/auth.go
generated
vendored
Normal file
178
vendor/github.com/Philipp15b/go-steam/auth.go
generated
vendored
Normal file
@@ -0,0 +1,178 @@
|
||||
package steam
|
||||
|
||||
import (
|
||||
"crypto/sha1"
|
||||
. "github.com/Philipp15b/go-steam/protocol"
|
||||
. "github.com/Philipp15b/go-steam/protocol/protobuf"
|
||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
. "github.com/Philipp15b/go-steam/steamid"
|
||||
"github.com/golang/protobuf/proto"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Auth struct {
|
||||
client *Client
|
||||
details *LogOnDetails
|
||||
}
|
||||
|
||||
type SentryHash []byte
|
||||
|
||||
type LogOnDetails struct {
|
||||
Username string
|
||||
Password string
|
||||
AuthCode string
|
||||
TwoFactorCode string
|
||||
SentryFileHash SentryHash
|
||||
}
|
||||
|
||||
// Log on with the given details. You must always specify username and
|
||||
// password. For the first login, don't set an authcode or a hash and you'll receive an error
|
||||
// and Steam will send you an authcode. Then you have to login again, this time with the authcode.
|
||||
// Shortly after logging in, you'll receive a MachineAuthUpdateEvent with a hash which allows
|
||||
// you to login without using an authcode in the future.
|
||||
//
|
||||
// If you don't use Steam Guard, username and password are enough.
|
||||
func (a *Auth) LogOn(details *LogOnDetails) {
|
||||
if len(details.Username) == 0 || len(details.Password) == 0 {
|
||||
panic("Username and password must be set!")
|
||||
}
|
||||
|
||||
logon := new(CMsgClientLogon)
|
||||
logon.AccountName = &details.Username
|
||||
logon.Password = &details.Password
|
||||
if details.AuthCode != "" {
|
||||
logon.AuthCode = proto.String(details.AuthCode)
|
||||
}
|
||||
if details.TwoFactorCode != "" {
|
||||
logon.TwoFactorCode = proto.String(details.TwoFactorCode)
|
||||
}
|
||||
logon.ClientLanguage = proto.String("english")
|
||||
logon.ProtocolVersion = proto.Uint32(MsgClientLogon_CurrentProtocol)
|
||||
logon.ShaSentryfile = details.SentryFileHash
|
||||
|
||||
atomic.StoreUint64(&a.client.steamId, uint64(NewIdAdv(0, 1, int32(EUniverse_Public), int32(EAccountType_Individual))))
|
||||
|
||||
a.client.Write(NewClientMsgProtobuf(EMsg_ClientLogon, logon))
|
||||
}
|
||||
|
||||
func (a *Auth) HandlePacket(packet *Packet) {
|
||||
switch packet.EMsg {
|
||||
case EMsg_ClientLogOnResponse:
|
||||
a.handleLogOnResponse(packet)
|
||||
case EMsg_ClientNewLoginKey:
|
||||
a.handleLoginKey(packet)
|
||||
case EMsg_ClientSessionToken:
|
||||
case EMsg_ClientLoggedOff:
|
||||
a.handleLoggedOff(packet)
|
||||
case EMsg_ClientUpdateMachineAuth:
|
||||
a.handleUpdateMachineAuth(packet)
|
||||
case EMsg_ClientAccountInfo:
|
||||
a.handleAccountInfo(packet)
|
||||
case EMsg_ClientWalletInfoUpdate:
|
||||
case EMsg_ClientRequestWebAPIAuthenticateUserNonceResponse:
|
||||
case EMsg_ClientMarketingMessageUpdate:
|
||||
}
|
||||
}
|
||||
|
||||
func (a *Auth) handleLogOnResponse(packet *Packet) {
|
||||
if !packet.IsProto {
|
||||
a.client.Fatalf("Got non-proto logon response!")
|
||||
return
|
||||
}
|
||||
|
||||
body := new(CMsgClientLogonResponse)
|
||||
msg := packet.ReadProtoMsg(body)
|
||||
|
||||
result := EResult(body.GetEresult())
|
||||
if result == EResult_OK {
|
||||
atomic.StoreInt32(&a.client.sessionId, msg.Header.Proto.GetClientSessionid())
|
||||
atomic.StoreUint64(&a.client.steamId, msg.Header.Proto.GetSteamid())
|
||||
a.client.Web.webLoginKey = *body.WebapiAuthenticateUserNonce
|
||||
|
||||
go a.client.heartbeatLoop(time.Duration(body.GetOutOfGameHeartbeatSeconds()))
|
||||
|
||||
a.client.Emit(&LoggedOnEvent{
|
||||
Result: EResult(body.GetEresult()),
|
||||
ExtendedResult: EResult(body.GetEresultExtended()),
|
||||
OutOfGameSecsPerHeartbeat: body.GetOutOfGameHeartbeatSeconds(),
|
||||
InGameSecsPerHeartbeat: body.GetInGameHeartbeatSeconds(),
|
||||
PublicIp: body.GetPublicIp(),
|
||||
ServerTime: body.GetRtime32ServerTime(),
|
||||
AccountFlags: EAccountFlags(body.GetAccountFlags()),
|
||||
ClientSteamId: SteamId(body.GetClientSuppliedSteamid()),
|
||||
EmailDomain: body.GetEmailDomain(),
|
||||
CellId: body.GetCellId(),
|
||||
CellIdPingThreshold: body.GetCellIdPingThreshold(),
|
||||
Steam2Ticket: body.GetSteam2Ticket(),
|
||||
UsePics: body.GetUsePics(),
|
||||
WebApiUserNonce: body.GetWebapiAuthenticateUserNonce(),
|
||||
IpCountryCode: body.GetIpCountryCode(),
|
||||
VanityUrl: body.GetVanityUrl(),
|
||||
NumLoginFailuresToMigrate: body.GetCountLoginfailuresToMigrate(),
|
||||
NumDisconnectsToMigrate: body.GetCountDisconnectsToMigrate(),
|
||||
})
|
||||
} else if result == EResult_Fail || result == EResult_ServiceUnavailable || result == EResult_TryAnotherCM {
|
||||
// some error on Steam's side, we'll get an EOF later
|
||||
} else {
|
||||
a.client.Emit(&LogOnFailedEvent{
|
||||
Result: EResult(body.GetEresult()),
|
||||
})
|
||||
a.client.Disconnect()
|
||||
}
|
||||
}
|
||||
|
||||
func (a *Auth) handleLoginKey(packet *Packet) {
|
||||
body := new(CMsgClientNewLoginKey)
|
||||
packet.ReadProtoMsg(body)
|
||||
a.client.Write(NewClientMsgProtobuf(EMsg_ClientNewLoginKeyAccepted, &CMsgClientNewLoginKeyAccepted{
|
||||
UniqueId: proto.Uint32(body.GetUniqueId()),
|
||||
}))
|
||||
a.client.Emit(&LoginKeyEvent{
|
||||
UniqueId: body.GetUniqueId(),
|
||||
LoginKey: body.GetLoginKey(),
|
||||
})
|
||||
}
|
||||
|
||||
func (a *Auth) handleLoggedOff(packet *Packet) {
|
||||
result := EResult_Invalid
|
||||
if packet.IsProto {
|
||||
body := new(CMsgClientLoggedOff)
|
||||
packet.ReadProtoMsg(body)
|
||||
result = EResult(body.GetEresult())
|
||||
} else {
|
||||
body := new(MsgClientLoggedOff)
|
||||
packet.ReadClientMsg(body)
|
||||
result = body.Result
|
||||
}
|
||||
a.client.Emit(&LoggedOffEvent{Result: result})
|
||||
}
|
||||
|
||||
func (a *Auth) handleUpdateMachineAuth(packet *Packet) {
|
||||
body := new(CMsgClientUpdateMachineAuth)
|
||||
packet.ReadProtoMsg(body)
|
||||
hash := sha1.New()
|
||||
hash.Write(packet.Data)
|
||||
sha := hash.Sum(nil)
|
||||
|
||||
msg := NewClientMsgProtobuf(EMsg_ClientUpdateMachineAuthResponse, &CMsgClientUpdateMachineAuthResponse{
|
||||
ShaFile: sha,
|
||||
})
|
||||
msg.SetTargetJobId(packet.SourceJobId)
|
||||
a.client.Write(msg)
|
||||
|
||||
a.client.Emit(&MachineAuthUpdateEvent{sha})
|
||||
}
|
||||
|
||||
func (a *Auth) handleAccountInfo(packet *Packet) {
|
||||
body := new(CMsgClientAccountInfo)
|
||||
packet.ReadProtoMsg(body)
|
||||
a.client.Emit(&AccountInfoEvent{
|
||||
PersonaName: body.GetPersonaName(),
|
||||
Country: body.GetIpCountry(),
|
||||
CountAuthedComputers: body.GetCountAuthedComputers(),
|
||||
AccountFlags: EAccountFlags(body.GetAccountFlags()),
|
||||
FacebookId: body.GetFacebookId(),
|
||||
FacebookName: body.GetFacebookName(),
|
||||
})
|
||||
}
|
||||
53
vendor/github.com/Philipp15b/go-steam/auth_events.go
generated
vendored
Normal file
53
vendor/github.com/Philipp15b/go-steam/auth_events.go
generated
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
package steam
|
||||
|
||||
import (
|
||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
. "github.com/Philipp15b/go-steam/steamid"
|
||||
)
|
||||
|
||||
type LoggedOnEvent struct {
|
||||
Result EResult
|
||||
ExtendedResult EResult
|
||||
OutOfGameSecsPerHeartbeat int32
|
||||
InGameSecsPerHeartbeat int32
|
||||
PublicIp uint32
|
||||
ServerTime uint32
|
||||
AccountFlags EAccountFlags
|
||||
ClientSteamId SteamId `json:",string"`
|
||||
EmailDomain string
|
||||
CellId uint32
|
||||
CellIdPingThreshold uint32
|
||||
Steam2Ticket []byte
|
||||
UsePics bool
|
||||
WebApiUserNonce string
|
||||
IpCountryCode string
|
||||
VanityUrl string
|
||||
NumLoginFailuresToMigrate int32
|
||||
NumDisconnectsToMigrate int32
|
||||
}
|
||||
|
||||
type LogOnFailedEvent struct {
|
||||
Result EResult
|
||||
}
|
||||
|
||||
type LoginKeyEvent struct {
|
||||
UniqueId uint32
|
||||
LoginKey string
|
||||
}
|
||||
|
||||
type LoggedOffEvent struct {
|
||||
Result EResult
|
||||
}
|
||||
|
||||
type MachineAuthUpdateEvent struct {
|
||||
Hash []byte
|
||||
}
|
||||
|
||||
type AccountInfoEvent struct {
|
||||
PersonaName string
|
||||
Country string
|
||||
CountAuthedComputers int32
|
||||
AccountFlags EAccountFlags
|
||||
FacebookId uint64 `json:",string"`
|
||||
FacebookName string
|
||||
}
|
||||
383
vendor/github.com/Philipp15b/go-steam/client.go
generated
vendored
Normal file
383
vendor/github.com/Philipp15b/go-steam/client.go
generated
vendored
Normal file
@@ -0,0 +1,383 @@
|
||||
package steam
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"crypto/rand"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"hash/crc32"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/Philipp15b/go-steam/cryptoutil"
|
||||
"github.com/Philipp15b/go-steam/netutil"
|
||||
. "github.com/Philipp15b/go-steam/protocol"
|
||||
. "github.com/Philipp15b/go-steam/protocol/protobuf"
|
||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
. "github.com/Philipp15b/go-steam/steamid"
|
||||
)
|
||||
|
||||
// Represents a client to the Steam network.
|
||||
// Always poll events from the channel returned by Events() or receiving messages will stop.
|
||||
// All access, unless otherwise noted, should be threadsafe.
|
||||
//
|
||||
// When a FatalErrorEvent is emitted, the connection is automatically closed. The same client can be used to reconnect.
|
||||
// Other errors don't have any effect.
|
||||
type Client struct {
|
||||
// these need to be 64 bit aligned for sync/atomic on 32bit
|
||||
sessionId int32
|
||||
_ uint32
|
||||
steamId uint64
|
||||
currentJobId uint64
|
||||
|
||||
Auth *Auth
|
||||
Social *Social
|
||||
Web *Web
|
||||
Notifications *Notifications
|
||||
Trading *Trading
|
||||
GC *GameCoordinator
|
||||
|
||||
events chan interface{}
|
||||
handlers []PacketHandler
|
||||
handlersMutex sync.RWMutex
|
||||
|
||||
tempSessionKey []byte
|
||||
|
||||
ConnectionTimeout time.Duration
|
||||
|
||||
mutex sync.RWMutex // guarding conn and writeChan
|
||||
conn connection
|
||||
writeChan chan IMsg
|
||||
writeBuf *bytes.Buffer
|
||||
heartbeat *time.Ticker
|
||||
}
|
||||
|
||||
type PacketHandler interface {
|
||||
HandlePacket(*Packet)
|
||||
}
|
||||
|
||||
func NewClient() *Client {
|
||||
client := &Client{
|
||||
events: make(chan interface{}, 3),
|
||||
writeBuf: new(bytes.Buffer),
|
||||
}
|
||||
client.Auth = &Auth{client: client}
|
||||
client.RegisterPacketHandler(client.Auth)
|
||||
client.Social = newSocial(client)
|
||||
client.RegisterPacketHandler(client.Social)
|
||||
client.Web = &Web{client: client}
|
||||
client.RegisterPacketHandler(client.Web)
|
||||
client.Notifications = newNotifications(client)
|
||||
client.RegisterPacketHandler(client.Notifications)
|
||||
client.Trading = &Trading{client: client}
|
||||
client.RegisterPacketHandler(client.Trading)
|
||||
client.GC = newGC(client)
|
||||
client.RegisterPacketHandler(client.GC)
|
||||
return client
|
||||
}
|
||||
|
||||
// Get the event channel. By convention all events are pointers, except for errors.
|
||||
// It is never closed.
|
||||
func (c *Client) Events() <-chan interface{} {
|
||||
return c.events
|
||||
}
|
||||
|
||||
func (c *Client) Emit(event interface{}) {
|
||||
c.events <- event
|
||||
}
|
||||
|
||||
// Emits a FatalErrorEvent formatted with fmt.Errorf and disconnects.
|
||||
func (c *Client) Fatalf(format string, a ...interface{}) {
|
||||
c.Emit(FatalErrorEvent(fmt.Errorf(format, a...)))
|
||||
c.Disconnect()
|
||||
}
|
||||
|
||||
// Emits an error formatted with fmt.Errorf.
|
||||
func (c *Client) Errorf(format string, a ...interface{}) {
|
||||
c.Emit(fmt.Errorf(format, a...))
|
||||
}
|
||||
|
||||
// Registers a PacketHandler that receives all incoming packets.
|
||||
func (c *Client) RegisterPacketHandler(handler PacketHandler) {
|
||||
c.handlersMutex.Lock()
|
||||
defer c.handlersMutex.Unlock()
|
||||
c.handlers = append(c.handlers, handler)
|
||||
}
|
||||
|
||||
func (c *Client) GetNextJobId() JobId {
|
||||
return JobId(atomic.AddUint64(&c.currentJobId, 1))
|
||||
}
|
||||
|
||||
func (c *Client) SteamId() SteamId {
|
||||
return SteamId(atomic.LoadUint64(&c.steamId))
|
||||
}
|
||||
|
||||
func (c *Client) SessionId() int32 {
|
||||
return atomic.LoadInt32(&c.sessionId)
|
||||
}
|
||||
|
||||
func (c *Client) Connected() bool {
|
||||
c.mutex.RLock()
|
||||
defer c.mutex.RUnlock()
|
||||
return c.conn != nil
|
||||
}
|
||||
|
||||
// Connects to a random Steam server and returns its address.
|
||||
// If this client is already connected, it is disconnected first.
|
||||
// This method tries to use an address from the Steam Directory and falls
|
||||
// back to the built-in server list if the Steam Directory can't be reached.
|
||||
// If you want to connect to a specific server, use `ConnectTo`.
|
||||
func (c *Client) Connect() *netutil.PortAddr {
|
||||
var server *netutil.PortAddr
|
||||
if steamDirectoryCache.IsInitialized() {
|
||||
server = steamDirectoryCache.GetRandomCM()
|
||||
} else {
|
||||
server = GetRandomCM()
|
||||
}
|
||||
c.ConnectTo(server)
|
||||
return server
|
||||
}
|
||||
|
||||
// Connects to a specific server.
|
||||
// You may want to use one of the `GetRandom*CM()` functions in this package.
|
||||
// If this client is already connected, it is disconnected first.
|
||||
func (c *Client) ConnectTo(addr *netutil.PortAddr) {
|
||||
c.ConnectToBind(addr, nil)
|
||||
}
|
||||
|
||||
// Connects to a specific server, and binds to a specified local IP
|
||||
// If this client is already connected, it is disconnected first.
|
||||
func (c *Client) ConnectToBind(addr *netutil.PortAddr, local *net.TCPAddr) {
|
||||
c.Disconnect()
|
||||
|
||||
conn, err := dialTCP(local, addr.ToTCPAddr())
|
||||
if err != nil {
|
||||
c.Fatalf("Connect failed: %v", err)
|
||||
return
|
||||
}
|
||||
c.conn = conn
|
||||
c.writeChan = make(chan IMsg, 5)
|
||||
|
||||
go c.readLoop()
|
||||
go c.writeLoop()
|
||||
}
|
||||
|
||||
func (c *Client) Disconnect() {
|
||||
c.mutex.Lock()
|
||||
defer c.mutex.Unlock()
|
||||
|
||||
if c.conn == nil {
|
||||
return
|
||||
}
|
||||
|
||||
c.conn.Close()
|
||||
c.conn = nil
|
||||
if c.heartbeat != nil {
|
||||
c.heartbeat.Stop()
|
||||
}
|
||||
close(c.writeChan)
|
||||
c.Emit(&DisconnectedEvent{})
|
||||
|
||||
}
|
||||
|
||||
// Adds a message to the send queue. Modifications to the given message after
|
||||
// writing are not allowed (possible race conditions).
|
||||
//
|
||||
// Writes to this client when not connected are ignored.
|
||||
func (c *Client) Write(msg IMsg) {
|
||||
if cm, ok := msg.(IClientMsg); ok {
|
||||
cm.SetSessionId(c.SessionId())
|
||||
cm.SetSteamId(c.SteamId())
|
||||
}
|
||||
c.mutex.RLock()
|
||||
defer c.mutex.RUnlock()
|
||||
if c.conn == nil {
|
||||
return
|
||||
}
|
||||
c.writeChan <- msg
|
||||
}
|
||||
|
||||
func (c *Client) readLoop() {
|
||||
for {
|
||||
// This *should* be atomic on most platforms, but the Go spec doesn't guarantee it
|
||||
c.mutex.RLock()
|
||||
conn := c.conn
|
||||
c.mutex.RUnlock()
|
||||
if conn == nil {
|
||||
return
|
||||
}
|
||||
packet, err := conn.Read()
|
||||
|
||||
if err != nil {
|
||||
c.Fatalf("Error reading from the connection: %v", err)
|
||||
return
|
||||
}
|
||||
c.handlePacket(packet)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) writeLoop() {
|
||||
for {
|
||||
c.mutex.RLock()
|
||||
conn := c.conn
|
||||
c.mutex.RUnlock()
|
||||
if conn == nil {
|
||||
return
|
||||
}
|
||||
|
||||
msg, ok := <-c.writeChan
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
err := msg.Serialize(c.writeBuf)
|
||||
if err != nil {
|
||||
c.writeBuf.Reset()
|
||||
c.Fatalf("Error serializing message %v: %v", msg, err)
|
||||
return
|
||||
}
|
||||
|
||||
err = conn.Write(c.writeBuf.Bytes())
|
||||
|
||||
c.writeBuf.Reset()
|
||||
|
||||
if err != nil {
|
||||
c.Fatalf("Error writing message %v: %v", msg, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) heartbeatLoop(seconds time.Duration) {
|
||||
if c.heartbeat != nil {
|
||||
c.heartbeat.Stop()
|
||||
}
|
||||
c.heartbeat = time.NewTicker(seconds * time.Second)
|
||||
for {
|
||||
_, ok := <-c.heartbeat.C
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
c.Write(NewClientMsgProtobuf(EMsg_ClientHeartBeat, new(CMsgClientHeartBeat)))
|
||||
}
|
||||
c.heartbeat = nil
|
||||
}
|
||||
|
||||
func (c *Client) handlePacket(packet *Packet) {
|
||||
switch packet.EMsg {
|
||||
case EMsg_ChannelEncryptRequest:
|
||||
c.handleChannelEncryptRequest(packet)
|
||||
case EMsg_ChannelEncryptResult:
|
||||
c.handleChannelEncryptResult(packet)
|
||||
case EMsg_Multi:
|
||||
c.handleMulti(packet)
|
||||
case EMsg_ClientCMList:
|
||||
c.handleClientCMList(packet)
|
||||
}
|
||||
|
||||
c.handlersMutex.RLock()
|
||||
defer c.handlersMutex.RUnlock()
|
||||
for _, handler := range c.handlers {
|
||||
handler.HandlePacket(packet)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) handleChannelEncryptRequest(packet *Packet) {
|
||||
body := NewMsgChannelEncryptRequest()
|
||||
packet.ReadMsg(body)
|
||||
|
||||
if body.Universe != EUniverse_Public {
|
||||
c.Fatalf("Invalid univserse %v!", body.Universe)
|
||||
}
|
||||
|
||||
c.tempSessionKey = make([]byte, 32)
|
||||
rand.Read(c.tempSessionKey)
|
||||
encryptedKey := cryptoutil.RSAEncrypt(GetPublicKey(EUniverse_Public), c.tempSessionKey)
|
||||
|
||||
payload := new(bytes.Buffer)
|
||||
payload.Write(encryptedKey)
|
||||
binary.Write(payload, binary.LittleEndian, crc32.ChecksumIEEE(encryptedKey))
|
||||
payload.WriteByte(0)
|
||||
payload.WriteByte(0)
|
||||
payload.WriteByte(0)
|
||||
payload.WriteByte(0)
|
||||
|
||||
c.Write(NewMsg(NewMsgChannelEncryptResponse(), payload.Bytes()))
|
||||
}
|
||||
|
||||
func (c *Client) handleChannelEncryptResult(packet *Packet) {
|
||||
body := NewMsgChannelEncryptResult()
|
||||
packet.ReadMsg(body)
|
||||
|
||||
if body.Result != EResult_OK {
|
||||
c.Fatalf("Encryption failed: %v", body.Result)
|
||||
return
|
||||
}
|
||||
c.conn.SetEncryptionKey(c.tempSessionKey)
|
||||
c.tempSessionKey = nil
|
||||
|
||||
c.Emit(&ConnectedEvent{})
|
||||
}
|
||||
|
||||
func (c *Client) handleMulti(packet *Packet) {
|
||||
body := new(CMsgMulti)
|
||||
packet.ReadProtoMsg(body)
|
||||
|
||||
payload := body.GetMessageBody()
|
||||
|
||||
if body.GetSizeUnzipped() > 0 {
|
||||
r, err := gzip.NewReader(bytes.NewReader(payload))
|
||||
if err != nil {
|
||||
c.Errorf("handleMulti: Error while decompressing: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
payload, err = ioutil.ReadAll(r)
|
||||
if err != nil {
|
||||
c.Errorf("handleMulti: Error while decompressing: %v", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
pr := bytes.NewReader(payload)
|
||||
for pr.Len() > 0 {
|
||||
var length uint32
|
||||
binary.Read(pr, binary.LittleEndian, &length)
|
||||
packetData := make([]byte, length)
|
||||
pr.Read(packetData)
|
||||
p, err := NewPacket(packetData)
|
||||
if err != nil {
|
||||
c.Errorf("Error reading packet in Multi msg %v: %v", packet, err)
|
||||
continue
|
||||
}
|
||||
c.handlePacket(p)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) handleClientCMList(packet *Packet) {
|
||||
body := new(CMsgClientCMList)
|
||||
packet.ReadProtoMsg(body)
|
||||
|
||||
l := make([]*netutil.PortAddr, 0)
|
||||
for i, ip := range body.GetCmAddresses() {
|
||||
l = append(l, &netutil.PortAddr{
|
||||
readIp(ip),
|
||||
uint16(body.GetCmPorts()[i]),
|
||||
})
|
||||
}
|
||||
|
||||
c.Emit(&ClientCMListEvent{l})
|
||||
}
|
||||
|
||||
func readIp(ip uint32) net.IP {
|
||||
r := make(net.IP, 4)
|
||||
r[3] = byte(ip)
|
||||
r[2] = byte(ip >> 8)
|
||||
r[1] = byte(ip >> 16)
|
||||
r[0] = byte(ip >> 24)
|
||||
return r
|
||||
}
|
||||
20
vendor/github.com/Philipp15b/go-steam/client_events.go
generated
vendored
Normal file
20
vendor/github.com/Philipp15b/go-steam/client_events.go
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
package steam
|
||||
|
||||
import (
|
||||
"github.com/Philipp15b/go-steam/netutil"
|
||||
)
|
||||
|
||||
// When this event is emitted by the Client, the connection is automatically closed.
|
||||
// This may be caused by a network error, for example.
|
||||
type FatalErrorEvent error
|
||||
|
||||
type ConnectedEvent struct{}
|
||||
|
||||
type DisconnectedEvent struct{}
|
||||
|
||||
// A list of connection manager addresses to connect to in the future.
|
||||
// You should always save them and then select one of these
|
||||
// instead of the builtin ones for the next connection.
|
||||
type ClientCMListEvent struct {
|
||||
Addresses []*netutil.PortAddr
|
||||
}
|
||||
35
vendor/github.com/Philipp15b/go-steam/community/community.go
generated
vendored
Normal file
35
vendor/github.com/Philipp15b/go-steam/community/community.go
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
package community
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"net/http/cookiejar"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
const cookiePath = "https://steamcommunity.com/"
|
||||
|
||||
func SetCookies(client *http.Client, sessionId, steamLogin, steamLoginSecure string) {
|
||||
if client.Jar == nil {
|
||||
client.Jar, _ = cookiejar.New(new(cookiejar.Options))
|
||||
}
|
||||
base, err := url.Parse(cookiePath)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
client.Jar.SetCookies(base, []*http.Cookie{
|
||||
// It seems that, for some reason, Steam tries to URL-decode the cookie.
|
||||
&http.Cookie{
|
||||
Name: "sessionid",
|
||||
Value: url.QueryEscape(sessionId),
|
||||
},
|
||||
// steamLogin is already URL-encoded.
|
||||
&http.Cookie{
|
||||
Name: "steamLogin",
|
||||
Value: steamLogin,
|
||||
},
|
||||
&http.Cookie{
|
||||
Name: "steamLoginSecure",
|
||||
Value: steamLoginSecure,
|
||||
},
|
||||
})
|
||||
}
|
||||
127
vendor/github.com/Philipp15b/go-steam/connection.go
generated
vendored
Normal file
127
vendor/github.com/Philipp15b/go-steam/connection.go
generated
vendored
Normal file
@@ -0,0 +1,127 @@
|
||||
package steam
|
||||
|
||||
import (
|
||||
"crypto/aes"
|
||||
"crypto/cipher"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"sync"
|
||||
|
||||
"github.com/Philipp15b/go-steam/cryptoutil"
|
||||
. "github.com/Philipp15b/go-steam/protocol"
|
||||
)
|
||||
|
||||
type connection interface {
|
||||
Read() (*Packet, error)
|
||||
Write([]byte) error
|
||||
Close() error
|
||||
SetEncryptionKey([]byte)
|
||||
IsEncrypted() bool
|
||||
}
|
||||
|
||||
const tcpConnectionMagic uint32 = 0x31305456 // "VT01"
|
||||
|
||||
type tcpConnection struct {
|
||||
conn *net.TCPConn
|
||||
ciph cipher.Block
|
||||
cipherMutex sync.RWMutex
|
||||
}
|
||||
|
||||
func dialTCP(laddr, raddr *net.TCPAddr) (*tcpConnection, error) {
|
||||
conn, err := net.DialTCP("tcp", laddr, raddr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &tcpConnection{
|
||||
conn: conn,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (c *tcpConnection) Read() (*Packet, error) {
|
||||
// All packets begin with a packet length
|
||||
var packetLen uint32
|
||||
err := binary.Read(c.conn, binary.LittleEndian, &packetLen)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// A magic value follows for validation
|
||||
var packetMagic uint32
|
||||
err = binary.Read(c.conn, binary.LittleEndian, &packetMagic)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if packetMagic != tcpConnectionMagic {
|
||||
return nil, fmt.Errorf("Invalid connection magic! Expected %d, got %d!", tcpConnectionMagic, packetMagic)
|
||||
}
|
||||
|
||||
buf := make([]byte, packetLen, packetLen)
|
||||
_, err = io.ReadFull(c.conn, buf)
|
||||
if err == io.ErrUnexpectedEOF {
|
||||
return nil, io.EOF
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Packets after ChannelEncryptResult are encrypted
|
||||
c.cipherMutex.RLock()
|
||||
if c.ciph != nil {
|
||||
buf = cryptoutil.SymmetricDecrypt(c.ciph, buf)
|
||||
}
|
||||
c.cipherMutex.RUnlock()
|
||||
|
||||
return NewPacket(buf)
|
||||
}
|
||||
|
||||
// Writes a message. This may only be used by one goroutine at a time.
|
||||
func (c *tcpConnection) Write(message []byte) error {
|
||||
c.cipherMutex.RLock()
|
||||
if c.ciph != nil {
|
||||
message = cryptoutil.SymmetricEncrypt(c.ciph, message)
|
||||
}
|
||||
c.cipherMutex.RUnlock()
|
||||
|
||||
err := binary.Write(c.conn, binary.LittleEndian, uint32(len(message)))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = binary.Write(c.conn, binary.LittleEndian, tcpConnectionMagic)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = c.conn.Write(message)
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *tcpConnection) Close() error {
|
||||
return c.conn.Close()
|
||||
}
|
||||
|
||||
func (c *tcpConnection) SetEncryptionKey(key []byte) {
|
||||
c.cipherMutex.Lock()
|
||||
defer c.cipherMutex.Unlock()
|
||||
if key == nil {
|
||||
c.ciph = nil
|
||||
return
|
||||
}
|
||||
if len(key) != 32 {
|
||||
panic("Connection AES key is not 32 bytes long!")
|
||||
}
|
||||
|
||||
var err error
|
||||
c.ciph, err = aes.NewCipher(key)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *tcpConnection) IsEncrypted() bool {
|
||||
c.cipherMutex.RLock()
|
||||
defer c.cipherMutex.RUnlock()
|
||||
return c.ciph != nil
|
||||
}
|
||||
38
vendor/github.com/Philipp15b/go-steam/cryptoutil/cryptoutil.go
generated
vendored
Normal file
38
vendor/github.com/Philipp15b/go-steam/cryptoutil/cryptoutil.go
generated
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
package cryptoutil
|
||||
|
||||
import (
|
||||
"crypto/aes"
|
||||
"crypto/cipher"
|
||||
"crypto/rand"
|
||||
)
|
||||
|
||||
// Performs an encryption using AES/CBC/PKCS7
|
||||
// with a random IV prepended using AES/ECB/None.
|
||||
func SymmetricEncrypt(ciph cipher.Block, src []byte) []byte {
|
||||
// get a random IV and ECB encrypt it
|
||||
iv := make([]byte, aes.BlockSize, aes.BlockSize)
|
||||
_, err := rand.Read(iv)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
encryptedIv := make([]byte, aes.BlockSize, aes.BlockSize)
|
||||
newECBEncrypter(ciph).CryptBlocks(encryptedIv, iv)
|
||||
|
||||
// pad it, copy the IV to the first 16 bytes and encrypt the rest with CBC
|
||||
encrypted := padPKCS7WithIV(src)
|
||||
copy(encrypted, encryptedIv)
|
||||
cipher.NewCBCEncrypter(ciph, iv).CryptBlocks(encrypted[aes.BlockSize:], encrypted[aes.BlockSize:])
|
||||
return encrypted
|
||||
}
|
||||
|
||||
// Decrypts data from the reader using AES/CBC/PKCS7 with an IV
|
||||
// prepended using AES/ECB/None. The src slice may not be used anymore.
|
||||
func SymmetricDecrypt(ciph cipher.Block, src []byte) []byte {
|
||||
iv := src[:aes.BlockSize]
|
||||
newECBDecrypter(ciph).CryptBlocks(iv, iv)
|
||||
|
||||
data := src[aes.BlockSize:]
|
||||
cipher.NewCBCDecrypter(ciph, iv).CryptBlocks(data, data)
|
||||
|
||||
return unpadPKCS7(data)
|
||||
}
|
||||
68
vendor/github.com/Philipp15b/go-steam/cryptoutil/ecb.go
generated
vendored
Normal file
68
vendor/github.com/Philipp15b/go-steam/cryptoutil/ecb.go
generated
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
package cryptoutil
|
||||
|
||||
import (
|
||||
"crypto/cipher"
|
||||
)
|
||||
|
||||
// From this code review: https://codereview.appspot.com/7860047/
|
||||
// by fasmat for the Go crypto/cipher package
|
||||
|
||||
type ecb struct {
|
||||
b cipher.Block
|
||||
blockSize int
|
||||
}
|
||||
|
||||
func newECB(b cipher.Block) *ecb {
|
||||
return &ecb{
|
||||
b: b,
|
||||
blockSize: b.BlockSize(),
|
||||
}
|
||||
}
|
||||
|
||||
type ecbEncrypter ecb
|
||||
|
||||
// NewECBEncrypter returns a BlockMode which encrypts in electronic code book
|
||||
// mode, using the given Block.
|
||||
func newECBEncrypter(b cipher.Block) cipher.BlockMode {
|
||||
return (*ecbEncrypter)(newECB(b))
|
||||
}
|
||||
|
||||
func (x *ecbEncrypter) BlockSize() int { return x.blockSize }
|
||||
|
||||
func (x *ecbEncrypter) CryptBlocks(dst, src []byte) {
|
||||
if len(src)%x.blockSize != 0 {
|
||||
panic("cryptoutil/ecb: input not full blocks")
|
||||
}
|
||||
if len(dst) < len(src) {
|
||||
panic("cryptoutil/ecb: output smaller than input")
|
||||
}
|
||||
for len(src) > 0 {
|
||||
x.b.Encrypt(dst, src[:x.blockSize])
|
||||
src = src[x.blockSize:]
|
||||
dst = dst[x.blockSize:]
|
||||
}
|
||||
}
|
||||
|
||||
type ecbDecrypter ecb
|
||||
|
||||
// newECBDecrypter returns a BlockMode which decrypts in electronic code book
|
||||
// mode, using the given Block.
|
||||
func newECBDecrypter(b cipher.Block) cipher.BlockMode {
|
||||
return (*ecbDecrypter)(newECB(b))
|
||||
}
|
||||
|
||||
func (x *ecbDecrypter) BlockSize() int { return x.blockSize }
|
||||
|
||||
func (x *ecbDecrypter) CryptBlocks(dst, src []byte) {
|
||||
if len(src)%x.blockSize != 0 {
|
||||
panic("cryptoutil/ecb: input not full blocks")
|
||||
}
|
||||
if len(dst) < len(src) {
|
||||
panic("cryptoutil/ecb: output smaller than input")
|
||||
}
|
||||
for len(src) > 0 {
|
||||
x.b.Decrypt(dst, src[:x.blockSize])
|
||||
src = src[x.blockSize:]
|
||||
dst = dst[x.blockSize:]
|
||||
}
|
||||
}
|
||||
25
vendor/github.com/Philipp15b/go-steam/cryptoutil/pkcs7.go
generated
vendored
Normal file
25
vendor/github.com/Philipp15b/go-steam/cryptoutil/pkcs7.go
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
package cryptoutil
|
||||
|
||||
import (
|
||||
"crypto/aes"
|
||||
)
|
||||
|
||||
// Returns a new byte array padded with PKCS7 and prepended
|
||||
// with empty space of the AES block size (16 bytes) for the IV.
|
||||
func padPKCS7WithIV(src []byte) []byte {
|
||||
missing := aes.BlockSize - (len(src) % aes.BlockSize)
|
||||
newSize := len(src) + aes.BlockSize + missing
|
||||
dest := make([]byte, newSize, newSize)
|
||||
copy(dest[aes.BlockSize:], src)
|
||||
|
||||
padding := byte(missing)
|
||||
for i := newSize - missing; i < newSize; i++ {
|
||||
dest[i] = padding
|
||||
}
|
||||
return dest
|
||||
}
|
||||
|
||||
func unpadPKCS7(src []byte) []byte {
|
||||
padLen := src[len(src)-1]
|
||||
return src[:len(src)-int(padLen)]
|
||||
}
|
||||
31
vendor/github.com/Philipp15b/go-steam/cryptoutil/rsa.go
generated
vendored
Normal file
31
vendor/github.com/Philipp15b/go-steam/cryptoutil/rsa.go
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
package cryptoutil
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"crypto/sha1"
|
||||
"crypto/x509"
|
||||
"errors"
|
||||
)
|
||||
|
||||
// Parses a DER encoded RSA public key
|
||||
func ParseASN1RSAPublicKey(derBytes []byte) (*rsa.PublicKey, error) {
|
||||
key, err := x509.ParsePKIXPublicKey(derBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pubKey, ok := key.(*rsa.PublicKey)
|
||||
if !ok {
|
||||
return nil, errors.New("not an RSA public key")
|
||||
}
|
||||
return pubKey, nil
|
||||
}
|
||||
|
||||
// Encrypts a message with the given public key using RSA-OAEP and the sha1 hash function.
|
||||
func RSAEncrypt(pub *rsa.PublicKey, msg []byte) []byte {
|
||||
b, err := rsa.EncryptOAEP(sha1.New(), rand.Reader, pub, msg, nil)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return b
|
||||
}
|
||||
53
vendor/github.com/Philipp15b/go-steam/doc.go
generated
vendored
Normal file
53
vendor/github.com/Philipp15b/go-steam/doc.go
generated
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
This package allows you to automate actions on Valve's Steam network. It is a Go port of SteamKit.
|
||||
|
||||
To login, you'll have to create a new Client first. Then connect to the Steam network
|
||||
and wait for a ConnectedCallback. Then you may call the Login method in the Auth module
|
||||
with your login information. This is covered in more detail in the method's documentation. After you've
|
||||
received the LoggedOnEvent, you should set your persona state to online to receive friend lists etc.
|
||||
|
||||
Example code
|
||||
|
||||
You can also find a running example in the `gsbot` package.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"log"
|
||||
|
||||
"github.com/Philipp15b/go-steam"
|
||||
"github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
)
|
||||
|
||||
func main() {
|
||||
myLoginInfo := new(steam.LogOnDetails)
|
||||
myLoginInfo.Username = "Your username"
|
||||
myLoginInfo.Password = "Your password"
|
||||
|
||||
client := steam.NewClient()
|
||||
client.Connect()
|
||||
for event := range client.Events() {
|
||||
switch e := event.(type) {
|
||||
case *steam.ConnectedEvent:
|
||||
client.Auth.LogOn(myLoginInfo)
|
||||
case *steam.MachineAuthUpdateEvent:
|
||||
ioutil.WriteFile("sentry", e.Hash, 0666)
|
||||
case *steam.LoggedOnEvent:
|
||||
client.Social.SetPersonaState(steamlang.EPersonaState_Online)
|
||||
case steam.FatalErrorEvent:
|
||||
log.Print(e)
|
||||
case error:
|
||||
log.Print(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Events
|
||||
|
||||
go-steam emits events that can be read via Client.Events(). Although the channel has the type interface{},
|
||||
only types from this package ending with "Event" and errors will be emitted.
|
||||
|
||||
*/
|
||||
package steam
|
||||
3651
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/base.pb.go
generated
vendored
Normal file
3651
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/base.pb.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
18413
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/dota_client.pb.go
generated
vendored
Normal file
18413
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/dota_client.pb.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
6123
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/dota_client_fantasy.pb.go
generated
vendored
Normal file
6123
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/dota_client_fantasy.pb.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
10997
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/dota_common.pb.go
generated
vendored
Normal file
10997
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/dota_common.pb.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4441
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/econ.pb.go
generated
vendored
Normal file
4441
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/econ.pb.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1825
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/gcsdk.pb.go
generated
vendored
Normal file
1825
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/gcsdk.pb.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
579
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/system.pb.go
generated
vendored
Normal file
579
vendor/github.com/Philipp15b/go-steam/dota/protocol/protobuf/system.pb.go
generated
vendored
Normal file
@@ -0,0 +1,579 @@
|
||||
// Code generated by protoc-gen-go.
|
||||
// source: gcsystemmsgs.proto
|
||||
// DO NOT EDIT!
|
||||
|
||||
package protobuf
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
import fmt "fmt"
|
||||
import math "math"
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package protobuf is being compiled against.
|
||||
const _ = proto.ProtoPackageIsVersion1
|
||||
|
||||
type EGCSystemMsg int32
|
||||
|
||||
const (
|
||||
EGCSystemMsg_k_EGCMsgInvalid EGCSystemMsg = 0
|
||||
EGCSystemMsg_k_EGCMsgMulti EGCSystemMsg = 1
|
||||
EGCSystemMsg_k_EGCMsgGenericReply EGCSystemMsg = 10
|
||||
EGCSystemMsg_k_EGCMsgSystemBase EGCSystemMsg = 50
|
||||
EGCSystemMsg_k_EGCMsgAchievementAwarded EGCSystemMsg = 51
|
||||
EGCSystemMsg_k_EGCMsgConCommand EGCSystemMsg = 52
|
||||
EGCSystemMsg_k_EGCMsgStartPlaying EGCSystemMsg = 53
|
||||
EGCSystemMsg_k_EGCMsgStopPlaying EGCSystemMsg = 54
|
||||
EGCSystemMsg_k_EGCMsgStartGameserver EGCSystemMsg = 55
|
||||
EGCSystemMsg_k_EGCMsgStopGameserver EGCSystemMsg = 56
|
||||
EGCSystemMsg_k_EGCMsgWGRequest EGCSystemMsg = 57
|
||||
EGCSystemMsg_k_EGCMsgWGResponse EGCSystemMsg = 58
|
||||
EGCSystemMsg_k_EGCMsgGetUserGameStatsSchema EGCSystemMsg = 59
|
||||
EGCSystemMsg_k_EGCMsgGetUserGameStatsSchemaResponse EGCSystemMsg = 60
|
||||
EGCSystemMsg_k_EGCMsgGetUserStatsDEPRECATED EGCSystemMsg = 61
|
||||
EGCSystemMsg_k_EGCMsgGetUserStatsResponse EGCSystemMsg = 62
|
||||
EGCSystemMsg_k_EGCMsgAppInfoUpdated EGCSystemMsg = 63
|
||||
EGCSystemMsg_k_EGCMsgValidateSession EGCSystemMsg = 64
|
||||
EGCSystemMsg_k_EGCMsgValidateSessionResponse EGCSystemMsg = 65
|
||||
EGCSystemMsg_k_EGCMsgLookupAccountFromInput EGCSystemMsg = 66
|
||||
EGCSystemMsg_k_EGCMsgSendHTTPRequest EGCSystemMsg = 67
|
||||
EGCSystemMsg_k_EGCMsgSendHTTPRequestResponse EGCSystemMsg = 68
|
||||
EGCSystemMsg_k_EGCMsgPreTestSetup EGCSystemMsg = 69
|
||||
EGCSystemMsg_k_EGCMsgRecordSupportAction EGCSystemMsg = 70
|
||||
EGCSystemMsg_k_EGCMsgGetAccountDetails_DEPRECATED EGCSystemMsg = 71
|
||||
EGCSystemMsg_k_EGCMsgReceiveInterAppMessage EGCSystemMsg = 73
|
||||
EGCSystemMsg_k_EGCMsgFindAccounts EGCSystemMsg = 74
|
||||
EGCSystemMsg_k_EGCMsgPostAlert EGCSystemMsg = 75
|
||||
EGCSystemMsg_k_EGCMsgGetLicenses EGCSystemMsg = 76
|
||||
EGCSystemMsg_k_EGCMsgGetUserStats EGCSystemMsg = 77
|
||||
EGCSystemMsg_k_EGCMsgGetCommands EGCSystemMsg = 78
|
||||
EGCSystemMsg_k_EGCMsgGetCommandsResponse EGCSystemMsg = 79
|
||||
EGCSystemMsg_k_EGCMsgAddFreeLicense EGCSystemMsg = 80
|
||||
EGCSystemMsg_k_EGCMsgAddFreeLicenseResponse EGCSystemMsg = 81
|
||||
EGCSystemMsg_k_EGCMsgGetIPLocation EGCSystemMsg = 82
|
||||
EGCSystemMsg_k_EGCMsgGetIPLocationResponse EGCSystemMsg = 83
|
||||
EGCSystemMsg_k_EGCMsgSystemStatsSchema EGCSystemMsg = 84
|
||||
EGCSystemMsg_k_EGCMsgGetSystemStats EGCSystemMsg = 85
|
||||
EGCSystemMsg_k_EGCMsgGetSystemStatsResponse EGCSystemMsg = 86
|
||||
EGCSystemMsg_k_EGCMsgSendEmail EGCSystemMsg = 87
|
||||
EGCSystemMsg_k_EGCMsgSendEmailResponse EGCSystemMsg = 88
|
||||
EGCSystemMsg_k_EGCMsgGetEmailTemplate EGCSystemMsg = 89
|
||||
EGCSystemMsg_k_EGCMsgGetEmailTemplateResponse EGCSystemMsg = 90
|
||||
EGCSystemMsg_k_EGCMsgGrantGuestPass EGCSystemMsg = 91
|
||||
EGCSystemMsg_k_EGCMsgGrantGuestPassResponse EGCSystemMsg = 92
|
||||
EGCSystemMsg_k_EGCMsgGetAccountDetails EGCSystemMsg = 93
|
||||
EGCSystemMsg_k_EGCMsgGetAccountDetailsResponse EGCSystemMsg = 94
|
||||
EGCSystemMsg_k_EGCMsgGetPersonaNames EGCSystemMsg = 95
|
||||
EGCSystemMsg_k_EGCMsgGetPersonaNamesResponse EGCSystemMsg = 96
|
||||
EGCSystemMsg_k_EGCMsgMultiplexMsg EGCSystemMsg = 97
|
||||
EGCSystemMsg_k_EGCMsgWebAPIRegisterInterfaces EGCSystemMsg = 101
|
||||
EGCSystemMsg_k_EGCMsgWebAPIJobRequest EGCSystemMsg = 102
|
||||
EGCSystemMsg_k_EGCMsgWebAPIJobRequestHttpResponse EGCSystemMsg = 104
|
||||
EGCSystemMsg_k_EGCMsgWebAPIJobRequestForwardResponse EGCSystemMsg = 105
|
||||
EGCSystemMsg_k_EGCMsgMemCachedGet EGCSystemMsg = 200
|
||||
EGCSystemMsg_k_EGCMsgMemCachedGetResponse EGCSystemMsg = 201
|
||||
EGCSystemMsg_k_EGCMsgMemCachedSet EGCSystemMsg = 202
|
||||
EGCSystemMsg_k_EGCMsgMemCachedDelete EGCSystemMsg = 203
|
||||
EGCSystemMsg_k_EGCMsgMemCachedStats EGCSystemMsg = 204
|
||||
EGCSystemMsg_k_EGCMsgMemCachedStatsResponse EGCSystemMsg = 205
|
||||
EGCSystemMsg_k_EGCMsgSQLStats EGCSystemMsg = 210
|
||||
EGCSystemMsg_k_EGCMsgSQLStatsResponse EGCSystemMsg = 211
|
||||
EGCSystemMsg_k_EGCMsgMasterSetDirectory EGCSystemMsg = 220
|
||||
EGCSystemMsg_k_EGCMsgMasterSetDirectoryResponse EGCSystemMsg = 221
|
||||
EGCSystemMsg_k_EGCMsgMasterSetWebAPIRouting EGCSystemMsg = 222
|
||||
EGCSystemMsg_k_EGCMsgMasterSetWebAPIRoutingResponse EGCSystemMsg = 223
|
||||
EGCSystemMsg_k_EGCMsgMasterSetClientMsgRouting EGCSystemMsg = 224
|
||||
EGCSystemMsg_k_EGCMsgMasterSetClientMsgRoutingResponse EGCSystemMsg = 225
|
||||
EGCSystemMsg_k_EGCMsgSetOptions EGCSystemMsg = 226
|
||||
EGCSystemMsg_k_EGCMsgSetOptionsResponse EGCSystemMsg = 227
|
||||
EGCSystemMsg_k_EGCMsgSystemBase2 EGCSystemMsg = 500
|
||||
EGCSystemMsg_k_EGCMsgGetPurchaseTrustStatus EGCSystemMsg = 501
|
||||
EGCSystemMsg_k_EGCMsgGetPurchaseTrustStatusResponse EGCSystemMsg = 502
|
||||
EGCSystemMsg_k_EGCMsgUpdateSession EGCSystemMsg = 503
|
||||
EGCSystemMsg_k_EGCMsgGCAccountVacStatusChange EGCSystemMsg = 504
|
||||
EGCSystemMsg_k_EGCMsgCheckFriendship EGCSystemMsg = 505
|
||||
EGCSystemMsg_k_EGCMsgCheckFriendshipResponse EGCSystemMsg = 506
|
||||
EGCSystemMsg_k_EGCMsgGetPartnerAccountLink EGCSystemMsg = 507
|
||||
EGCSystemMsg_k_EGCMsgGetPartnerAccountLinkResponse EGCSystemMsg = 508
|
||||
EGCSystemMsg_k_EGCMsgVSReportedSuspiciousActivity EGCSystemMsg = 509
|
||||
EGCSystemMsg_k_EGCMsgDPPartnerMicroTxns EGCSystemMsg = 512
|
||||
EGCSystemMsg_k_EGCMsgDPPartnerMicroTxnsResponse EGCSystemMsg = 513
|
||||
EGCSystemMsg_k_EGCMsgGetIPASN EGCSystemMsg = 514
|
||||
EGCSystemMsg_k_EGCMsgGetIPASNResponse EGCSystemMsg = 515
|
||||
EGCSystemMsg_k_EGCMsgGetAppFriendsList EGCSystemMsg = 516
|
||||
EGCSystemMsg_k_EGCMsgGetAppFriendsListResponse EGCSystemMsg = 517
|
||||
)
|
||||
|
||||
var EGCSystemMsg_name = map[int32]string{
|
||||
0: "k_EGCMsgInvalid",
|
||||
1: "k_EGCMsgMulti",
|
||||
10: "k_EGCMsgGenericReply",
|
||||
50: "k_EGCMsgSystemBase",
|
||||
51: "k_EGCMsgAchievementAwarded",
|
||||
52: "k_EGCMsgConCommand",
|
||||
53: "k_EGCMsgStartPlaying",
|
||||
54: "k_EGCMsgStopPlaying",
|
||||
55: "k_EGCMsgStartGameserver",
|
||||
56: "k_EGCMsgStopGameserver",
|
||||
57: "k_EGCMsgWGRequest",
|
||||
58: "k_EGCMsgWGResponse",
|
||||
59: "k_EGCMsgGetUserGameStatsSchema",
|
||||
60: "k_EGCMsgGetUserGameStatsSchemaResponse",
|
||||
61: "k_EGCMsgGetUserStatsDEPRECATED",
|
||||
62: "k_EGCMsgGetUserStatsResponse",
|
||||
63: "k_EGCMsgAppInfoUpdated",
|
||||
64: "k_EGCMsgValidateSession",
|
||||
65: "k_EGCMsgValidateSessionResponse",
|
||||
66: "k_EGCMsgLookupAccountFromInput",
|
||||
67: "k_EGCMsgSendHTTPRequest",
|
||||
68: "k_EGCMsgSendHTTPRequestResponse",
|
||||
69: "k_EGCMsgPreTestSetup",
|
||||
70: "k_EGCMsgRecordSupportAction",
|
||||
71: "k_EGCMsgGetAccountDetails_DEPRECATED",
|
||||
73: "k_EGCMsgReceiveInterAppMessage",
|
||||
74: "k_EGCMsgFindAccounts",
|
||||
75: "k_EGCMsgPostAlert",
|
||||
76: "k_EGCMsgGetLicenses",
|
||||
77: "k_EGCMsgGetUserStats",
|
||||
78: "k_EGCMsgGetCommands",
|
||||
79: "k_EGCMsgGetCommandsResponse",
|
||||
80: "k_EGCMsgAddFreeLicense",
|
||||
81: "k_EGCMsgAddFreeLicenseResponse",
|
||||
82: "k_EGCMsgGetIPLocation",
|
||||
83: "k_EGCMsgGetIPLocationResponse",
|
||||
84: "k_EGCMsgSystemStatsSchema",
|
||||
85: "k_EGCMsgGetSystemStats",
|
||||
86: "k_EGCMsgGetSystemStatsResponse",
|
||||
87: "k_EGCMsgSendEmail",
|
||||
88: "k_EGCMsgSendEmailResponse",
|
||||
89: "k_EGCMsgGetEmailTemplate",
|
||||
90: "k_EGCMsgGetEmailTemplateResponse",
|
||||
91: "k_EGCMsgGrantGuestPass",
|
||||
92: "k_EGCMsgGrantGuestPassResponse",
|
||||
93: "k_EGCMsgGetAccountDetails",
|
||||
94: "k_EGCMsgGetAccountDetailsResponse",
|
||||
95: "k_EGCMsgGetPersonaNames",
|
||||
96: "k_EGCMsgGetPersonaNamesResponse",
|
||||
97: "k_EGCMsgMultiplexMsg",
|
||||
101: "k_EGCMsgWebAPIRegisterInterfaces",
|
||||
102: "k_EGCMsgWebAPIJobRequest",
|
||||
104: "k_EGCMsgWebAPIJobRequestHttpResponse",
|
||||
105: "k_EGCMsgWebAPIJobRequestForwardResponse",
|
||||
200: "k_EGCMsgMemCachedGet",
|
||||
201: "k_EGCMsgMemCachedGetResponse",
|
||||
202: "k_EGCMsgMemCachedSet",
|
||||
203: "k_EGCMsgMemCachedDelete",
|
||||
204: "k_EGCMsgMemCachedStats",
|
||||
205: "k_EGCMsgMemCachedStatsResponse",
|
||||
210: "k_EGCMsgSQLStats",
|
||||
211: "k_EGCMsgSQLStatsResponse",
|
||||
220: "k_EGCMsgMasterSetDirectory",
|
||||
221: "k_EGCMsgMasterSetDirectoryResponse",
|
||||
222: "k_EGCMsgMasterSetWebAPIRouting",
|
||||
223: "k_EGCMsgMasterSetWebAPIRoutingResponse",
|
||||
224: "k_EGCMsgMasterSetClientMsgRouting",
|
||||
225: "k_EGCMsgMasterSetClientMsgRoutingResponse",
|
||||
226: "k_EGCMsgSetOptions",
|
||||
227: "k_EGCMsgSetOptionsResponse",
|
||||
500: "k_EGCMsgSystemBase2",
|
||||
501: "k_EGCMsgGetPurchaseTrustStatus",
|
||||
502: "k_EGCMsgGetPurchaseTrustStatusResponse",
|
||||
503: "k_EGCMsgUpdateSession",
|
||||
504: "k_EGCMsgGCAccountVacStatusChange",
|
||||
505: "k_EGCMsgCheckFriendship",
|
||||
506: "k_EGCMsgCheckFriendshipResponse",
|
||||
507: "k_EGCMsgGetPartnerAccountLink",
|
||||
508: "k_EGCMsgGetPartnerAccountLinkResponse",
|
||||
509: "k_EGCMsgVSReportedSuspiciousActivity",
|
||||
512: "k_EGCMsgDPPartnerMicroTxns",
|
||||
513: "k_EGCMsgDPPartnerMicroTxnsResponse",
|
||||
514: "k_EGCMsgGetIPASN",
|
||||
515: "k_EGCMsgGetIPASNResponse",
|
||||
516: "k_EGCMsgGetAppFriendsList",
|
||||
517: "k_EGCMsgGetAppFriendsListResponse",
|
||||
}
|
||||
var EGCSystemMsg_value = map[string]int32{
|
||||
"k_EGCMsgInvalid": 0,
|
||||
"k_EGCMsgMulti": 1,
|
||||
"k_EGCMsgGenericReply": 10,
|
||||
"k_EGCMsgSystemBase": 50,
|
||||
"k_EGCMsgAchievementAwarded": 51,
|
||||
"k_EGCMsgConCommand": 52,
|
||||
"k_EGCMsgStartPlaying": 53,
|
||||
"k_EGCMsgStopPlaying": 54,
|
||||
"k_EGCMsgStartGameserver": 55,
|
||||
"k_EGCMsgStopGameserver": 56,
|
||||
"k_EGCMsgWGRequest": 57,
|
||||
"k_EGCMsgWGResponse": 58,
|
||||
"k_EGCMsgGetUserGameStatsSchema": 59,
|
||||
"k_EGCMsgGetUserGameStatsSchemaResponse": 60,
|
||||
"k_EGCMsgGetUserStatsDEPRECATED": 61,
|
||||
"k_EGCMsgGetUserStatsResponse": 62,
|
||||
"k_EGCMsgAppInfoUpdated": 63,
|
||||
"k_EGCMsgValidateSession": 64,
|
||||
"k_EGCMsgValidateSessionResponse": 65,
|
||||
"k_EGCMsgLookupAccountFromInput": 66,
|
||||
"k_EGCMsgSendHTTPRequest": 67,
|
||||
"k_EGCMsgSendHTTPRequestResponse": 68,
|
||||
"k_EGCMsgPreTestSetup": 69,
|
||||
"k_EGCMsgRecordSupportAction": 70,
|
||||
"k_EGCMsgGetAccountDetails_DEPRECATED": 71,
|
||||
"k_EGCMsgReceiveInterAppMessage": 73,
|
||||
"k_EGCMsgFindAccounts": 74,
|
||||
"k_EGCMsgPostAlert": 75,
|
||||
"k_EGCMsgGetLicenses": 76,
|
||||
"k_EGCMsgGetUserStats": 77,
|
||||
"k_EGCMsgGetCommands": 78,
|
||||
"k_EGCMsgGetCommandsResponse": 79,
|
||||
"k_EGCMsgAddFreeLicense": 80,
|
||||
"k_EGCMsgAddFreeLicenseResponse": 81,
|
||||
"k_EGCMsgGetIPLocation": 82,
|
||||
"k_EGCMsgGetIPLocationResponse": 83,
|
||||
"k_EGCMsgSystemStatsSchema": 84,
|
||||
"k_EGCMsgGetSystemStats": 85,
|
||||
"k_EGCMsgGetSystemStatsResponse": 86,
|
||||
"k_EGCMsgSendEmail": 87,
|
||||
"k_EGCMsgSendEmailResponse": 88,
|
||||
"k_EGCMsgGetEmailTemplate": 89,
|
||||
"k_EGCMsgGetEmailTemplateResponse": 90,
|
||||
"k_EGCMsgGrantGuestPass": 91,
|
||||
"k_EGCMsgGrantGuestPassResponse": 92,
|
||||
"k_EGCMsgGetAccountDetails": 93,
|
||||
"k_EGCMsgGetAccountDetailsResponse": 94,
|
||||
"k_EGCMsgGetPersonaNames": 95,
|
||||
"k_EGCMsgGetPersonaNamesResponse": 96,
|
||||
"k_EGCMsgMultiplexMsg": 97,
|
||||
"k_EGCMsgWebAPIRegisterInterfaces": 101,
|
||||
"k_EGCMsgWebAPIJobRequest": 102,
|
||||
"k_EGCMsgWebAPIJobRequestHttpResponse": 104,
|
||||
"k_EGCMsgWebAPIJobRequestForwardResponse": 105,
|
||||
"k_EGCMsgMemCachedGet": 200,
|
||||
"k_EGCMsgMemCachedGetResponse": 201,
|
||||
"k_EGCMsgMemCachedSet": 202,
|
||||
"k_EGCMsgMemCachedDelete": 203,
|
||||
"k_EGCMsgMemCachedStats": 204,
|
||||
"k_EGCMsgMemCachedStatsResponse": 205,
|
||||
"k_EGCMsgSQLStats": 210,
|
||||
"k_EGCMsgSQLStatsResponse": 211,
|
||||
"k_EGCMsgMasterSetDirectory": 220,
|
||||
"k_EGCMsgMasterSetDirectoryResponse": 221,
|
||||
"k_EGCMsgMasterSetWebAPIRouting": 222,
|
||||
"k_EGCMsgMasterSetWebAPIRoutingResponse": 223,
|
||||
"k_EGCMsgMasterSetClientMsgRouting": 224,
|
||||
"k_EGCMsgMasterSetClientMsgRoutingResponse": 225,
|
||||
"k_EGCMsgSetOptions": 226,
|
||||
"k_EGCMsgSetOptionsResponse": 227,
|
||||
"k_EGCMsgSystemBase2": 500,
|
||||
"k_EGCMsgGetPurchaseTrustStatus": 501,
|
||||
"k_EGCMsgGetPurchaseTrustStatusResponse": 502,
|
||||
"k_EGCMsgUpdateSession": 503,
|
||||
"k_EGCMsgGCAccountVacStatusChange": 504,
|
||||
"k_EGCMsgCheckFriendship": 505,
|
||||
"k_EGCMsgCheckFriendshipResponse": 506,
|
||||
"k_EGCMsgGetPartnerAccountLink": 507,
|
||||
"k_EGCMsgGetPartnerAccountLinkResponse": 508,
|
||||
"k_EGCMsgVSReportedSuspiciousActivity": 509,
|
||||
"k_EGCMsgDPPartnerMicroTxns": 512,
|
||||
"k_EGCMsgDPPartnerMicroTxnsResponse": 513,
|
||||
"k_EGCMsgGetIPASN": 514,
|
||||
"k_EGCMsgGetIPASNResponse": 515,
|
||||
"k_EGCMsgGetAppFriendsList": 516,
|
||||
"k_EGCMsgGetAppFriendsListResponse": 517,
|
||||
}
|
||||
|
||||
func (x EGCSystemMsg) Enum() *EGCSystemMsg {
|
||||
p := new(EGCSystemMsg)
|
||||
*p = x
|
||||
return p
|
||||
}
|
||||
func (x EGCSystemMsg) String() string {
|
||||
return proto.EnumName(EGCSystemMsg_name, int32(x))
|
||||
}
|
||||
func (x *EGCSystemMsg) UnmarshalJSON(data []byte) error {
|
||||
value, err := proto.UnmarshalJSONEnum(EGCSystemMsg_value, data, "EGCSystemMsg")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*x = EGCSystemMsg(value)
|
||||
return nil
|
||||
}
|
||||
func (EGCSystemMsg) EnumDescriptor() ([]byte, []int) { return system_fileDescriptor0, []int{0} }
|
||||
|
||||
type ESOMsg int32
|
||||
|
||||
const (
|
||||
ESOMsg_k_ESOMsg_Create ESOMsg = 21
|
||||
ESOMsg_k_ESOMsg_Update ESOMsg = 22
|
||||
ESOMsg_k_ESOMsg_Destroy ESOMsg = 23
|
||||
ESOMsg_k_ESOMsg_CacheSubscribed ESOMsg = 24
|
||||
ESOMsg_k_ESOMsg_CacheUnsubscribed ESOMsg = 25
|
||||
ESOMsg_k_ESOMsg_UpdateMultiple ESOMsg = 26
|
||||
ESOMsg_k_ESOMsg_CacheSubscriptionRefresh ESOMsg = 28
|
||||
ESOMsg_k_ESOMsg_CacheSubscribedUpToDate ESOMsg = 29
|
||||
)
|
||||
|
||||
var ESOMsg_name = map[int32]string{
|
||||
21: "k_ESOMsg_Create",
|
||||
22: "k_ESOMsg_Update",
|
||||
23: "k_ESOMsg_Destroy",
|
||||
24: "k_ESOMsg_CacheSubscribed",
|
||||
25: "k_ESOMsg_CacheUnsubscribed",
|
||||
26: "k_ESOMsg_UpdateMultiple",
|
||||
28: "k_ESOMsg_CacheSubscriptionRefresh",
|
||||
29: "k_ESOMsg_CacheSubscribedUpToDate",
|
||||
}
|
||||
var ESOMsg_value = map[string]int32{
|
||||
"k_ESOMsg_Create": 21,
|
||||
"k_ESOMsg_Update": 22,
|
||||
"k_ESOMsg_Destroy": 23,
|
||||
"k_ESOMsg_CacheSubscribed": 24,
|
||||
"k_ESOMsg_CacheUnsubscribed": 25,
|
||||
"k_ESOMsg_UpdateMultiple": 26,
|
||||
"k_ESOMsg_CacheSubscriptionRefresh": 28,
|
||||
"k_ESOMsg_CacheSubscribedUpToDate": 29,
|
||||
}
|
||||
|
||||
func (x ESOMsg) Enum() *ESOMsg {
|
||||
p := new(ESOMsg)
|
||||
*p = x
|
||||
return p
|
||||
}
|
||||
func (x ESOMsg) String() string {
|
||||
return proto.EnumName(ESOMsg_name, int32(x))
|
||||
}
|
||||
func (x *ESOMsg) UnmarshalJSON(data []byte) error {
|
||||
value, err := proto.UnmarshalJSONEnum(ESOMsg_value, data, "ESOMsg")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*x = ESOMsg(value)
|
||||
return nil
|
||||
}
|
||||
func (ESOMsg) EnumDescriptor() ([]byte, []int) { return system_fileDescriptor0, []int{1} }
|
||||
|
||||
type EGCBaseClientMsg int32
|
||||
|
||||
const (
|
||||
EGCBaseClientMsg_k_EMsgGCPingRequest EGCBaseClientMsg = 3001
|
||||
EGCBaseClientMsg_k_EMsgGCPingResponse EGCBaseClientMsg = 3002
|
||||
EGCBaseClientMsg_k_EMsgGCClientWelcome EGCBaseClientMsg = 4004
|
||||
EGCBaseClientMsg_k_EMsgGCServerWelcome EGCBaseClientMsg = 4005
|
||||
EGCBaseClientMsg_k_EMsgGCClientHello EGCBaseClientMsg = 4006
|
||||
EGCBaseClientMsg_k_EMsgGCServerHello EGCBaseClientMsg = 4007
|
||||
EGCBaseClientMsg_k_EMsgGCClientConnectionStatus EGCBaseClientMsg = 4009
|
||||
EGCBaseClientMsg_k_EMsgGCServerConnectionStatus EGCBaseClientMsg = 4010
|
||||
)
|
||||
|
||||
var EGCBaseClientMsg_name = map[int32]string{
|
||||
3001: "k_EMsgGCPingRequest",
|
||||
3002: "k_EMsgGCPingResponse",
|
||||
4004: "k_EMsgGCClientWelcome",
|
||||
4005: "k_EMsgGCServerWelcome",
|
||||
4006: "k_EMsgGCClientHello",
|
||||
4007: "k_EMsgGCServerHello",
|
||||
4009: "k_EMsgGCClientConnectionStatus",
|
||||
4010: "k_EMsgGCServerConnectionStatus",
|
||||
}
|
||||
var EGCBaseClientMsg_value = map[string]int32{
|
||||
"k_EMsgGCPingRequest": 3001,
|
||||
"k_EMsgGCPingResponse": 3002,
|
||||
"k_EMsgGCClientWelcome": 4004,
|
||||
"k_EMsgGCServerWelcome": 4005,
|
||||
"k_EMsgGCClientHello": 4006,
|
||||
"k_EMsgGCServerHello": 4007,
|
||||
"k_EMsgGCClientConnectionStatus": 4009,
|
||||
"k_EMsgGCServerConnectionStatus": 4010,
|
||||
}
|
||||
|
||||
func (x EGCBaseClientMsg) Enum() *EGCBaseClientMsg {
|
||||
p := new(EGCBaseClientMsg)
|
||||
*p = x
|
||||
return p
|
||||
}
|
||||
func (x EGCBaseClientMsg) String() string {
|
||||
return proto.EnumName(EGCBaseClientMsg_name, int32(x))
|
||||
}
|
||||
func (x *EGCBaseClientMsg) UnmarshalJSON(data []byte) error {
|
||||
value, err := proto.UnmarshalJSONEnum(EGCBaseClientMsg_value, data, "EGCBaseClientMsg")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*x = EGCBaseClientMsg(value)
|
||||
return nil
|
||||
}
|
||||
func (EGCBaseClientMsg) EnumDescriptor() ([]byte, []int) { return system_fileDescriptor0, []int{2} }
|
||||
|
||||
type EGCToGCMsg int32
|
||||
|
||||
const (
|
||||
EGCToGCMsg_k_EGCToGCMsgMasterAck EGCToGCMsg = 150
|
||||
EGCToGCMsg_k_EGCToGCMsgMasterAckResponse EGCToGCMsg = 151
|
||||
EGCToGCMsg_k_EGCToGCMsgRouted EGCToGCMsg = 152
|
||||
EGCToGCMsg_k_EGCToGCMsgRoutedReply EGCToGCMsg = 153
|
||||
EGCToGCMsg_k_EMsgGCUpdateSubGCSessionInfo EGCToGCMsg = 154
|
||||
EGCToGCMsg_k_EMsgGCRequestSubGCSessionInfo EGCToGCMsg = 155
|
||||
EGCToGCMsg_k_EMsgGCRequestSubGCSessionInfoResponse EGCToGCMsg = 156
|
||||
EGCToGCMsg_k_EGCToGCMsgMasterStartupComplete EGCToGCMsg = 157
|
||||
EGCToGCMsg_k_EMsgGCToGCSOCacheSubscribe EGCToGCMsg = 158
|
||||
EGCToGCMsg_k_EMsgGCToGCSOCacheUnsubscribe EGCToGCMsg = 159
|
||||
EGCToGCMsg_k_EMsgGCToGCLoadSessionSOCache EGCToGCMsg = 160
|
||||
EGCToGCMsg_k_EMsgGCToGCLoadSessionSOCacheResponse EGCToGCMsg = 161
|
||||
EGCToGCMsg_k_EMsgGCToGCUpdateSessionStats EGCToGCMsg = 162
|
||||
)
|
||||
|
||||
var EGCToGCMsg_name = map[int32]string{
|
||||
150: "k_EGCToGCMsgMasterAck",
|
||||
151: "k_EGCToGCMsgMasterAckResponse",
|
||||
152: "k_EGCToGCMsgRouted",
|
||||
153: "k_EGCToGCMsgRoutedReply",
|
||||
154: "k_EMsgGCUpdateSubGCSessionInfo",
|
||||
155: "k_EMsgGCRequestSubGCSessionInfo",
|
||||
156: "k_EMsgGCRequestSubGCSessionInfoResponse",
|
||||
157: "k_EGCToGCMsgMasterStartupComplete",
|
||||
158: "k_EMsgGCToGCSOCacheSubscribe",
|
||||
159: "k_EMsgGCToGCSOCacheUnsubscribe",
|
||||
160: "k_EMsgGCToGCLoadSessionSOCache",
|
||||
161: "k_EMsgGCToGCLoadSessionSOCacheResponse",
|
||||
162: "k_EMsgGCToGCUpdateSessionStats",
|
||||
}
|
||||
var EGCToGCMsg_value = map[string]int32{
|
||||
"k_EGCToGCMsgMasterAck": 150,
|
||||
"k_EGCToGCMsgMasterAckResponse": 151,
|
||||
"k_EGCToGCMsgRouted": 152,
|
||||
"k_EGCToGCMsgRoutedReply": 153,
|
||||
"k_EMsgGCUpdateSubGCSessionInfo": 154,
|
||||
"k_EMsgGCRequestSubGCSessionInfo": 155,
|
||||
"k_EMsgGCRequestSubGCSessionInfoResponse": 156,
|
||||
"k_EGCToGCMsgMasterStartupComplete": 157,
|
||||
"k_EMsgGCToGCSOCacheSubscribe": 158,
|
||||
"k_EMsgGCToGCSOCacheUnsubscribe": 159,
|
||||
"k_EMsgGCToGCLoadSessionSOCache": 160,
|
||||
"k_EMsgGCToGCLoadSessionSOCacheResponse": 161,
|
||||
"k_EMsgGCToGCUpdateSessionStats": 162,
|
||||
}
|
||||
|
||||
func (x EGCToGCMsg) Enum() *EGCToGCMsg {
|
||||
p := new(EGCToGCMsg)
|
||||
*p = x
|
||||
return p
|
||||
}
|
||||
func (x EGCToGCMsg) String() string {
|
||||
return proto.EnumName(EGCToGCMsg_name, int32(x))
|
||||
}
|
||||
func (x *EGCToGCMsg) UnmarshalJSON(data []byte) error {
|
||||
value, err := proto.UnmarshalJSONEnum(EGCToGCMsg_value, data, "EGCToGCMsg")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*x = EGCToGCMsg(value)
|
||||
return nil
|
||||
}
|
||||
func (EGCToGCMsg) EnumDescriptor() ([]byte, []int) { return system_fileDescriptor0, []int{3} }
|
||||
|
||||
func init() {
|
||||
proto.RegisterEnum("EGCSystemMsg", EGCSystemMsg_name, EGCSystemMsg_value)
|
||||
proto.RegisterEnum("ESOMsg", ESOMsg_name, ESOMsg_value)
|
||||
proto.RegisterEnum("EGCBaseClientMsg", EGCBaseClientMsg_name, EGCBaseClientMsg_value)
|
||||
proto.RegisterEnum("EGCToGCMsg", EGCToGCMsg_name, EGCToGCMsg_value)
|
||||
}
|
||||
|
||||
var system_fileDescriptor0 = []byte{
|
||||
// 1475 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x57, 0x59, 0x73, 0x1b, 0xc5,
|
||||
0x13, 0xcf, 0x96, 0xfc, 0xff, 0x3f, 0x4c, 0x41, 0xd1, 0x99, 0xc4, 0x47, 0x12, 0x27, 0x4a, 0x42,
|
||||
0x0e, 0x62, 0xa8, 0x3c, 0x84, 0xfb, 0x46, 0x91, 0x64, 0x5b, 0x41, 0x8e, 0x15, 0x4b, 0xb6, 0xb9,
|
||||
0xcd, 0x7a, 0x35, 0xb6, 0xb6, 0x2c, 0xed, 0x2c, 0x33, 0xbb, 0x26, 0x7e, 0x0b, 0xd7, 0x57, 0xe0,
|
||||
0xbe, 0x8b, 0xa3, 0xe0, 0x1b, 0xc0, 0x27, 0xe0, 0x7c, 0x81, 0x57, 0xee, 0x7c, 0x01, 0x1e, 0xb8,
|
||||
0x21, 0x55, 0xf4, 0xee, 0xce, 0xce, 0xce, 0x4a, 0xb2, 0x79, 0x93, 0xe6, 0xd7, 0xdd, 0xd3, 0xdd,
|
||||
0xd3, 0xfd, 0xeb, 0x5e, 0x42, 0xd7, 0x1d, 0xb9, 0x25, 0x03, 0xd6, 0xeb, 0xc9, 0x75, 0x79, 0xda,
|
||||
0x17, 0x3c, 0xe0, 0x53, 0x97, 0x47, 0xc9, 0x55, 0xd5, 0x99, 0x72, 0x33, 0x3e, 0x9f, 0x93, 0xeb,
|
||||
0x74, 0x0f, 0xb9, 0x66, 0x63, 0x05, 0x4f, 0xf0, 0x77, 0xcd, 0xdb, 0xb4, 0xbb, 0x6e, 0x1b, 0x76,
|
||||
0xd1, 0xdd, 0xe4, 0xea, 0xf4, 0x70, 0x2e, 0xec, 0x06, 0x2e, 0x58, 0x74, 0x82, 0xec, 0x4d, 0x8f,
|
||||
0x66, 0x98, 0xc7, 0x84, 0xeb, 0x2c, 0x30, 0xbf, 0xbb, 0x05, 0x84, 0x8e, 0x11, 0x9a, 0x22, 0x89,
|
||||
0xd9, 0xb3, 0xb6, 0x64, 0x70, 0x86, 0x1e, 0x22, 0xfb, 0xd3, 0xf3, 0x92, 0xd3, 0x71, 0xd9, 0x26,
|
||||
0xeb, 0x31, 0x2f, 0x28, 0x3d, 0x69, 0x8b, 0x36, 0x6b, 0xc3, 0x8d, 0xa6, 0x5e, 0x99, 0x7b, 0x65,
|
||||
0xde, 0xeb, 0xd9, 0x5e, 0x1b, 0x6e, 0x32, 0x6f, 0x6a, 0x06, 0xb6, 0x08, 0x1a, 0x5d, 0x7b, 0xcb,
|
||||
0xf5, 0xd6, 0xe1, 0x66, 0x3a, 0x4e, 0xf6, 0x64, 0x08, 0xf7, 0x53, 0xe0, 0x16, 0x7a, 0x80, 0x8c,
|
||||
0xe7, 0x54, 0x66, 0xec, 0x1e, 0x93, 0x4c, 0x6c, 0x32, 0x01, 0xb7, 0xd2, 0xfd, 0x64, 0xcc, 0xd4,
|
||||
0x32, 0xb0, 0xdb, 0xe8, 0x28, 0xd9, 0x9d, 0x62, 0xcb, 0x33, 0x0b, 0xec, 0x89, 0x90, 0xc9, 0x00,
|
||||
0x6e, 0x37, 0x5d, 0x8b, 0x8e, 0xa5, 0xcf, 0x3d, 0x0c, 0xe9, 0x0e, 0x7a, 0x94, 0x1c, 0xca, 0x92,
|
||||
0x10, 0x2c, 0xa2, 0x99, 0xc8, 0x1a, 0x5e, 0x19, 0xc8, 0xa6, 0xd3, 0x61, 0x3d, 0x1b, 0xee, 0xa4,
|
||||
0x53, 0xe4, 0xc4, 0xce, 0x32, 0xda, 0xde, 0x5d, 0x43, 0xec, 0xc5, 0x72, 0x95, 0x6a, 0x63, 0xa1,
|
||||
0x5a, 0x2e, 0xb5, 0xaa, 0x15, 0xb8, 0x9b, 0x1e, 0x26, 0x93, 0xc3, 0x64, 0xb4, 0x95, 0x7b, 0xcc,
|
||||
0x00, 0x4b, 0xbe, 0x5f, 0xf3, 0xd6, 0xf8, 0xa2, 0xdf, 0xb6, 0x03, 0x4c, 0xf2, 0xbd, 0x66, 0x66,
|
||||
0x96, 0xa2, 0xc7, 0xc5, 0xe3, 0x26, 0x93, 0xd2, 0xe5, 0x1e, 0xdc, 0x47, 0xaf, 0x25, 0xc5, 0x6d,
|
||||
0x40, 0x6d, 0xbd, 0x64, 0xfa, 0x58, 0xe7, 0x7c, 0x23, 0xf4, 0x4b, 0x8e, 0xc3, 0x43, 0x2f, 0x98,
|
||||
0x16, 0xbc, 0x57, 0xf3, 0xfc, 0x30, 0x80, 0xb3, 0xb9, 0xfc, 0x33, 0xaf, 0x3d, 0xdb, 0x6a, 0x35,
|
||||
0xd2, 0x64, 0x96, 0xcd, 0x5b, 0xfa, 0x40, 0x7d, 0x4b, 0xc5, 0x7c, 0xf4, 0x86, 0x60, 0x2d, 0x04,
|
||||
0x9b, 0x2c, 0x08, 0x7d, 0xa8, 0xd2, 0x22, 0x39, 0x90, 0x22, 0x0b, 0xcc, 0xe1, 0xa2, 0xdd, 0x0c,
|
||||
0x7d, 0x9f, 0x8b, 0xa0, 0xe4, 0x04, 0x51, 0x14, 0xd3, 0xf4, 0x3a, 0x72, 0xcc, 0x48, 0x90, 0xf2,
|
||||
0xae, 0xc2, 0x02, 0xdb, 0xed, 0xca, 0x15, 0x23, 0x95, 0x33, 0x66, 0x28, 0x68, 0x8a, 0xb9, 0x9b,
|
||||
0xac, 0xe6, 0x05, 0x4c, 0x60, 0xd2, 0xe6, 0x30, 0x6c, 0x7b, 0x9d, 0x41, 0xcd, 0x74, 0x64, 0xda,
|
||||
0xf5, 0xda, 0xca, 0x9c, 0x84, 0x73, 0x66, 0xad, 0x34, 0xb8, 0x0c, 0x4a, 0x5d, 0x26, 0x02, 0xb8,
|
||||
0xdf, 0x2c, 0x4a, 0xbc, 0xbe, 0xee, 0x3a, 0x0c, 0x23, 0x92, 0x50, 0xcf, 0x77, 0x4c, 0xf6, 0x70,
|
||||
0x30, 0xd7, 0xa7, 0xa2, 0x2a, 0x5f, 0xc2, 0x79, 0x33, 0x56, 0x03, 0xd0, 0x69, 0x9a, 0xcf, 0x3d,
|
||||
0x75, 0xbb, 0x3d, 0x2d, 0x18, 0x53, 0x17, 0x42, 0xc3, 0x8c, 0x2e, 0x8f, 0x69, 0xfd, 0x0b, 0x74,
|
||||
0x1f, 0x19, 0x35, 0x2e, 0xa8, 0x35, 0xea, 0xdc, 0xb1, 0xe3, 0x34, 0x2e, 0xd0, 0x23, 0xe4, 0xe0,
|
||||
0x50, 0x48, 0x6b, 0x37, 0xe9, 0x41, 0xb2, 0x2f, 0xdf, 0xe9, 0x66, 0xe5, 0xb7, 0x4c, 0xe7, 0xd0,
|
||||
0x82, 0x21, 0x01, 0x8b, 0x7d, 0x95, 0x6e, 0x60, 0xda, 0xfc, 0x92, 0x99, 0xe0, 0xa8, 0x50, 0xaa,
|
||||
0x3d, 0x7c, 0x41, 0x58, 0xce, 0xdd, 0x9a, 0x1e, 0x6b, 0xad, 0x07, 0xe8, 0x24, 0x99, 0x30, 0x2c,
|
||||
0xc7, 0x68, 0x8b, 0xf5, 0xfc, 0x2e, 0x16, 0x33, 0x3c, 0x48, 0x8f, 0x91, 0xc3, 0xdb, 0xa1, 0xda,
|
||||
0xc6, 0x43, 0x39, 0xcf, 0x85, 0xed, 0x05, 0x33, 0x51, 0x75, 0x36, 0x6c, 0x29, 0xe1, 0xe1, 0x9c,
|
||||
0xe7, 0x39, 0x4c, 0xeb, 0x3f, 0x62, 0xba, 0x38, 0x50, 0x82, 0xf0, 0x28, 0x3d, 0x4e, 0x8e, 0x6c,
|
||||
0x0b, 0x6b, 0x2b, 0x8f, 0x99, 0x5d, 0x84, 0x62, 0x0d, 0x26, 0x24, 0xf7, 0xec, 0xf3, 0x11, 0x5d,
|
||||
0xc1, 0x8a, 0xd9, 0x45, 0x7d, 0xa0, 0xb6, 0xf0, 0xb8, 0x59, 0x72, 0x31, 0x6f, 0xfb, 0x5d, 0x76,
|
||||
0x11, 0x7f, 0x83, 0x6d, 0xe6, 0x61, 0x99, 0xad, 0x96, 0x1a, 0xb5, 0x05, 0xb6, 0xee, 0xe2, 0x23,
|
||||
0x88, 0xb8, 0x03, 0xd6, 0x6c, 0x07, 0x2f, 0x61, 0x66, 0x2e, 0x13, 0xa9, 0x73, 0x7c, 0x35, 0x6d,
|
||||
0xe4, 0x35, 0xb3, 0xd1, 0xfa, 0xd1, 0xd9, 0x20, 0xf0, 0xb5, 0x1f, 0x1d, 0x7a, 0x3d, 0x39, 0xb9,
|
||||
0x9d, 0xe4, 0x34, 0x17, 0xd1, 0x04, 0xd0, 0xc2, 0x2e, 0xd6, 0x64, 0xe6, 0x34, 0xeb, 0x95, 0x6d,
|
||||
0x2c, 0xa7, 0x36, 0x86, 0x08, 0x9f, 0x58, 0x58, 0x93, 0x93, 0xc3, 0x20, 0xad, 0xfc, 0xa9, 0x35,
|
||||
0x54, 0x1b, 0xa9, 0x03, 0x3e, 0xb3, 0x30, 0x9a, 0xf1, 0x01, 0xa8, 0xc2, 0xba, 0x0c, 0x0b, 0xe3,
|
||||
0x73, 0x0b, 0xb3, 0x3d, 0x36, 0xa8, 0x18, 0x57, 0xeb, 0x17, 0x16, 0x66, 0xfb, 0xd0, 0x70, 0x50,
|
||||
0x5f, 0xfd, 0xa5, 0x85, 0xf5, 0x0a, 0xba, 0x30, 0x2f, 0xd4, 0x13, 0xdd, 0xaf, 0x2c, 0x2c, 0x86,
|
||||
0x89, 0xfe, 0x63, 0xad, 0xf5, 0xb5, 0x85, 0x3d, 0xae, 0xc7, 0xe2, 0x9c, 0x1d, 0xbd, 0x00, 0x7a,
|
||||
0x5b, 0x71, 0x05, 0x73, 0x02, 0x2e, 0xb6, 0xe0, 0x1b, 0x8b, 0x9e, 0x24, 0x47, 0xb7, 0x17, 0xd0,
|
||||
0x96, 0xbe, 0xcd, 0x3b, 0x99, 0x0a, 0xaa, 0xc7, 0xe5, 0x61, 0x10, 0x4d, 0xc6, 0xef, 0x2c, 0x7c,
|
||||
0x8a, 0x13, 0x3b, 0x0b, 0x69, 0x8b, 0xdf, 0x5b, 0xf4, 0x44, 0x56, 0xa8, 0x5a, 0xb8, 0xdc, 0x75,
|
||||
0x71, 0x6c, 0x47, 0x94, 0xa9, 0x8c, 0xfe, 0x60, 0xd1, 0xd3, 0xe4, 0xd4, 0x7f, 0xca, 0x69, 0xbb,
|
||||
0x3f, 0x5a, 0x48, 0x78, 0xd9, 0x8a, 0xc0, 0x82, 0x79, 0x3f, 0xe2, 0x15, 0x09, 0x3f, 0xe5, 0x92,
|
||||
0x91, 0x01, 0x5a, 0xf3, 0x72, 0xb4, 0x76, 0xec, 0x19, 0x5c, 0x2e, 0xce, 0xc0, 0x2f, 0x05, 0x33,
|
||||
0xfa, 0xa8, 0x21, 0x42, 0xe1, 0x74, 0x10, 0x6a, 0x89, 0x10, 0x47, 0x07, 0xe6, 0x3c, 0x94, 0xf0,
|
||||
0x6b, 0xc1, 0x8c, 0x7e, 0xb8, 0x90, 0xbe, 0xeb, 0xb7, 0x02, 0xb2, 0x80, 0x26, 0xc7, 0x64, 0x80,
|
||||
0xa6, 0x93, 0xf2, 0xf7, 0x02, 0xb6, 0x70, 0xc6, 0x23, 0x65, 0xd5, 0xc1, 0x4b, 0xb6, 0x93, 0x18,
|
||||
0x29, 0x77, 0x6c, 0x0f, 0x87, 0xc7, 0x1f, 0x05, 0xb3, 0xe4, 0xca, 0x1d, 0xe6, 0x6c, 0x4c, 0x0b,
|
||||
0x4c, 0x4a, 0x5b, 0x76, 0x5c, 0x1f, 0xfe, 0x2c, 0x60, 0x13, 0x16, 0xb7, 0x41, 0xb5, 0x1b, 0x7f,
|
||||
0x15, 0x90, 0x70, 0x4c, 0x22, 0x6e, 0xe0, 0x3a, 0x83, 0xeb, 0x96, 0xba, 0xb2, 0xee, 0x7a, 0x1b,
|
||||
0xf0, 0x77, 0x01, 0x97, 0x8c, 0xe3, 0x3b, 0xca, 0x68, 0x7b, 0xff, 0x14, 0xe8, 0xa9, 0xac, 0x6d,
|
||||
0x97, 0x9a, 0xb8, 0xb4, 0xe1, 0xec, 0xc4, 0x62, 0x0e, 0xa5, 0xef, 0x3a, 0x2e, 0x0f, 0x65, 0x34,
|
||||
0x47, 0x37, 0xdd, 0x60, 0x0b, 0xae, 0x14, 0xcc, 0xe7, 0xa8, 0x34, 0x94, 0xd5, 0x39, 0xd7, 0x11,
|
||||
0xbc, 0x75, 0x11, 0xdf, 0xeb, 0xd2, 0x88, 0x59, 0x9b, 0x83, 0x02, 0xfa, 0xd2, 0xa7, 0x46, 0xcc,
|
||||
0xde, 0x88, 0xa7, 0x49, 0xa9, 0x79, 0x1e, 0x9e, 0x1e, 0x31, 0x7b, 0x23, 0x3d, 0xd6, 0x5a, 0xcf,
|
||||
0x8c, 0xe0, 0xca, 0x98, 0xe3, 0x51, 0xdf, 0x57, 0x19, 0xaa, 0x23, 0x55, 0xc1, 0xb3, 0x23, 0x66,
|
||||
0x7d, 0x0e, 0xe0, 0xda, 0xce, 0x73, 0x23, 0x53, 0x3f, 0x5b, 0xe4, 0xff, 0xd5, 0xe6, 0x7c, 0xb6,
|
||||
0xdf, 0xc6, 0xbf, 0x57, 0xca, 0x82, 0x45, 0x53, 0x61, 0x34, 0x77, 0x98, 0x3c, 0x35, 0x8c, 0xd1,
|
||||
0xbd, 0xb1, 0xcb, 0xc9, 0x61, 0x05, 0x99, 0x4a, 0xf0, 0x2d, 0x18, 0x57, 0x94, 0xa8, 0xf4, 0x23,
|
||||
0x1e, 0x68, 0x86, 0xab, 0xd2, 0x11, 0xee, 0x2a, 0xae, 0x57, 0x13, 0x6a, 0xc7, 0x35, 0xd0, 0x45,
|
||||
0x4f, 0x66, 0xf8, 0x3e, 0x45, 0xe9, 0xe6, 0x45, 0x29, 0x2f, 0xc3, 0x7e, 0x35, 0x16, 0x06, 0x4d,
|
||||
0xfb, 0xc9, 0xd8, 0x5d, 0x13, 0x4c, 0x76, 0x60, 0x52, 0x51, 0xf7, 0x50, 0x0f, 0x16, 0xfd, 0x16,
|
||||
0xaf, 0x44, 0xde, 0x1f, 0x9c, 0xba, 0x62, 0x11, 0xc0, 0xcc, 0x44, 0xed, 0xa1, 0x3b, 0x51, 0x75,
|
||||
0x4f, 0x5c, 0xb3, 0x8d, 0xb8, 0x25, 0x13, 0x2a, 0xff, 0x68, 0x5c, 0xd1, 0xa6, 0x81, 0xa8, 0xe4,
|
||||
0x7d, 0x3c, 0xae, 0xda, 0x20, 0x86, 0x12, 0x4b, 0xcb, 0xac, 0xeb, 0xf0, 0x1e, 0x83, 0x77, 0x8a,
|
||||
0x26, 0xd6, 0x8c, 0x77, 0xe8, 0x14, 0x7b, 0xb7, 0x68, 0x5e, 0x96, 0xe8, 0xcd, 0xb2, 0x6e, 0x97,
|
||||
0xc3, 0x7b, 0x39, 0x24, 0xd1, 0x4a, 0x90, 0xf7, 0x8b, 0xaa, 0x89, 0x0d, 0x1d, 0xfc, 0x12, 0xf0,
|
||||
0x58, 0xbc, 0xd9, 0xa9, 0x26, 0xfe, 0x20, 0x27, 0x94, 0xa8, 0x0f, 0x08, 0x7d, 0x58, 0x9c, 0xba,
|
||||
0x5c, 0x20, 0x04, 0xe3, 0x6f, 0xf1, 0xb8, 0x3a, 0x74, 0x2f, 0xab, 0xff, 0x09, 0x4b, 0x95, 0x9c,
|
||||
0x0d, 0x78, 0xde, 0xd2, 0x0d, 0xd6, 0x8f, 0xe9, 0x24, 0xbc, 0x90, 0x31, 0x96, 0x92, 0x89, 0x38,
|
||||
0x0d, 0x1f, 0xf4, 0xc5, 0x6c, 0xa8, 0xe4, 0x80, 0xe4, 0x53, 0xe8, 0x25, 0xcb, 0x74, 0x55, 0x51,
|
||||
0x48, 0xb8, 0x1a, 0x79, 0x1d, 0xf3, 0x48, 0xb4, 0x99, 0xc3, 0xcb, 0x96, 0xa2, 0x81, 0x58, 0x48,
|
||||
0xbd, 0xc8, 0x80, 0xd4, 0x2b, 0x16, 0xbd, 0x21, 0x9e, 0xa1, 0x3b, 0x49, 0x69, 0x7f, 0x5f, 0xcd,
|
||||
0x98, 0x3b, 0x17, 0x53, 0xfc, 0x2d, 0x14, 0xfa, 0xb8, 0x47, 0xfa, 0xf1, 0xd4, 0x7b, 0x2d, 0x9d,
|
||||
0xa8, 0xb1, 0xd5, 0x48, 0xb4, 0x39, 0x9f, 0xaf, 0x28, 0x78, 0x3d, 0x17, 0x83, 0x21, 0x62, 0x14,
|
||||
0x36, 0xbc, 0x31, 0x20, 0x54, 0xe7, 0x76, 0x5b, 0x79, 0xa6, 0xe4, 0xe1, 0xcd, 0x74, 0xf6, 0xec,
|
||||
0x20, 0xa4, 0x23, 0x78, 0x6b, 0xc0, 0x62, 0x8e, 0x81, 0x93, 0xd9, 0xfa, 0xb6, 0x75, 0xf6, 0x7f,
|
||||
0xb3, 0xd6, 0x25, 0x6b, 0xd7, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x05, 0xab, 0xaf, 0x14, 0xda,
|
||||
0x0e, 0x00, 0x00,
|
||||
}
|
||||
188
vendor/github.com/Philipp15b/go-steam/economy/inventory/inventory.go
generated
vendored
Normal file
188
vendor/github.com/Philipp15b/go-steam/economy/inventory/inventory.go
generated
vendored
Normal file
@@ -0,0 +1,188 @@
|
||||
/*
|
||||
Includes inventory types as used in the trade package
|
||||
*/
|
||||
package inventory
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/Philipp15b/go-steam/jsont"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type GenericInventory map[uint32]map[uint64]*Inventory
|
||||
|
||||
func NewGenericInventory() GenericInventory {
|
||||
iMap := make(map[uint32]map[uint64]*Inventory)
|
||||
return GenericInventory(iMap)
|
||||
}
|
||||
|
||||
// Get inventory for specified AppId and ContextId
|
||||
func (i *GenericInventory) Get(appId uint32, contextId uint64) (*Inventory, error) {
|
||||
iMap := (map[uint32]map[uint64]*Inventory)(*i)
|
||||
iMap2, ok := iMap[appId]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("inventory for specified appId not found")
|
||||
}
|
||||
inv, ok := iMap2[contextId]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("inventory for specified contextId not found")
|
||||
}
|
||||
return inv, nil
|
||||
}
|
||||
|
||||
func (i *GenericInventory) Add(appId uint32, contextId uint64, inv *Inventory) {
|
||||
iMap := (map[uint32]map[uint64]*Inventory)(*i)
|
||||
iMap2, ok := iMap[appId]
|
||||
if !ok {
|
||||
iMap2 = make(map[uint64]*Inventory)
|
||||
iMap[appId] = iMap2
|
||||
}
|
||||
iMap2[contextId] = inv
|
||||
}
|
||||
|
||||
type Inventory struct {
|
||||
Items Items `json:"rgInventory"`
|
||||
Currencies Currencies `json:"rgCurrency"`
|
||||
Descriptions Descriptions `json:"rgDescriptions"`
|
||||
AppInfo *AppInfo `json:"rgAppInfo"`
|
||||
}
|
||||
|
||||
// Items key is an AssetId
|
||||
type Items map[string]*Item
|
||||
|
||||
func (i *Items) ToMap() map[string]*Item {
|
||||
return (map[string]*Item)(*i)
|
||||
}
|
||||
|
||||
func (i *Items) Get(assetId uint64) (*Item, error) {
|
||||
iMap := (map[string]*Item)(*i)
|
||||
if item, ok := iMap[strconv.FormatUint(assetId, 10)]; ok {
|
||||
return item, nil
|
||||
}
|
||||
return nil, fmt.Errorf("item not found")
|
||||
}
|
||||
|
||||
func (i *Items) UnmarshalJSON(data []byte) error {
|
||||
if bytes.Equal(data, []byte("[]")) {
|
||||
return nil
|
||||
}
|
||||
return json.Unmarshal(data, (*map[string]*Item)(i))
|
||||
}
|
||||
|
||||
type Currencies map[string]*Currency
|
||||
|
||||
func (c *Currencies) ToMap() map[string]*Currency {
|
||||
return (map[string]*Currency)(*c)
|
||||
}
|
||||
|
||||
func (c *Currencies) UnmarshalJSON(data []byte) error {
|
||||
if bytes.Equal(data, []byte("[]")) {
|
||||
return nil
|
||||
}
|
||||
return json.Unmarshal(data, (*map[string]*Currency)(c))
|
||||
}
|
||||
|
||||
// Descriptions key format is %d_%d, first %d is ClassId, second is InstanceId
|
||||
type Descriptions map[string]*Description
|
||||
|
||||
func (d *Descriptions) ToMap() map[string]*Description {
|
||||
return (map[string]*Description)(*d)
|
||||
}
|
||||
|
||||
func (d *Descriptions) Get(classId uint64, instanceId uint64) (*Description, error) {
|
||||
dMap := (map[string]*Description)(*d)
|
||||
descId := fmt.Sprintf("%v_%v", classId, instanceId)
|
||||
if desc, ok := dMap[descId]; ok {
|
||||
return desc, nil
|
||||
}
|
||||
return nil, fmt.Errorf("description not found")
|
||||
}
|
||||
|
||||
func (d *Descriptions) UnmarshalJSON(data []byte) error {
|
||||
if bytes.Equal(data, []byte("[]")) {
|
||||
return nil
|
||||
}
|
||||
return json.Unmarshal(data, (*map[string]*Description)(d))
|
||||
}
|
||||
|
||||
type Item struct {
|
||||
Id uint64 `json:",string"`
|
||||
ClassId uint64 `json:",string"`
|
||||
InstanceId uint64 `json:",string"`
|
||||
Amount uint64 `json:",string"`
|
||||
Pos uint32
|
||||
}
|
||||
|
||||
type Currency struct {
|
||||
Id uint64 `json:",string"`
|
||||
ClassId uint64 `json:",string"`
|
||||
IsCurrency bool `json:"is_currency"`
|
||||
Pos uint32
|
||||
}
|
||||
|
||||
type Description struct {
|
||||
AppId uint32 `json:",string"`
|
||||
ClassId uint64 `json:",string"`
|
||||
InstanceId uint64 `json:",string"`
|
||||
|
||||
IconUrl string `json:"icon_url"`
|
||||
IconUrlLarge string `json:"icon_url_large"`
|
||||
IconDragUrl string `json:"icon_drag_url"`
|
||||
|
||||
Name string
|
||||
MarketName string `json:"market_name"`
|
||||
MarketHashName string `json:"market_hash_name"`
|
||||
|
||||
// Colors in hex, for example `B2B2B2`
|
||||
NameColor string `json:"name_color"`
|
||||
BackgroundColor string `json:"background_color"`
|
||||
|
||||
Type string
|
||||
|
||||
Tradable jsont.UintBool
|
||||
Marketable jsont.UintBool
|
||||
Commodity jsont.UintBool
|
||||
MarketTradableRestriction uint32 `json:"market_tradable_restriction,string"`
|
||||
|
||||
Descriptions DescriptionLines
|
||||
Actions []*Action
|
||||
// Application-specific data, like "def_index" and "quality" for TF2
|
||||
AppData map[string]string
|
||||
Tags []*Tag
|
||||
}
|
||||
|
||||
type DescriptionLines []*DescriptionLine
|
||||
|
||||
func (d *DescriptionLines) UnmarshalJSON(data []byte) error {
|
||||
if bytes.Equal(data, []byte(`""`)) {
|
||||
return nil
|
||||
}
|
||||
return json.Unmarshal(data, (*[]*DescriptionLine)(d))
|
||||
}
|
||||
|
||||
type DescriptionLine struct {
|
||||
Value string
|
||||
Type *string // Is `html` for HTML descriptions
|
||||
Color *string
|
||||
}
|
||||
|
||||
type Action struct {
|
||||
Name string
|
||||
Link string
|
||||
}
|
||||
|
||||
type AppInfo struct {
|
||||
AppId uint32
|
||||
Name string
|
||||
Icon string
|
||||
Link string
|
||||
}
|
||||
|
||||
type Tag struct {
|
||||
InternalName string `json:internal_name`
|
||||
Name string
|
||||
Category string
|
||||
CategoryName string `json:category_name`
|
||||
}
|
||||
79
vendor/github.com/Philipp15b/go-steam/economy/inventory/inventory_apps.go
generated
vendored
Normal file
79
vendor/github.com/Philipp15b/go-steam/economy/inventory/inventory_apps.go
generated
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
package inventory
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/Philipp15b/go-steam/steamid"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type InventoryApps map[string]*InventoryApp
|
||||
|
||||
func (i *InventoryApps) Get(appId uint32) (*InventoryApp, error) {
|
||||
iMap := (map[string]*InventoryApp)(*i)
|
||||
if inventoryApp, ok := iMap[strconv.FormatUint(uint64(appId), 10)]; ok {
|
||||
return inventoryApp, nil
|
||||
}
|
||||
return nil, fmt.Errorf("inventory app not found")
|
||||
}
|
||||
|
||||
func (i *InventoryApps) ToMap() map[string]*InventoryApp {
|
||||
return (map[string]*InventoryApp)(*i)
|
||||
}
|
||||
|
||||
type InventoryApp struct {
|
||||
AppId uint32
|
||||
Name string
|
||||
Icon string
|
||||
Link string
|
||||
AssetCount uint32 `json:"asset_count"`
|
||||
InventoryLogo string `json:"inventory_logo"`
|
||||
TradePermissions string `json:"trade_permissions"`
|
||||
Contexts Contexts `json:"rgContexts"`
|
||||
}
|
||||
|
||||
type Contexts map[string]*Context
|
||||
|
||||
func (c *Contexts) Get(contextId uint64) (*Context, error) {
|
||||
cMap := (map[string]*Context)(*c)
|
||||
if context, ok := cMap[strconv.FormatUint(contextId, 10)]; ok {
|
||||
return context, nil
|
||||
}
|
||||
return nil, fmt.Errorf("context not found")
|
||||
}
|
||||
|
||||
func (c *Contexts) ToMap() map[string]*Context {
|
||||
return (map[string]*Context)(*c)
|
||||
}
|
||||
|
||||
type Context struct {
|
||||
ContextId uint64 `json:"id,string"`
|
||||
AssetCount uint32 `json:"asset_count"`
|
||||
Name string
|
||||
}
|
||||
|
||||
func GetInventoryApps(client *http.Client, steamId steamid.SteamId) (InventoryApps, error) {
|
||||
resp, err := http.Get("http://steamcommunity.com/profiles/" + steamId.ToString() + "/inventory/")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
respBody, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
reg := regexp.MustCompile("var g_rgAppContextData = (.*?);")
|
||||
inventoryAppsMatches := reg.FindSubmatch(respBody)
|
||||
if inventoryAppsMatches == nil {
|
||||
return nil, fmt.Errorf("profile inventory not found in steam response")
|
||||
}
|
||||
var inventoryApps InventoryApps
|
||||
if err = json.Unmarshal(inventoryAppsMatches[1], &inventoryApps); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return inventoryApps, nil
|
||||
}
|
||||
28
vendor/github.com/Philipp15b/go-steam/economy/inventory/own.go
generated
vendored
Normal file
28
vendor/github.com/Philipp15b/go-steam/economy/inventory/own.go
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
package inventory
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func GetPartialOwnInventory(client *http.Client, contextId uint64, appId uint32, start *uint) (*PartialInventory, error) {
|
||||
// TODO: the "trading" parameter can be left off to return non-tradable items too
|
||||
url := fmt.Sprintf("http://steamcommunity.com/my/inventory/json/%d/%d?trading=1", appId, contextId)
|
||||
if start != nil {
|
||||
url += "&start=" + strconv.FormatUint(uint64(*start), 10)
|
||||
}
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return DoInventoryRequest(client, req)
|
||||
}
|
||||
|
||||
func GetOwnInventory(client *http.Client, contextId uint64, appId uint32) (*Inventory, error) {
|
||||
return GetFullInventory(func() (*PartialInventory, error) {
|
||||
return GetPartialOwnInventory(client, contextId, appId, nil)
|
||||
}, func(start uint) (*PartialInventory, error) {
|
||||
return GetPartialOwnInventory(client, contextId, appId, &start)
|
||||
})
|
||||
}
|
||||
91
vendor/github.com/Philipp15b/go-steam/economy/inventory/partial.go
generated
vendored
Normal file
91
vendor/github.com/Philipp15b/go-steam/economy/inventory/partial.go
generated
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
package inventory
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// A partial inventory as sent by the Steam API.
|
||||
type PartialInventory struct {
|
||||
Success bool
|
||||
Error string
|
||||
Inventory
|
||||
More bool
|
||||
MoreStart MoreStart `json:"more_start"`
|
||||
}
|
||||
|
||||
type MoreStart uint
|
||||
|
||||
func (m *MoreStart) UnmarshalJSON(data []byte) error {
|
||||
if bytes.Equal(data, []byte("false")) {
|
||||
return nil
|
||||
}
|
||||
return json.Unmarshal(data, (*uint)(m))
|
||||
}
|
||||
|
||||
func DoInventoryRequest(client *http.Client, req *http.Request) (*PartialInventory, error) {
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
inv := new(PartialInventory)
|
||||
err = json.NewDecoder(resp.Body).Decode(inv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return inv, nil
|
||||
}
|
||||
|
||||
func GetFullInventory(getFirst func() (*PartialInventory, error), getNext func(start uint) (*PartialInventory, error)) (*Inventory, error) {
|
||||
first, err := getFirst()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !first.Success {
|
||||
return nil, errors.New("GetFullInventory API call failed: " + first.Error)
|
||||
}
|
||||
|
||||
result := &first.Inventory
|
||||
var next *PartialInventory
|
||||
for latest := first; latest.More; latest = next {
|
||||
next, err := getNext(uint(latest.MoreStart))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !next.Success {
|
||||
return nil, errors.New("GetFullInventory API call failed: " + next.Error)
|
||||
}
|
||||
|
||||
result = Merge(result, &next.Inventory)
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// Merges the given Inventory into a single Inventory.
|
||||
// The given slice must have at least one element. The first element of the slice is used
|
||||
// and modified.
|
||||
func Merge(p ...*Inventory) *Inventory {
|
||||
inv := p[0]
|
||||
for idx, i := range p {
|
||||
if idx == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
for key, value := range i.Items {
|
||||
inv.Items[key] = value
|
||||
}
|
||||
for key, value := range i.Descriptions {
|
||||
inv.Descriptions[key] = value
|
||||
}
|
||||
for key, value := range i.Currencies {
|
||||
inv.Currencies[key] = value
|
||||
}
|
||||
}
|
||||
|
||||
return inv
|
||||
}
|
||||
79
vendor/github.com/Philipp15b/go-steam/gamecoordinator.go
generated
vendored
Normal file
79
vendor/github.com/Philipp15b/go-steam/gamecoordinator.go
generated
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
package steam
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
. "github.com/Philipp15b/go-steam/protocol"
|
||||
. "github.com/Philipp15b/go-steam/protocol/gamecoordinator"
|
||||
. "github.com/Philipp15b/go-steam/protocol/protobuf"
|
||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
"github.com/golang/protobuf/proto"
|
||||
)
|
||||
|
||||
type GameCoordinator struct {
|
||||
client *Client
|
||||
handlers []GCPacketHandler
|
||||
}
|
||||
|
||||
func newGC(client *Client) *GameCoordinator {
|
||||
return &GameCoordinator{
|
||||
client: client,
|
||||
handlers: make([]GCPacketHandler, 0),
|
||||
}
|
||||
}
|
||||
|
||||
type GCPacketHandler interface {
|
||||
HandleGCPacket(*GCPacket)
|
||||
}
|
||||
|
||||
func (g *GameCoordinator) RegisterPacketHandler(handler GCPacketHandler) {
|
||||
g.handlers = append(g.handlers, handler)
|
||||
}
|
||||
|
||||
func (g *GameCoordinator) HandlePacket(packet *Packet) {
|
||||
if packet.EMsg != EMsg_ClientFromGC {
|
||||
return
|
||||
}
|
||||
|
||||
msg := new(CMsgGCClient)
|
||||
packet.ReadProtoMsg(msg)
|
||||
|
||||
p, err := NewGCPacket(msg)
|
||||
if err != nil {
|
||||
g.client.Errorf("Error reading GC message: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
for _, handler := range g.handlers {
|
||||
handler.HandleGCPacket(p)
|
||||
}
|
||||
}
|
||||
|
||||
func (g *GameCoordinator) Write(msg IGCMsg) {
|
||||
buf := new(bytes.Buffer)
|
||||
msg.Serialize(buf)
|
||||
|
||||
msgType := msg.GetMsgType()
|
||||
if msg.IsProto() {
|
||||
msgType = msgType | 0x80000000 // mask with protoMask
|
||||
}
|
||||
|
||||
g.client.Write(NewClientMsgProtobuf(EMsg_ClientToGC, &CMsgGCClient{
|
||||
Msgtype: proto.Uint32(msgType),
|
||||
Appid: proto.Uint32(msg.GetAppId()),
|
||||
Payload: buf.Bytes(),
|
||||
}))
|
||||
}
|
||||
|
||||
// Sets you in the given games. Specify none to quit all games.
|
||||
func (g *GameCoordinator) SetGamesPlayed(appIds ...uint64) {
|
||||
games := make([]*CMsgClientGamesPlayed_GamePlayed, 0)
|
||||
for _, appId := range appIds {
|
||||
games = append(games, &CMsgClientGamesPlayed_GamePlayed{
|
||||
GameId: proto.Uint64(appId),
|
||||
})
|
||||
}
|
||||
|
||||
g.client.Write(NewClientMsgProtobuf(EMsg_ClientGamesPlayed, &CMsgClientGamesPlayed{
|
||||
GamesPlayed: games,
|
||||
}))
|
||||
}
|
||||
295
vendor/github.com/Philipp15b/go-steam/generator/generator.go
generated
vendored
Normal file
295
vendor/github.com/Philipp15b/go-steam/generator/generator.go
generated
vendored
Normal file
@@ -0,0 +1,295 @@
|
||||
/*
|
||||
This program generates the protobuf and SteamLanguage files from the SteamKit data.
|
||||
*/
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"go/ast"
|
||||
"go/parser"
|
||||
"go/token"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var printCommands = false
|
||||
|
||||
func main() {
|
||||
args := strings.Join(os.Args[1:], " ")
|
||||
|
||||
found := false
|
||||
if strings.Contains(args, "clean") {
|
||||
clean()
|
||||
found = true
|
||||
}
|
||||
if strings.Contains(args, "steamlang") {
|
||||
buildSteamLanguage()
|
||||
found = true
|
||||
}
|
||||
if strings.Contains(args, "proto") {
|
||||
buildProto()
|
||||
found = true
|
||||
}
|
||||
|
||||
if !found {
|
||||
os.Stderr.WriteString("Invalid target!\nAvailable targets: clean, proto, steamlang\n")
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func clean() {
|
||||
print("# Cleaning")
|
||||
cleanGlob("../protocol/**/*.pb.go")
|
||||
cleanGlob("../tf2/protocol/**/*.pb.go")
|
||||
cleanGlob("../dota/protocol/**/*.pb.go")
|
||||
|
||||
os.Remove("../protocol/steamlang/enums.go")
|
||||
os.Remove("../protocol/steamlang/messages.go")
|
||||
}
|
||||
|
||||
func cleanGlob(pattern string) {
|
||||
protos, _ := filepath.Glob(pattern)
|
||||
for _, proto := range protos {
|
||||
err := os.Remove(proto)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func buildSteamLanguage() {
|
||||
print("# Building Steam Language")
|
||||
exePath := "./GoSteamLanguageGenerator/bin/Debug/GoSteamLanguageGenerator.exe"
|
||||
|
||||
if runtime.GOOS != "windows" {
|
||||
execute("mono", exePath, "./SteamKit", "../protocol/steamlang")
|
||||
} else {
|
||||
execute(exePath, "./SteamKit", "../protocol/steamlang")
|
||||
}
|
||||
execute("gofmt", "-w", "../protocol/steamlang/enums.go", "../protocol/steamlang/messages.go")
|
||||
}
|
||||
|
||||
func buildProto() {
|
||||
print("# Building Protobufs")
|
||||
|
||||
buildProtoMap("steamclient", clientProtoFiles, "../protocol/protobuf")
|
||||
buildProtoMap("tf", tf2ProtoFiles, "../tf2/protocol/protobuf")
|
||||
buildProtoMap("dota", dotaProtoFiles, "../dota/protocol/protobuf")
|
||||
}
|
||||
|
||||
func buildProtoMap(srcSubdir string, files map[string]string, outDir string) {
|
||||
os.MkdirAll(outDir, os.ModePerm)
|
||||
for proto, out := range files {
|
||||
full := filepath.Join(outDir, out)
|
||||
compileProto("SteamKit/Resources/Protobufs", srcSubdir, proto, full)
|
||||
fixProto(full)
|
||||
}
|
||||
}
|
||||
|
||||
// Maps the proto files to their target files.
|
||||
// See `SteamKit/Resources/Protobufs/steamclient/generate-base.bat` for reference.
|
||||
var clientProtoFiles = map[string]string{
|
||||
"steammessages_base.proto": "base.pb.go",
|
||||
"encrypted_app_ticket.proto": "app_ticket.pb.go",
|
||||
|
||||
"steammessages_clientserver.proto": "client_server.pb.go",
|
||||
"steammessages_clientserver_2.proto": "client_server_2.pb.go",
|
||||
|
||||
"content_manifest.proto": "content_manifest.pb.go",
|
||||
|
||||
"steammessages_unified_base.steamclient.proto": "unified/base.pb.go",
|
||||
"steammessages_cloud.steamclient.proto": "unified/cloud.pb.go",
|
||||
"steammessages_credentials.steamclient.proto": "unified/credentials.pb.go",
|
||||
"steammessages_deviceauth.steamclient.proto": "unified/deviceauth.pb.go",
|
||||
"steammessages_gamenotifications.steamclient.proto": "unified/gamenotifications.pb.go",
|
||||
"steammessages_offline.steamclient.proto": "unified/offline.pb.go",
|
||||
"steammessages_parental.steamclient.proto": "unified/parental.pb.go",
|
||||
"steammessages_partnerapps.steamclient.proto": "unified/partnerapps.pb.go",
|
||||
"steammessages_player.steamclient.proto": "unified/player.pb.go",
|
||||
"steammessages_publishedfile.steamclient.proto": "unified/publishedfile.pb.go",
|
||||
}
|
||||
|
||||
var tf2ProtoFiles = map[string]string{
|
||||
"base_gcmessages.proto": "base.pb.go",
|
||||
"econ_gcmessages.proto": "econ.pb.go",
|
||||
"gcsdk_gcmessages.proto": "gcsdk.pb.go",
|
||||
"tf_gcmessages.proto": "tf.pb.go",
|
||||
"gcsystemmsgs.proto": "system.pb.go",
|
||||
}
|
||||
|
||||
var dotaProtoFiles = map[string]string{
|
||||
"base_gcmessages.proto": "base.pb.go",
|
||||
"econ_gcmessages.proto": "econ.pb.go",
|
||||
"gcsdk_gcmessages.proto": "gcsdk.pb.go",
|
||||
"dota_gcmessages_common.proto": "dota_common.pb.go",
|
||||
"dota_gcmessages_client.proto": "dota_client.pb.go",
|
||||
"dota_gcmessages_client_fantasy.proto": "dota_client_fantasy.pb.go",
|
||||
"gcsystemmsgs.proto": "system.pb.go",
|
||||
}
|
||||
|
||||
func compileProto(srcBase, srcSubdir, proto, target string) {
|
||||
outDir, _ := filepath.Split(target)
|
||||
err := os.MkdirAll(outDir, os.ModePerm)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
execute("protoc", "--go_out="+outDir, "-I="+srcBase+"/"+srcSubdir, "-I="+srcBase, filepath.Join(srcBase, srcSubdir, proto))
|
||||
out := strings.Replace(filepath.Join(outDir, proto), ".proto", ".pb.go", 1)
|
||||
err = forceRename(out, target)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func forceRename(from, to string) error {
|
||||
if from != to {
|
||||
os.Remove(to)
|
||||
}
|
||||
return os.Rename(from, to)
|
||||
}
|
||||
|
||||
var pkgRegex = regexp.MustCompile(`(package \w+)`)
|
||||
var pkgCommentRegex = regexp.MustCompile(`(?s)(\/\*.*?\*\/\n)package`)
|
||||
var unusedImportCommentRegex = regexp.MustCompile("// discarding unused import .*\n")
|
||||
var fileDescriptorVarRegex = regexp.MustCompile(`fileDescriptor\d+`)
|
||||
|
||||
func fixProto(path string) {
|
||||
// goprotobuf is really bad at dependencies, so we must fix them manually...
|
||||
// It tries to load each dependency of a file as a seperate package (but in a very, very wrong way).
|
||||
// Because we want some files in the same package, we'll remove those imports to local files.
|
||||
|
||||
file, err := ioutil.ReadFile(path)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fset := token.NewFileSet()
|
||||
f, err := parser.ParseFile(fset, path, file, parser.ImportsOnly)
|
||||
if err != nil {
|
||||
panic("Error parsing " + path + ": " + err.Error())
|
||||
}
|
||||
|
||||
importsToRemove := make([]*ast.ImportSpec, 0)
|
||||
for _, i := range f.Imports {
|
||||
// We remove all local imports
|
||||
if i.Path.Value == "\".\"" {
|
||||
importsToRemove = append(importsToRemove, i)
|
||||
}
|
||||
}
|
||||
|
||||
for _, itr := range importsToRemove {
|
||||
// remove the package name from all types
|
||||
file = bytes.Replace(file, []byte(itr.Name.Name+"."), []byte{}, -1)
|
||||
// and remove the import itself
|
||||
file = bytes.Replace(file, []byte(fmt.Sprintf("import %v %v\n", itr.Name.Name, itr.Path.Value)), []byte{}, -1)
|
||||
}
|
||||
|
||||
// remove the package comment because it just includes a list of all messages and
|
||||
// collides not only with the other compiled protobuf files, but also our own documentation.
|
||||
file = cutAllSubmatch(pkgCommentRegex, file, 1)
|
||||
|
||||
// remove warnings
|
||||
file = unusedImportCommentRegex.ReplaceAllLiteral(file, []byte{})
|
||||
|
||||
// fix the package name
|
||||
file = pkgRegex.ReplaceAll(file, []byte("package "+inferPackageName(path)))
|
||||
|
||||
// fix the google dependency;
|
||||
// we just reuse the one from protoc-gen-go
|
||||
file = bytes.Replace(file, []byte("google/protobuf"), []byte("github.com/golang/protobuf/protoc-gen-go/descriptor"), -1)
|
||||
|
||||
// we need to prefix local variables created by protoc-gen-go so that they don't clash with others in the same package
|
||||
filename := strings.Split(filepath.Base(path), ".")[0]
|
||||
file = fileDescriptorVarRegex.ReplaceAllFunc(file, func(match []byte) []byte {
|
||||
return []byte(filename + "_" + string(match))
|
||||
})
|
||||
|
||||
err = ioutil.WriteFile(path, file, os.ModePerm)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func inferPackageName(path string) string {
|
||||
pieces := strings.Split(path, string(filepath.Separator))
|
||||
return pieces[len(pieces)-2]
|
||||
}
|
||||
|
||||
func cutAllSubmatch(r *regexp.Regexp, b []byte, n int) []byte {
|
||||
i := r.FindSubmatchIndex(b)
|
||||
return bytesCut(b, i[2*n], i[2*n+1])
|
||||
}
|
||||
|
||||
// Removes the given section from the byte array
|
||||
func bytesCut(b []byte, from, to int) []byte {
|
||||
buf := new(bytes.Buffer)
|
||||
buf.Write(b[:from])
|
||||
buf.Write(b[to:])
|
||||
return buf.Bytes()
|
||||
}
|
||||
|
||||
func print(text string) { os.Stdout.WriteString(text + "\n") }
|
||||
|
||||
func printerr(text string) { os.Stderr.WriteString(text + "\n") }
|
||||
|
||||
// This writer appends a "> " after every newline so that the outpout appears quoted.
|
||||
type QuotedWriter struct {
|
||||
w io.Writer
|
||||
started bool
|
||||
}
|
||||
|
||||
func NewQuotedWriter(w io.Writer) *QuotedWriter {
|
||||
return &QuotedWriter{w, false}
|
||||
}
|
||||
|
||||
func (w *QuotedWriter) Write(p []byte) (n int, err error) {
|
||||
if !w.started {
|
||||
_, err = w.w.Write([]byte("> "))
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
w.started = true
|
||||
}
|
||||
|
||||
for i, c := range p {
|
||||
if c == '\n' {
|
||||
nw, err := w.w.Write(p[n : i+1])
|
||||
n += nw
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
|
||||
_, err = w.w.Write([]byte("> "))
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
}
|
||||
}
|
||||
if n != len(p) {
|
||||
nw, err := w.w.Write(p[n:len(p)])
|
||||
n += nw
|
||||
return n, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func execute(command string, args ...string) {
|
||||
if printCommands {
|
||||
print(command + " " + strings.Join(args, " "))
|
||||
}
|
||||
cmd := exec.Command(command, args...)
|
||||
cmd.Stdout = NewQuotedWriter(os.Stdout)
|
||||
cmd.Stderr = NewQuotedWriter(os.Stderr)
|
||||
err := cmd.Run()
|
||||
if err != nil {
|
||||
printerr(err.Error())
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
210
vendor/github.com/Philipp15b/go-steam/gsbot/gsbot.go
generated
vendored
Normal file
210
vendor/github.com/Philipp15b/go-steam/gsbot/gsbot.go
generated
vendored
Normal file
@@ -0,0 +1,210 @@
|
||||
// The GsBot package contains some useful utilites for working with the
|
||||
// steam package. It implements authentication with sentries, server lists and
|
||||
// logging messages and events.
|
||||
//
|
||||
// Every module is optional and requires an instance of the GsBot struct.
|
||||
// Should a module have a `HandlePacket` method, you must register it with the
|
||||
// steam.Client with `RegisterPacketHandler`. Any module with a `HandleEvent`
|
||||
// method must be integrated into your event loop and should be called for each
|
||||
// event you receive.
|
||||
package gsbot
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"math/rand"
|
||||
"net"
|
||||
"os"
|
||||
"path"
|
||||
"reflect"
|
||||
"time"
|
||||
|
||||
"github.com/Philipp15b/go-steam"
|
||||
"github.com/Philipp15b/go-steam/netutil"
|
||||
"github.com/Philipp15b/go-steam/protocol"
|
||||
"github.com/davecgh/go-spew/spew"
|
||||
)
|
||||
|
||||
// Base structure holding common data among GsBot modules.
|
||||
type GsBot struct {
|
||||
Client *steam.Client
|
||||
Log *log.Logger
|
||||
}
|
||||
|
||||
// Creates a new GsBot with a new steam.Client where logs are written to stdout.
|
||||
func Default() *GsBot {
|
||||
return &GsBot{
|
||||
steam.NewClient(),
|
||||
log.New(os.Stdout, "", 0),
|
||||
}
|
||||
}
|
||||
|
||||
// This module handles authentication. It logs on automatically after a ConnectedEvent
|
||||
// and saves the sentry data to a file which is also used for logon if available.
|
||||
// If you're logging on for the first time Steam may require an authcode. You can then
|
||||
// connect again with the new logon details.
|
||||
type Auth struct {
|
||||
bot *GsBot
|
||||
details *LogOnDetails
|
||||
sentryPath string
|
||||
machineAuthHash []byte
|
||||
}
|
||||
|
||||
func NewAuth(bot *GsBot, details *LogOnDetails, sentryPath string) *Auth {
|
||||
return &Auth{
|
||||
bot: bot,
|
||||
details: details,
|
||||
sentryPath: sentryPath,
|
||||
}
|
||||
}
|
||||
|
||||
type LogOnDetails struct {
|
||||
Username string
|
||||
Password string
|
||||
AuthCode string
|
||||
TwoFactorCode string
|
||||
}
|
||||
|
||||
// This is called automatically after every ConnectedEvent, but must be called once again manually
|
||||
// with an authcode if Steam requires it when logging on for the first time.
|
||||
func (a *Auth) LogOn(details *LogOnDetails) {
|
||||
a.details = details
|
||||
sentry, err := ioutil.ReadFile(a.sentryPath)
|
||||
if err != nil {
|
||||
a.bot.Log.Printf("Error loading sentry file from path %v - This is normal if you're logging in for the first time.\n", a.sentryPath)
|
||||
}
|
||||
a.bot.Client.Auth.LogOn(&steam.LogOnDetails{
|
||||
Username: details.Username,
|
||||
Password: details.Password,
|
||||
SentryFileHash: sentry,
|
||||
AuthCode: details.AuthCode,
|
||||
TwoFactorCode: details.TwoFactorCode,
|
||||
})
|
||||
}
|
||||
|
||||
func (a *Auth) HandleEvent(event interface{}) {
|
||||
switch e := event.(type) {
|
||||
case *steam.ConnectedEvent:
|
||||
a.LogOn(a.details)
|
||||
case *steam.LoggedOnEvent:
|
||||
a.bot.Log.Printf("Logged on (%v) with SteamId %v and account flags %v", e.Result, e.ClientSteamId, e.AccountFlags)
|
||||
case *steam.MachineAuthUpdateEvent:
|
||||
a.machineAuthHash = e.Hash
|
||||
err := ioutil.WriteFile(a.sentryPath, e.Hash, 0666)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This module saves the server list from ClientCMListEvent and uses
|
||||
// it when you call `Connect()`.
|
||||
type ServerList struct {
|
||||
bot *GsBot
|
||||
listPath string
|
||||
}
|
||||
|
||||
func NewServerList(bot *GsBot, listPath string) *ServerList {
|
||||
return &ServerList{
|
||||
bot,
|
||||
listPath,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *ServerList) HandleEvent(event interface{}) {
|
||||
switch e := event.(type) {
|
||||
case *steam.ClientCMListEvent:
|
||||
d, err := json.Marshal(e.Addresses)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
err = ioutil.WriteFile(s.listPath, d, 0666)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (s *ServerList) Connect() (bool, error) {
|
||||
return s.ConnectBind(nil)
|
||||
}
|
||||
|
||||
func (s *ServerList) ConnectBind(laddr *net.TCPAddr) (bool, error) {
|
||||
d, err := ioutil.ReadFile(s.listPath)
|
||||
if err != nil {
|
||||
s.bot.Log.Println("Connecting to random server.")
|
||||
s.bot.Client.Connect()
|
||||
return false, nil
|
||||
}
|
||||
var addrs []*netutil.PortAddr
|
||||
err = json.Unmarshal(d, &addrs)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
raddr := addrs[rand.Intn(len(addrs))]
|
||||
s.bot.Log.Printf("Connecting to %v from server list\n", raddr)
|
||||
s.bot.Client.ConnectToBind(raddr, laddr)
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// This module logs incoming packets and events to a directory.
|
||||
type Debug struct {
|
||||
packetId, eventId uint64
|
||||
bot *GsBot
|
||||
base string
|
||||
}
|
||||
|
||||
func NewDebug(bot *GsBot, base string) (*Debug, error) {
|
||||
base = path.Join(base, fmt.Sprint(time.Now().Unix()))
|
||||
err := os.MkdirAll(path.Join(base, "events"), 0700)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = os.MkdirAll(path.Join(base, "packets"), 0700)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &Debug{
|
||||
0, 0,
|
||||
bot,
|
||||
base,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (d *Debug) HandlePacket(packet *protocol.Packet) {
|
||||
d.packetId++
|
||||
name := path.Join(d.base, "packets", fmt.Sprintf("%d_%d_%s", time.Now().Unix(), d.packetId, packet.EMsg))
|
||||
|
||||
text := packet.String() + "\n\n" + hex.Dump(packet.Data)
|
||||
err := ioutil.WriteFile(name+".txt", []byte(text), 0666)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
err = ioutil.WriteFile(name+".bin", packet.Data, 0666)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Debug) HandleEvent(event interface{}) {
|
||||
d.eventId++
|
||||
name := fmt.Sprintf("%d_%d_%s.txt", time.Now().Unix(), d.eventId, name(event))
|
||||
err := ioutil.WriteFile(path.Join(d.base, "events", name), []byte(spew.Sdump(event)), 0666)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func name(obj interface{}) string {
|
||||
val := reflect.ValueOf(obj)
|
||||
ind := reflect.Indirect(val)
|
||||
if ind.IsValid() {
|
||||
return ind.Type().Name()
|
||||
} else {
|
||||
return val.Type().Name()
|
||||
}
|
||||
}
|
||||
56
vendor/github.com/Philipp15b/go-steam/gsbot/gsbot/gsbot.go
generated
vendored
Normal file
56
vendor/github.com/Philipp15b/go-steam/gsbot/gsbot/gsbot.go
generated
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
// A simple example that uses the modules from the gsbot package and go-steam to log on
|
||||
// to the Steam network.
|
||||
//
|
||||
// The command expects log on data, optionally with an auth code:
|
||||
//
|
||||
// gsbot [username] [password]
|
||||
// gsbot [username] [password] [authcode]
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/Philipp15b/go-steam"
|
||||
"github.com/Philipp15b/go-steam/gsbot"
|
||||
"github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 3 {
|
||||
fmt.Println("gsbot example\nusage: \n\tgsbot [username] [password] [authcode]")
|
||||
return
|
||||
}
|
||||
authcode := ""
|
||||
if len(os.Args) > 3 {
|
||||
authcode = os.Args[3]
|
||||
}
|
||||
|
||||
bot := gsbot.Default()
|
||||
client := bot.Client
|
||||
auth := gsbot.NewAuth(bot, &gsbot.LogOnDetails{
|
||||
os.Args[1],
|
||||
os.Args[2],
|
||||
authcode,
|
||||
}, "sentry.bin")
|
||||
debug, err := gsbot.NewDebug(bot, "debug")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
client.RegisterPacketHandler(debug)
|
||||
serverList := gsbot.NewServerList(bot, "serverlist.json")
|
||||
serverList.Connect()
|
||||
|
||||
for event := range client.Events() {
|
||||
auth.HandleEvent(event)
|
||||
debug.HandleEvent(event)
|
||||
serverList.HandleEvent(event)
|
||||
|
||||
switch e := event.(type) {
|
||||
case error:
|
||||
fmt.Printf("Error: %v", e)
|
||||
case *steam.LoggedOnEvent:
|
||||
client.Social.SetPersonaState(steamlang.EPersonaState_Online)
|
||||
}
|
||||
}
|
||||
}
|
||||
19
vendor/github.com/Philipp15b/go-steam/jsont/jsont.go
generated
vendored
Normal file
19
vendor/github.com/Philipp15b/go-steam/jsont/jsont.go
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
// Includes helper types for working with JSON data
|
||||
package jsont
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
)
|
||||
|
||||
// A boolean value that can be unmarshaled from a number in JSON.
|
||||
type UintBool bool
|
||||
|
||||
func (u *UintBool) UnmarshalJSON(data []byte) error {
|
||||
var n uint
|
||||
err := json.Unmarshal(data, &n)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*u = n != 0
|
||||
return nil
|
||||
}
|
||||
58
vendor/github.com/Philipp15b/go-steam/keys.go
generated
vendored
Normal file
58
vendor/github.com/Philipp15b/go-steam/keys.go
generated
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
package steam
|
||||
|
||||
import (
|
||||
"crypto/rsa"
|
||||
"github.com/Philipp15b/go-steam/cryptoutil"
|
||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
)
|
||||
|
||||
var publicKeys = map[EUniverse][]byte{
|
||||
EUniverse_Public: []byte{
|
||||
0x30, 0x81, 0x9D, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01,
|
||||
0x05, 0x00, 0x03, 0x81, 0x8B, 0x00, 0x30, 0x81, 0x87, 0x02, 0x81, 0x81, 0x00, 0xDF, 0xEC, 0x1A,
|
||||
0xD6, 0x2C, 0x10, 0x66, 0x2C, 0x17, 0x35, 0x3A, 0x14, 0xB0, 0x7C, 0x59, 0x11, 0x7F, 0x9D, 0xD3,
|
||||
0xD8, 0x2B, 0x7A, 0xE3, 0xE0, 0x15, 0xCD, 0x19, 0x1E, 0x46, 0xE8, 0x7B, 0x87, 0x74, 0xA2, 0x18,
|
||||
0x46, 0x31, 0xA9, 0x03, 0x14, 0x79, 0x82, 0x8E, 0xE9, 0x45, 0xA2, 0x49, 0x12, 0xA9, 0x23, 0x68,
|
||||
0x73, 0x89, 0xCF, 0x69, 0xA1, 0xB1, 0x61, 0x46, 0xBD, 0xC1, 0xBE, 0xBF, 0xD6, 0x01, 0x1B, 0xD8,
|
||||
0x81, 0xD4, 0xDC, 0x90, 0xFB, 0xFE, 0x4F, 0x52, 0x73, 0x66, 0xCB, 0x95, 0x70, 0xD7, 0xC5, 0x8E,
|
||||
0xBA, 0x1C, 0x7A, 0x33, 0x75, 0xA1, 0x62, 0x34, 0x46, 0xBB, 0x60, 0xB7, 0x80, 0x68, 0xFA, 0x13,
|
||||
0xA7, 0x7A, 0x8A, 0x37, 0x4B, 0x9E, 0xC6, 0xF4, 0x5D, 0x5F, 0x3A, 0x99, 0xF9, 0x9E, 0xC4, 0x3A,
|
||||
0xE9, 0x63, 0xA2, 0xBB, 0x88, 0x19, 0x28, 0xE0, 0xE7, 0x14, 0xC0, 0x42, 0x89, 0x02, 0x01, 0x11,
|
||||
},
|
||||
|
||||
EUniverse_Beta: []byte{
|
||||
0x30, 0x81, 0x9D, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01,
|
||||
0x05, 0x00, 0x03, 0x81, 0x8B, 0x00, 0x30, 0x81, 0x87, 0x02, 0x81, 0x81, 0x00, 0xAE, 0xD1, 0x4B,
|
||||
0xC0, 0xA3, 0x36, 0x8B, 0xA0, 0x39, 0x0B, 0x43, 0xDC, 0xED, 0x6A, 0xC8, 0xF2, 0xA3, 0xE4, 0x7E,
|
||||
0x09, 0x8C, 0x55, 0x2E, 0xE7, 0xE9, 0x3C, 0xBB, 0xE5, 0x5E, 0x0F, 0x18, 0x74, 0x54, 0x8F, 0xF3,
|
||||
0xBD, 0x56, 0x69, 0x5B, 0x13, 0x09, 0xAF, 0xC8, 0xBE, 0xB3, 0xA1, 0x48, 0x69, 0xE9, 0x83, 0x49,
|
||||
0x65, 0x8D, 0xD2, 0x93, 0x21, 0x2F, 0xB9, 0x1E, 0xFA, 0x74, 0x3B, 0x55, 0x22, 0x79, 0xBF, 0x85,
|
||||
0x18, 0xCB, 0x6D, 0x52, 0x44, 0x4E, 0x05, 0x92, 0x89, 0x6A, 0xA8, 0x99, 0xED, 0x44, 0xAE, 0xE2,
|
||||
0x66, 0x46, 0x42, 0x0C, 0xFB, 0x6E, 0x4C, 0x30, 0xC6, 0x6C, 0x5C, 0x16, 0xFF, 0xBA, 0x9C, 0xB9,
|
||||
0x78, 0x3F, 0x17, 0x4B, 0xCB, 0xC9, 0x01, 0x5D, 0x3E, 0x37, 0x70, 0xEC, 0x67, 0x5A, 0x33, 0x48,
|
||||
},
|
||||
|
||||
EUniverse_Internal: []byte{
|
||||
0x30, 0x81, 0x9D, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01,
|
||||
0x05, 0x00, 0x03, 0x81, 0x8B, 0x00, 0x30, 0x81, 0x87, 0x02, 0x81, 0x81, 0x00, 0xA8, 0xFE, 0x01,
|
||||
0x3B, 0xB6, 0xD7, 0x21, 0x4B, 0x53, 0x23, 0x6F, 0xA1, 0xAB, 0x4E, 0xF1, 0x07, 0x30, 0xA7, 0xC6,
|
||||
0x7E, 0x6A, 0x2C, 0xC2, 0x5D, 0x3A, 0xB8, 0x40, 0xCA, 0x59, 0x4D, 0x16, 0x2D, 0x74, 0xEB, 0x0E,
|
||||
0x72, 0x46, 0x29, 0xF9, 0xDE, 0x9B, 0xCE, 0x4B, 0x8C, 0xD0, 0xCA, 0xF4, 0x08, 0x94, 0x46, 0xA5,
|
||||
0x11, 0xAF, 0x3A, 0xCB, 0xB8, 0x4E, 0xDE, 0xC6, 0xD8, 0x85, 0x0A, 0x7D, 0xAA, 0x96, 0x0A, 0xEA,
|
||||
0x7B, 0x51, 0xD6, 0x22, 0x62, 0x5C, 0x1E, 0x58, 0xD7, 0x46, 0x1E, 0x09, 0xAE, 0x43, 0xA7, 0xC4,
|
||||
0x34, 0x69, 0xA2, 0xA5, 0xE8, 0x44, 0x76, 0x18, 0xE2, 0x3D, 0xB7, 0xC5, 0xA8, 0x96, 0xFD, 0xE5,
|
||||
0xB4, 0x4B, 0xF8, 0x40, 0x12, 0xA6, 0x17, 0x4E, 0xC4, 0xC1, 0x60, 0x0E, 0xB0, 0xC2, 0xB8, 0x40,
|
||||
},
|
||||
}
|
||||
|
||||
func GetPublicKey(universe EUniverse) *rsa.PublicKey {
|
||||
bytes, ok := publicKeys[universe]
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
key, err := cryptoutil.ParseASN1RSAPublicKey(bytes)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return key
|
||||
}
|
||||
43
vendor/github.com/Philipp15b/go-steam/netutil/addr.go
generated
vendored
Normal file
43
vendor/github.com/Philipp15b/go-steam/netutil/addr.go
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
package netutil
|
||||
|
||||
import (
|
||||
"net"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// An addr that is neither restricted to TCP nor UDP, but has an IP and a port.
|
||||
type PortAddr struct {
|
||||
IP net.IP
|
||||
Port uint16
|
||||
}
|
||||
|
||||
// Parses an IP address with a port, for example "209.197.29.196:27017".
|
||||
// If the given string is not valid, this function returns nil.
|
||||
func ParsePortAddr(addr string) *PortAddr {
|
||||
parts := strings.Split(addr, ":")
|
||||
if len(parts) != 2 {
|
||||
return nil
|
||||
}
|
||||
ip := net.ParseIP(parts[0])
|
||||
if ip == nil {
|
||||
return nil
|
||||
}
|
||||
port, err := strconv.ParseUint(parts[1], 10, 16)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return &PortAddr{ip, uint16(port)}
|
||||
}
|
||||
|
||||
func (p *PortAddr) ToTCPAddr() *net.TCPAddr {
|
||||
return &net.TCPAddr{p.IP, int(p.Port), ""}
|
||||
}
|
||||
|
||||
func (p *PortAddr) ToUDPAddr() *net.UDPAddr {
|
||||
return &net.UDPAddr{p.IP, int(p.Port), ""}
|
||||
}
|
||||
|
||||
func (p *PortAddr) String() string {
|
||||
return p.IP.String() + ":" + strconv.FormatUint(uint64(p.Port), 10)
|
||||
}
|
||||
17
vendor/github.com/Philipp15b/go-steam/netutil/http.go
generated
vendored
Normal file
17
vendor/github.com/Philipp15b/go-steam/netutil/http.go
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
package netutil
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Version of http.Client.PostForm that returns a new request instead of executing it directly.
|
||||
func NewPostForm(url string, data url.Values) *http.Request {
|
||||
req, err := http.NewRequest("POST", url, strings.NewReader(data.Encode()))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
return req
|
||||
}
|
||||
13
vendor/github.com/Philipp15b/go-steam/netutil/url.go
generated
vendored
Normal file
13
vendor/github.com/Philipp15b/go-steam/netutil/url.go
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
package netutil
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
)
|
||||
|
||||
func ToUrlValues(m map[string]string) url.Values {
|
||||
r := make(url.Values)
|
||||
for k, v := range m {
|
||||
r.Add(k, v)
|
||||
}
|
||||
return r
|
||||
}
|
||||
62
vendor/github.com/Philipp15b/go-steam/notifications.go
generated
vendored
Normal file
62
vendor/github.com/Philipp15b/go-steam/notifications.go
generated
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
package steam
|
||||
|
||||
import (
|
||||
. "github.com/Philipp15b/go-steam/protocol"
|
||||
. "github.com/Philipp15b/go-steam/protocol/protobuf"
|
||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
)
|
||||
|
||||
type Notifications struct {
|
||||
// Maps notification types to their count. If a type is not present in the map,
|
||||
// its count is zero.
|
||||
notifications map[NotificationType]uint
|
||||
client *Client
|
||||
}
|
||||
|
||||
func newNotifications(client *Client) *Notifications {
|
||||
return &Notifications{
|
||||
make(map[NotificationType]uint),
|
||||
client,
|
||||
}
|
||||
}
|
||||
|
||||
func (n *Notifications) HandlePacket(packet *Packet) {
|
||||
switch packet.EMsg {
|
||||
case EMsg_ClientUserNotifications:
|
||||
n.handleClientUserNotifications(packet)
|
||||
}
|
||||
}
|
||||
|
||||
type NotificationType uint
|
||||
|
||||
const (
|
||||
TradeOffer NotificationType = 1
|
||||
)
|
||||
|
||||
func (n *Notifications) handleClientUserNotifications(packet *Packet) {
|
||||
msg := new(CMsgClientUserNotifications)
|
||||
packet.ReadProtoMsg(msg)
|
||||
|
||||
for _, notification := range msg.GetNotifications() {
|
||||
typ := NotificationType(*notification.UserNotificationType)
|
||||
count := uint(*notification.Count)
|
||||
n.notifications[typ] = count
|
||||
n.client.Emit(&NotificationEvent{typ, count})
|
||||
}
|
||||
|
||||
// check if there is a notification in our map that isn't in the current packet
|
||||
for typ, _ := range n.notifications {
|
||||
exists := false
|
||||
for _, t := range msg.GetNotifications() {
|
||||
if NotificationType(*t.UserNotificationType) == typ {
|
||||
exists = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !exists {
|
||||
delete(n.notifications, typ)
|
||||
n.client.Emit(&NotificationEvent{typ, 0})
|
||||
}
|
||||
}
|
||||
}
|
||||
9
vendor/github.com/Philipp15b/go-steam/notifications_events.go
generated
vendored
Normal file
9
vendor/github.com/Philipp15b/go-steam/notifications_events.go
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
package steam
|
||||
|
||||
// This event is emitted for every CMsgClientUserNotifications message and likewise only used for
|
||||
// trade offers. Unlike the the above it is also emitted when the count of a type that was tracked
|
||||
// before by this Notifications instance reaches zero.
|
||||
type NotificationEvent struct {
|
||||
Type NotificationType
|
||||
Count uint
|
||||
}
|
||||
18
vendor/github.com/Philipp15b/go-steam/protocol/doc.go
generated
vendored
Normal file
18
vendor/github.com/Philipp15b/go-steam/protocol/doc.go
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
This package includes some basics for the Steam protocol. It defines basic interfaces that are used throughout go-steam:
|
||||
There is IMsg, which is extended by IClientMsg (sent after logging in) and abstracts over
|
||||
the outgoing message types. Both interfaces are implemented by ClientMsgProtobuf and ClientMsg.
|
||||
Msg is like ClientMsg, but it is used for sending messages before logging in.
|
||||
|
||||
There is also the concept of a Packet: This is a type for incoming messages where only
|
||||
the header is deserialized. It therefore only contains EMsg data, job information and the remaining data.
|
||||
Its contents can then be read via the Read* methods which read data into a MessageBody - a type which is Serializable and
|
||||
has an EMsg.
|
||||
|
||||
In addition, there are extra types for communication with the Game Coordinator (GC) included in the gamecoordinator sub-package.
|
||||
For outgoing messages the IGCMsg interface is used which is implemented by GCMsgProtobuf and GCMsg.
|
||||
Incoming messages are of the GCPacket type and are read like regular Packets.
|
||||
|
||||
The actual messages and enums are in the sub-packages steamlang and protobuf, generated from the SteamKit data.
|
||||
*/
|
||||
package protocol
|
||||
132
vendor/github.com/Philipp15b/go-steam/protocol/gamecoordinator/msg.go
generated
vendored
Normal file
132
vendor/github.com/Philipp15b/go-steam/protocol/gamecoordinator/msg.go
generated
vendored
Normal file
@@ -0,0 +1,132 @@
|
||||
package gamecoordinator
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
. "github.com/Philipp15b/go-steam/protocol"
|
||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
"github.com/golang/protobuf/proto"
|
||||
)
|
||||
|
||||
// An outgoing message to the Game Coordinator.
|
||||
type IGCMsg interface {
|
||||
Serializer
|
||||
IsProto() bool
|
||||
GetAppId() uint32
|
||||
GetMsgType() uint32
|
||||
|
||||
GetTargetJobId() JobId
|
||||
SetTargetJobId(JobId)
|
||||
GetSourceJobId() JobId
|
||||
SetSourceJobId(JobId)
|
||||
}
|
||||
|
||||
type GCMsgProtobuf struct {
|
||||
AppId uint32
|
||||
Header *MsgGCHdrProtoBuf
|
||||
Body proto.Message
|
||||
}
|
||||
|
||||
func NewGCMsgProtobuf(appId, msgType uint32, body proto.Message) *GCMsgProtobuf {
|
||||
hdr := NewMsgGCHdrProtoBuf()
|
||||
hdr.Msg = msgType
|
||||
return &GCMsgProtobuf{
|
||||
AppId: appId,
|
||||
Header: hdr,
|
||||
Body: body,
|
||||
}
|
||||
}
|
||||
|
||||
func (g *GCMsgProtobuf) IsProto() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (g *GCMsgProtobuf) GetAppId() uint32 {
|
||||
return g.AppId
|
||||
}
|
||||
|
||||
func (g *GCMsgProtobuf) GetMsgType() uint32 {
|
||||
return g.Header.Msg
|
||||
}
|
||||
|
||||
func (g *GCMsgProtobuf) GetTargetJobId() JobId {
|
||||
return JobId(g.Header.Proto.GetJobidTarget())
|
||||
}
|
||||
|
||||
func (g *GCMsgProtobuf) SetTargetJobId(job JobId) {
|
||||
g.Header.Proto.JobidTarget = proto.Uint64(uint64(job))
|
||||
}
|
||||
|
||||
func (g *GCMsgProtobuf) GetSourceJobId() JobId {
|
||||
return JobId(g.Header.Proto.GetJobidSource())
|
||||
}
|
||||
|
||||
func (g *GCMsgProtobuf) SetSourceJobId(job JobId) {
|
||||
g.Header.Proto.JobidSource = proto.Uint64(uint64(job))
|
||||
}
|
||||
|
||||
func (g *GCMsgProtobuf) Serialize(w io.Writer) error {
|
||||
err := g.Header.Serialize(w)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
body, err := proto.Marshal(g.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = w.Write(body)
|
||||
return err
|
||||
}
|
||||
|
||||
type GCMsg struct {
|
||||
AppId uint32
|
||||
MsgType uint32
|
||||
Header *MsgGCHdr
|
||||
Body Serializer
|
||||
}
|
||||
|
||||
func NewGCMsg(appId, msgType uint32, body Serializer) *GCMsg {
|
||||
return &GCMsg{
|
||||
AppId: appId,
|
||||
MsgType: msgType,
|
||||
Header: NewMsgGCHdr(),
|
||||
Body: body,
|
||||
}
|
||||
}
|
||||
|
||||
func (g *GCMsg) GetMsgType() uint32 {
|
||||
return g.MsgType
|
||||
}
|
||||
|
||||
func (g *GCMsg) GetAppId() uint32 {
|
||||
return g.AppId
|
||||
}
|
||||
|
||||
func (g *GCMsg) IsProto() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (g *GCMsg) GetTargetJobId() JobId {
|
||||
return JobId(g.Header.TargetJobID)
|
||||
}
|
||||
|
||||
func (g *GCMsg) SetTargetJobId(job JobId) {
|
||||
g.Header.TargetJobID = uint64(job)
|
||||
}
|
||||
|
||||
func (g *GCMsg) GetSourceJobId() JobId {
|
||||
return JobId(g.Header.SourceJobID)
|
||||
}
|
||||
|
||||
func (g *GCMsg) SetSourceJobId(job JobId) {
|
||||
g.Header.SourceJobID = uint64(job)
|
||||
}
|
||||
|
||||
func (g *GCMsg) Serialize(w io.Writer) error {
|
||||
err := g.Header.Serialize(w)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = g.Body.Serialize(w)
|
||||
return err
|
||||
}
|
||||
61
vendor/github.com/Philipp15b/go-steam/protocol/gamecoordinator/packet.go
generated
vendored
Normal file
61
vendor/github.com/Philipp15b/go-steam/protocol/gamecoordinator/packet.go
generated
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
package gamecoordinator
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
. "github.com/Philipp15b/go-steam/protocol"
|
||||
. "github.com/Philipp15b/go-steam/protocol/protobuf"
|
||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
"github.com/golang/protobuf/proto"
|
||||
)
|
||||
|
||||
// An incoming, partially unread message from the Game Coordinator.
|
||||
type GCPacket struct {
|
||||
AppId uint32
|
||||
MsgType uint32
|
||||
IsProto bool
|
||||
GCName string
|
||||
Body []byte
|
||||
TargetJobId JobId
|
||||
}
|
||||
|
||||
func NewGCPacket(wrapper *CMsgGCClient) (*GCPacket, error) {
|
||||
packet := &GCPacket{
|
||||
AppId: wrapper.GetAppid(),
|
||||
MsgType: wrapper.GetMsgtype(),
|
||||
GCName: wrapper.GetGcname(),
|
||||
}
|
||||
|
||||
r := bytes.NewReader(wrapper.GetPayload())
|
||||
if IsProto(wrapper.GetMsgtype()) {
|
||||
packet.MsgType = packet.MsgType & EMsgMask
|
||||
packet.IsProto = true
|
||||
|
||||
header := NewMsgGCHdrProtoBuf()
|
||||
err := header.Deserialize(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
packet.TargetJobId = JobId(header.Proto.GetJobidTarget())
|
||||
} else {
|
||||
header := NewMsgGCHdr()
|
||||
err := header.Deserialize(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
packet.TargetJobId = JobId(header.TargetJobID)
|
||||
}
|
||||
|
||||
body := make([]byte, r.Len())
|
||||
r.Read(body)
|
||||
packet.Body = body
|
||||
|
||||
return packet, nil
|
||||
}
|
||||
|
||||
func (g *GCPacket) ReadProtoMsg(body proto.Message) {
|
||||
proto.Unmarshal(g.Body, body)
|
||||
}
|
||||
|
||||
func (g *GCPacket) ReadMsg(body MessageBody) {
|
||||
body.Deserialize(bytes.NewReader(g.Body))
|
||||
}
|
||||
47
vendor/github.com/Philipp15b/go-steam/protocol/internal.go
generated
vendored
Normal file
47
vendor/github.com/Philipp15b/go-steam/protocol/internal.go
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
package protocol
|
||||
|
||||
import (
|
||||
"io"
|
||||
"math"
|
||||
"strconv"
|
||||
|
||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
)
|
||||
|
||||
type JobId uint64
|
||||
|
||||
func (j JobId) String() string {
|
||||
if j == math.MaxUint64 {
|
||||
return "(none)"
|
||||
}
|
||||
return strconv.FormatUint(uint64(j), 10)
|
||||
}
|
||||
|
||||
type Serializer interface {
|
||||
Serialize(w io.Writer) error
|
||||
}
|
||||
|
||||
type Deserializer interface {
|
||||
Deserialize(r io.Reader) error
|
||||
}
|
||||
|
||||
type Serializable interface {
|
||||
Serializer
|
||||
Deserializer
|
||||
}
|
||||
|
||||
type MessageBody interface {
|
||||
Serializable
|
||||
GetEMsg() EMsg
|
||||
}
|
||||
|
||||
// the default details to request in most situations
|
||||
const EClientPersonaStateFlag_DefaultInfoRequest = EClientPersonaStateFlag_PlayerName |
|
||||
EClientPersonaStateFlag_Presence | EClientPersonaStateFlag_SourceID |
|
||||
EClientPersonaStateFlag_GameExtraInfo
|
||||
|
||||
const DefaultAvatar = "fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb"
|
||||
|
||||
func ValidAvatar(avatar string) bool {
|
||||
return !(avatar == "0000000000000000000000000000000000000000" || len(avatar) != 40)
|
||||
}
|
||||
221
vendor/github.com/Philipp15b/go-steam/protocol/msg.go
generated
vendored
Normal file
221
vendor/github.com/Philipp15b/go-steam/protocol/msg.go
generated
vendored
Normal file
@@ -0,0 +1,221 @@
|
||||
package protocol
|
||||
|
||||
import (
|
||||
"github.com/golang/protobuf/proto"
|
||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
. "github.com/Philipp15b/go-steam/steamid"
|
||||
"io"
|
||||
)
|
||||
|
||||
// Interface for all messages, typically outgoing. They can also be created by
|
||||
// using the Read* methods in a PacketMsg.
|
||||
type IMsg interface {
|
||||
Serializer
|
||||
IsProto() bool
|
||||
GetMsgType() EMsg
|
||||
GetTargetJobId() JobId
|
||||
SetTargetJobId(JobId)
|
||||
GetSourceJobId() JobId
|
||||
SetSourceJobId(JobId)
|
||||
}
|
||||
|
||||
// Interface for client messages, i.e. messages that are sent after logging in.
|
||||
// ClientMsgProtobuf and ClientMsg implement this.
|
||||
type IClientMsg interface {
|
||||
IMsg
|
||||
GetSessionId() int32
|
||||
SetSessionId(int32)
|
||||
GetSteamId() SteamId
|
||||
SetSteamId(SteamId)
|
||||
}
|
||||
|
||||
// Represents a protobuf backed client message with session data.
|
||||
type ClientMsgProtobuf struct {
|
||||
Header *MsgHdrProtoBuf
|
||||
Body proto.Message
|
||||
}
|
||||
|
||||
func NewClientMsgProtobuf(eMsg EMsg, body proto.Message) *ClientMsgProtobuf {
|
||||
hdr := NewMsgHdrProtoBuf()
|
||||
hdr.Msg = eMsg
|
||||
return &ClientMsgProtobuf{
|
||||
Header: hdr,
|
||||
Body: body,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *ClientMsgProtobuf) IsProto() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (c *ClientMsgProtobuf) GetMsgType() EMsg {
|
||||
return NewEMsg(uint32(c.Header.Msg))
|
||||
}
|
||||
|
||||
func (c *ClientMsgProtobuf) GetSessionId() int32 {
|
||||
return c.Header.Proto.GetClientSessionid()
|
||||
}
|
||||
|
||||
func (c *ClientMsgProtobuf) SetSessionId(session int32) {
|
||||
c.Header.Proto.ClientSessionid = &session
|
||||
}
|
||||
|
||||
func (c *ClientMsgProtobuf) GetSteamId() SteamId {
|
||||
return SteamId(c.Header.Proto.GetSteamid())
|
||||
}
|
||||
|
||||
func (c *ClientMsgProtobuf) SetSteamId(s SteamId) {
|
||||
c.Header.Proto.Steamid = proto.Uint64(uint64(s))
|
||||
}
|
||||
|
||||
func (c *ClientMsgProtobuf) GetTargetJobId() JobId {
|
||||
return JobId(c.Header.Proto.GetJobidTarget())
|
||||
}
|
||||
|
||||
func (c *ClientMsgProtobuf) SetTargetJobId(job JobId) {
|
||||
c.Header.Proto.JobidTarget = proto.Uint64(uint64(job))
|
||||
}
|
||||
|
||||
func (c *ClientMsgProtobuf) GetSourceJobId() JobId {
|
||||
return JobId(c.Header.Proto.GetJobidSource())
|
||||
}
|
||||
|
||||
func (c *ClientMsgProtobuf) SetSourceJobId(job JobId) {
|
||||
c.Header.Proto.JobidSource = proto.Uint64(uint64(job))
|
||||
}
|
||||
|
||||
func (c *ClientMsgProtobuf) Serialize(w io.Writer) error {
|
||||
err := c.Header.Serialize(w)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
body, err := proto.Marshal(c.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = w.Write(body)
|
||||
return err
|
||||
}
|
||||
|
||||
// Represents a struct backed client message.
|
||||
type ClientMsg struct {
|
||||
Header *ExtendedClientMsgHdr
|
||||
Body MessageBody
|
||||
Payload []byte
|
||||
}
|
||||
|
||||
func NewClientMsg(body MessageBody, payload []byte) *ClientMsg {
|
||||
hdr := NewExtendedClientMsgHdr()
|
||||
hdr.Msg = body.GetEMsg()
|
||||
return &ClientMsg{
|
||||
Header: hdr,
|
||||
Body: body,
|
||||
Payload: payload,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *ClientMsg) IsProto() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (c *ClientMsg) GetMsgType() EMsg {
|
||||
return c.Header.Msg
|
||||
}
|
||||
|
||||
func (c *ClientMsg) GetSessionId() int32 {
|
||||
return c.Header.SessionID
|
||||
}
|
||||
|
||||
func (c *ClientMsg) SetSessionId(session int32) {
|
||||
c.Header.SessionID = session
|
||||
}
|
||||
|
||||
func (c *ClientMsg) GetSteamId() SteamId {
|
||||
return c.Header.SteamID
|
||||
}
|
||||
|
||||
func (c *ClientMsg) SetSteamId(s SteamId) {
|
||||
c.Header.SteamID = s
|
||||
}
|
||||
|
||||
func (c *ClientMsg) GetTargetJobId() JobId {
|
||||
return JobId(c.Header.TargetJobID)
|
||||
}
|
||||
|
||||
func (c *ClientMsg) SetTargetJobId(job JobId) {
|
||||
c.Header.TargetJobID = uint64(job)
|
||||
}
|
||||
|
||||
func (c *ClientMsg) GetSourceJobId() JobId {
|
||||
return JobId(c.Header.SourceJobID)
|
||||
}
|
||||
|
||||
func (c *ClientMsg) SetSourceJobId(job JobId) {
|
||||
c.Header.SourceJobID = uint64(job)
|
||||
}
|
||||
|
||||
func (c *ClientMsg) Serialize(w io.Writer) error {
|
||||
err := c.Header.Serialize(w)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = c.Body.Serialize(w)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = w.Write(c.Payload)
|
||||
return err
|
||||
}
|
||||
|
||||
type Msg struct {
|
||||
Header *MsgHdr
|
||||
Body MessageBody
|
||||
Payload []byte
|
||||
}
|
||||
|
||||
func NewMsg(body MessageBody, payload []byte) *Msg {
|
||||
hdr := NewMsgHdr()
|
||||
hdr.Msg = body.GetEMsg()
|
||||
return &Msg{
|
||||
Header: hdr,
|
||||
Body: body,
|
||||
Payload: payload,
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Msg) GetMsgType() EMsg {
|
||||
return m.Header.Msg
|
||||
}
|
||||
|
||||
func (m *Msg) IsProto() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *Msg) GetTargetJobId() JobId {
|
||||
return JobId(m.Header.TargetJobID)
|
||||
}
|
||||
|
||||
func (m *Msg) SetTargetJobId(job JobId) {
|
||||
m.Header.TargetJobID = uint64(job)
|
||||
}
|
||||
|
||||
func (m *Msg) GetSourceJobId() JobId {
|
||||
return JobId(m.Header.SourceJobID)
|
||||
}
|
||||
|
||||
func (m *Msg) SetSourceJobId(job JobId) {
|
||||
m.Header.SourceJobID = uint64(job)
|
||||
}
|
||||
|
||||
func (m *Msg) Serialize(w io.Writer) error {
|
||||
err := m.Header.Serialize(w)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = m.Body.Serialize(w)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = w.Write(m.Payload)
|
||||
return err
|
||||
}
|
||||
116
vendor/github.com/Philipp15b/go-steam/protocol/packet.go
generated
vendored
Normal file
116
vendor/github.com/Philipp15b/go-steam/protocol/packet.go
generated
vendored
Normal file
@@ -0,0 +1,116 @@
|
||||
package protocol
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"github.com/golang/protobuf/proto"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||
)
|
||||
|
||||
// TODO: Headers are always deserialized twice.
|
||||
|
||||
// Represents an incoming, partially unread message.
|
||||
type Packet struct {
|
||||
EMsg EMsg
|
||||
IsProto bool
|
||||
TargetJobId JobId
|
||||
SourceJobId JobId
|
||||
Data []byte
|
||||
}
|
||||
|
||||
func NewPacket(data []byte) (*Packet, error) {
|
||||
var rawEMsg uint32
|
||||
err := binary.Read(bytes.NewReader(data), binary.LittleEndian, &rawEMsg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
eMsg := NewEMsg(rawEMsg)
|
||||
buf := bytes.NewReader(data)
|
||||
if eMsg == EMsg_ChannelEncryptRequest || eMsg == EMsg_ChannelEncryptResult {
|
||||
header := NewMsgHdr()
|
||||
header.Msg = eMsg
|
||||
err = header.Deserialize(buf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &Packet{
|
||||
EMsg: eMsg,
|
||||
IsProto: false,
|
||||
TargetJobId: JobId(header.TargetJobID),
|
||||
SourceJobId: JobId(header.SourceJobID),
|
||||
Data: data,
|
||||
}, nil
|
||||
} else if IsProto(rawEMsg) {
|
||||
header := NewMsgHdrProtoBuf()
|
||||
header.Msg = eMsg
|
||||
err = header.Deserialize(buf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &Packet{
|
||||
EMsg: eMsg,
|
||||
IsProto: true,
|
||||
TargetJobId: JobId(header.Proto.GetJobidTarget()),
|
||||
SourceJobId: JobId(header.Proto.GetJobidSource()),
|
||||
Data: data,
|
||||
}, nil
|
||||
} else {
|
||||
header := NewExtendedClientMsgHdr()
|
||||
header.Msg = eMsg
|
||||
err = header.Deserialize(buf)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &Packet{
|
||||
EMsg: eMsg,
|
||||
IsProto: false,
|
||||
TargetJobId: JobId(header.TargetJobID),
|
||||
SourceJobId: JobId(header.SourceJobID),
|
||||
Data: data,
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Packet) String() string {
|
||||
return fmt.Sprintf("Packet{EMsg = %v, Proto = %v, Len = %v, TargetJobId = %v, SourceJobId = %v}", p.EMsg, p.IsProto, len(p.Data), p.TargetJobId, p.SourceJobId)
|
||||
}
|
||||
|
||||
func (p *Packet) ReadProtoMsg(body proto.Message) *ClientMsgProtobuf {
|
||||
header := NewMsgHdrProtoBuf()
|
||||
buf := bytes.NewBuffer(p.Data)
|
||||
header.Deserialize(buf)
|
||||
proto.Unmarshal(buf.Bytes(), body)
|
||||
return &ClientMsgProtobuf{ // protobuf messages have no payload
|
||||
Header: header,
|
||||
Body: body,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Packet) ReadClientMsg(body MessageBody) *ClientMsg {
|
||||
header := NewExtendedClientMsgHdr()
|
||||
buf := bytes.NewReader(p.Data)
|
||||
header.Deserialize(buf)
|
||||
body.Deserialize(buf)
|
||||
payload := make([]byte, buf.Len())
|
||||
buf.Read(payload)
|
||||
return &ClientMsg{
|
||||
Header: header,
|
||||
Body: body,
|
||||
Payload: payload,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Packet) ReadMsg(body MessageBody) *Msg {
|
||||
header := NewMsgHdr()
|
||||
buf := bytes.NewReader(p.Data)
|
||||
header.Deserialize(buf)
|
||||
body.Deserialize(buf)
|
||||
payload := make([]byte, buf.Len())
|
||||
buf.Read(payload)
|
||||
return &Msg{
|
||||
Header: header,
|
||||
Body: body,
|
||||
Payload: payload,
|
||||
}
|
||||
}
|
||||
82
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/app_ticket.pb.go
generated
vendored
Normal file
82
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/app_ticket.pb.go
generated
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
// Code generated by protoc-gen-go.
|
||||
// source: encrypted_app_ticket.proto
|
||||
// DO NOT EDIT!
|
||||
|
||||
package protobuf
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
import fmt "fmt"
|
||||
import math "math"
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
type EncryptedAppTicket struct {
|
||||
TicketVersionNo *uint32 `protobuf:"varint,1,opt,name=ticket_version_no" json:"ticket_version_no,omitempty"`
|
||||
CrcEncryptedticket *uint32 `protobuf:"varint,2,opt,name=crc_encryptedticket" json:"crc_encryptedticket,omitempty"`
|
||||
CbEncrypteduserdata *uint32 `protobuf:"varint,3,opt,name=cb_encrypteduserdata" json:"cb_encrypteduserdata,omitempty"`
|
||||
CbEncryptedAppownershipticket *uint32 `protobuf:"varint,4,opt,name=cb_encrypted_appownershipticket" json:"cb_encrypted_appownershipticket,omitempty"`
|
||||
EncryptedTicket []byte `protobuf:"bytes,5,opt,name=encrypted_ticket" json:"encrypted_ticket,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *EncryptedAppTicket) Reset() { *m = EncryptedAppTicket{} }
|
||||
func (m *EncryptedAppTicket) String() string { return proto.CompactTextString(m) }
|
||||
func (*EncryptedAppTicket) ProtoMessage() {}
|
||||
func (*EncryptedAppTicket) Descriptor() ([]byte, []int) { return app_ticket_fileDescriptor0, []int{0} }
|
||||
|
||||
func (m *EncryptedAppTicket) GetTicketVersionNo() uint32 {
|
||||
if m != nil && m.TicketVersionNo != nil {
|
||||
return *m.TicketVersionNo
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *EncryptedAppTicket) GetCrcEncryptedticket() uint32 {
|
||||
if m != nil && m.CrcEncryptedticket != nil {
|
||||
return *m.CrcEncryptedticket
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *EncryptedAppTicket) GetCbEncrypteduserdata() uint32 {
|
||||
if m != nil && m.CbEncrypteduserdata != nil {
|
||||
return *m.CbEncrypteduserdata
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *EncryptedAppTicket) GetCbEncryptedAppownershipticket() uint32 {
|
||||
if m != nil && m.CbEncryptedAppownershipticket != nil {
|
||||
return *m.CbEncryptedAppownershipticket
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *EncryptedAppTicket) GetEncryptedTicket() []byte {
|
||||
if m != nil {
|
||||
return m.EncryptedTicket
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*EncryptedAppTicket)(nil), "EncryptedAppTicket")
|
||||
}
|
||||
|
||||
var app_ticket_fileDescriptor0 = []byte{
|
||||
// 162 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x92, 0x4a, 0xcd, 0x4b, 0x2e,
|
||||
0xaa, 0x2c, 0x28, 0x49, 0x4d, 0x89, 0x4f, 0x2c, 0x28, 0x88, 0x2f, 0xc9, 0x4c, 0xce, 0x4e, 0x2d,
|
||||
0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x57, 0x5a, 0xcb, 0xc8, 0x25, 0xe4, 0x0a, 0x93, 0x76, 0x2c,
|
||||
0x28, 0x08, 0x01, 0x4b, 0x0a, 0x49, 0x72, 0x09, 0x42, 0x94, 0xc5, 0x97, 0xa5, 0x16, 0x15, 0x67,
|
||||
0xe6, 0xe7, 0xc5, 0xe7, 0xe5, 0x4b, 0x30, 0x2a, 0x30, 0x6a, 0xf0, 0x0a, 0x49, 0x73, 0x09, 0x27,
|
||||
0x17, 0x25, 0xc7, 0xc3, 0xcd, 0x84, 0xa8, 0x93, 0x60, 0x02, 0x4b, 0xca, 0x70, 0x89, 0x24, 0x27,
|
||||
0x21, 0xe4, 0x4a, 0x8b, 0x53, 0x8b, 0x52, 0x12, 0x4b, 0x12, 0x25, 0x98, 0xc1, 0xb2, 0xea, 0x5c,
|
||||
0xf2, 0xc8, 0xb2, 0x20, 0xd7, 0xe4, 0x97, 0xe7, 0x01, 0x2d, 0xc8, 0xc8, 0x2c, 0x80, 0x1a, 0xc3,
|
||||
0x02, 0x56, 0x28, 0xc1, 0x25, 0x80, 0x50, 0x05, 0x95, 0x61, 0x05, 0xca, 0xf0, 0x38, 0xb1, 0x7a,
|
||||
0x30, 0x36, 0x30, 0x32, 0x00, 0x02, 0x00, 0x00, 0xff, 0xff, 0x03, 0x8c, 0xdb, 0x92, 0xd3, 0x00,
|
||||
0x00, 0x00,
|
||||
}
|
||||
613
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/base.pb.go
generated
vendored
Normal file
613
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/base.pb.go
generated
vendored
Normal file
@@ -0,0 +1,613 @@
|
||||
// Code generated by protoc-gen-go.
|
||||
// source: steammessages_base.proto
|
||||
// DO NOT EDIT!
|
||||
|
||||
package protobuf
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
import fmt "fmt"
|
||||
import math "math"
|
||||
import google_protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor"
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
type CMsgProtoBufHeader struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
ClientSessionid *int32 `protobuf:"varint,2,opt,name=client_sessionid" json:"client_sessionid,omitempty"`
|
||||
RoutingAppid *uint32 `protobuf:"varint,3,opt,name=routing_appid" json:"routing_appid,omitempty"`
|
||||
JobidSource *uint64 `protobuf:"fixed64,10,opt,name=jobid_source,def=18446744073709551615" json:"jobid_source,omitempty"`
|
||||
JobidTarget *uint64 `protobuf:"fixed64,11,opt,name=jobid_target,def=18446744073709551615" json:"jobid_target,omitempty"`
|
||||
TargetJobName *string `protobuf:"bytes,12,opt,name=target_job_name" json:"target_job_name,omitempty"`
|
||||
SeqNum *int32 `protobuf:"varint,24,opt,name=seq_num" json:"seq_num,omitempty"`
|
||||
Eresult *int32 `protobuf:"varint,13,opt,name=eresult,def=2" json:"eresult,omitempty"`
|
||||
ErrorMessage *string `protobuf:"bytes,14,opt,name=error_message" json:"error_message,omitempty"`
|
||||
Ip *uint32 `protobuf:"varint,15,opt,name=ip" json:"ip,omitempty"`
|
||||
AuthAccountFlags *uint32 `protobuf:"varint,16,opt,name=auth_account_flags" json:"auth_account_flags,omitempty"`
|
||||
TokenSource *uint32 `protobuf:"varint,22,opt,name=token_source" json:"token_source,omitempty"`
|
||||
AdminSpoofingUser *bool `protobuf:"varint,23,opt,name=admin_spoofing_user" json:"admin_spoofing_user,omitempty"`
|
||||
TransportError *int32 `protobuf:"varint,17,opt,name=transport_error,def=1" json:"transport_error,omitempty"`
|
||||
Messageid *uint64 `protobuf:"varint,18,opt,name=messageid,def=18446744073709551615" json:"messageid,omitempty"`
|
||||
PublisherGroupId *uint32 `protobuf:"varint,19,opt,name=publisher_group_id" json:"publisher_group_id,omitempty"`
|
||||
Sysid *uint32 `protobuf:"varint,20,opt,name=sysid" json:"sysid,omitempty"`
|
||||
TraceTag *uint64 `protobuf:"varint,21,opt,name=trace_tag" json:"trace_tag,omitempty"`
|
||||
WebapiKeyId *uint32 `protobuf:"varint,25,opt,name=webapi_key_id" json:"webapi_key_id,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) Reset() { *m = CMsgProtoBufHeader{} }
|
||||
func (m *CMsgProtoBufHeader) String() string { return proto.CompactTextString(m) }
|
||||
func (*CMsgProtoBufHeader) ProtoMessage() {}
|
||||
func (*CMsgProtoBufHeader) Descriptor() ([]byte, []int) { return base_fileDescriptor0, []int{0} }
|
||||
|
||||
const Default_CMsgProtoBufHeader_JobidSource uint64 = 18446744073709551615
|
||||
const Default_CMsgProtoBufHeader_JobidTarget uint64 = 18446744073709551615
|
||||
const Default_CMsgProtoBufHeader_Eresult int32 = 2
|
||||
const Default_CMsgProtoBufHeader_TransportError int32 = 1
|
||||
const Default_CMsgProtoBufHeader_Messageid uint64 = 18446744073709551615
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetClientSessionid() int32 {
|
||||
if m != nil && m.ClientSessionid != nil {
|
||||
return *m.ClientSessionid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetRoutingAppid() uint32 {
|
||||
if m != nil && m.RoutingAppid != nil {
|
||||
return *m.RoutingAppid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetJobidSource() uint64 {
|
||||
if m != nil && m.JobidSource != nil {
|
||||
return *m.JobidSource
|
||||
}
|
||||
return Default_CMsgProtoBufHeader_JobidSource
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetJobidTarget() uint64 {
|
||||
if m != nil && m.JobidTarget != nil {
|
||||
return *m.JobidTarget
|
||||
}
|
||||
return Default_CMsgProtoBufHeader_JobidTarget
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetTargetJobName() string {
|
||||
if m != nil && m.TargetJobName != nil {
|
||||
return *m.TargetJobName
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetSeqNum() int32 {
|
||||
if m != nil && m.SeqNum != nil {
|
||||
return *m.SeqNum
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetEresult() int32 {
|
||||
if m != nil && m.Eresult != nil {
|
||||
return *m.Eresult
|
||||
}
|
||||
return Default_CMsgProtoBufHeader_Eresult
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetErrorMessage() string {
|
||||
if m != nil && m.ErrorMessage != nil {
|
||||
return *m.ErrorMessage
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetIp() uint32 {
|
||||
if m != nil && m.Ip != nil {
|
||||
return *m.Ip
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetAuthAccountFlags() uint32 {
|
||||
if m != nil && m.AuthAccountFlags != nil {
|
||||
return *m.AuthAccountFlags
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetTokenSource() uint32 {
|
||||
if m != nil && m.TokenSource != nil {
|
||||
return *m.TokenSource
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetAdminSpoofingUser() bool {
|
||||
if m != nil && m.AdminSpoofingUser != nil {
|
||||
return *m.AdminSpoofingUser
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetTransportError() int32 {
|
||||
if m != nil && m.TransportError != nil {
|
||||
return *m.TransportError
|
||||
}
|
||||
return Default_CMsgProtoBufHeader_TransportError
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetMessageid() uint64 {
|
||||
if m != nil && m.Messageid != nil {
|
||||
return *m.Messageid
|
||||
}
|
||||
return Default_CMsgProtoBufHeader_Messageid
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetPublisherGroupId() uint32 {
|
||||
if m != nil && m.PublisherGroupId != nil {
|
||||
return *m.PublisherGroupId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetSysid() uint32 {
|
||||
if m != nil && m.Sysid != nil {
|
||||
return *m.Sysid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetTraceTag() uint64 {
|
||||
if m != nil && m.TraceTag != nil {
|
||||
return *m.TraceTag
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgProtoBufHeader) GetWebapiKeyId() uint32 {
|
||||
if m != nil && m.WebapiKeyId != nil {
|
||||
return *m.WebapiKeyId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CMsgMulti struct {
|
||||
SizeUnzipped *uint32 `protobuf:"varint,1,opt,name=size_unzipped" json:"size_unzipped,omitempty"`
|
||||
MessageBody []byte `protobuf:"bytes,2,opt,name=message_body" json:"message_body,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CMsgMulti) Reset() { *m = CMsgMulti{} }
|
||||
func (m *CMsgMulti) String() string { return proto.CompactTextString(m) }
|
||||
func (*CMsgMulti) ProtoMessage() {}
|
||||
func (*CMsgMulti) Descriptor() ([]byte, []int) { return base_fileDescriptor0, []int{1} }
|
||||
|
||||
func (m *CMsgMulti) GetSizeUnzipped() uint32 {
|
||||
if m != nil && m.SizeUnzipped != nil {
|
||||
return *m.SizeUnzipped
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgMulti) GetMessageBody() []byte {
|
||||
if m != nil {
|
||||
return m.MessageBody
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CMsgProtobufWrapped struct {
|
||||
MessageBody []byte `protobuf:"bytes,1,opt,name=message_body" json:"message_body,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CMsgProtobufWrapped) Reset() { *m = CMsgProtobufWrapped{} }
|
||||
func (m *CMsgProtobufWrapped) String() string { return proto.CompactTextString(m) }
|
||||
func (*CMsgProtobufWrapped) ProtoMessage() {}
|
||||
func (*CMsgProtobufWrapped) Descriptor() ([]byte, []int) { return base_fileDescriptor0, []int{2} }
|
||||
|
||||
func (m *CMsgProtobufWrapped) GetMessageBody() []byte {
|
||||
if m != nil {
|
||||
return m.MessageBody
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CMsgAuthTicket struct {
|
||||
Estate *uint32 `protobuf:"varint,1,opt,name=estate" json:"estate,omitempty"`
|
||||
Eresult *uint32 `protobuf:"varint,2,opt,name=eresult,def=2" json:"eresult,omitempty"`
|
||||
Steamid *uint64 `protobuf:"fixed64,3,opt,name=steamid" json:"steamid,omitempty"`
|
||||
Gameid *uint64 `protobuf:"fixed64,4,opt,name=gameid" json:"gameid,omitempty"`
|
||||
HSteamPipe *uint32 `protobuf:"varint,5,opt,name=h_steam_pipe" json:"h_steam_pipe,omitempty"`
|
||||
TicketCrc *uint32 `protobuf:"varint,6,opt,name=ticket_crc" json:"ticket_crc,omitempty"`
|
||||
Ticket []byte `protobuf:"bytes,7,opt,name=ticket" json:"ticket,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CMsgAuthTicket) Reset() { *m = CMsgAuthTicket{} }
|
||||
func (m *CMsgAuthTicket) String() string { return proto.CompactTextString(m) }
|
||||
func (*CMsgAuthTicket) ProtoMessage() {}
|
||||
func (*CMsgAuthTicket) Descriptor() ([]byte, []int) { return base_fileDescriptor0, []int{3} }
|
||||
|
||||
const Default_CMsgAuthTicket_Eresult uint32 = 2
|
||||
|
||||
func (m *CMsgAuthTicket) GetEstate() uint32 {
|
||||
if m != nil && m.Estate != nil {
|
||||
return *m.Estate
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgAuthTicket) GetEresult() uint32 {
|
||||
if m != nil && m.Eresult != nil {
|
||||
return *m.Eresult
|
||||
}
|
||||
return Default_CMsgAuthTicket_Eresult
|
||||
}
|
||||
|
||||
func (m *CMsgAuthTicket) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgAuthTicket) GetGameid() uint64 {
|
||||
if m != nil && m.Gameid != nil {
|
||||
return *m.Gameid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgAuthTicket) GetHSteamPipe() uint32 {
|
||||
if m != nil && m.HSteamPipe != nil {
|
||||
return *m.HSteamPipe
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgAuthTicket) GetTicketCrc() uint32 {
|
||||
if m != nil && m.TicketCrc != nil {
|
||||
return *m.TicketCrc
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CMsgAuthTicket) GetTicket() []byte {
|
||||
if m != nil {
|
||||
return m.Ticket
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CCDDBAppDetailCommon struct {
|
||||
Appid *uint32 `protobuf:"varint,1,opt,name=appid" json:"appid,omitempty"`
|
||||
Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
|
||||
Icon *string `protobuf:"bytes,3,opt,name=icon" json:"icon,omitempty"`
|
||||
Logo *string `protobuf:"bytes,4,opt,name=logo" json:"logo,omitempty"`
|
||||
LogoSmall *string `protobuf:"bytes,5,opt,name=logo_small" json:"logo_small,omitempty"`
|
||||
Tool *bool `protobuf:"varint,6,opt,name=tool" json:"tool,omitempty"`
|
||||
Demo *bool `protobuf:"varint,7,opt,name=demo" json:"demo,omitempty"`
|
||||
Media *bool `protobuf:"varint,8,opt,name=media" json:"media,omitempty"`
|
||||
CommunityVisibleStats *bool `protobuf:"varint,9,opt,name=community_visible_stats" json:"community_visible_stats,omitempty"`
|
||||
FriendlyName *string `protobuf:"bytes,10,opt,name=friendly_name" json:"friendly_name,omitempty"`
|
||||
Propagation *string `protobuf:"bytes,11,opt,name=propagation" json:"propagation,omitempty"`
|
||||
HasAdultContent *bool `protobuf:"varint,12,opt,name=has_adult_content" json:"has_adult_content,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCDDBAppDetailCommon) Reset() { *m = CCDDBAppDetailCommon{} }
|
||||
func (m *CCDDBAppDetailCommon) String() string { return proto.CompactTextString(m) }
|
||||
func (*CCDDBAppDetailCommon) ProtoMessage() {}
|
||||
func (*CCDDBAppDetailCommon) Descriptor() ([]byte, []int) { return base_fileDescriptor0, []int{4} }
|
||||
|
||||
func (m *CCDDBAppDetailCommon) GetAppid() uint32 {
|
||||
if m != nil && m.Appid != nil {
|
||||
return *m.Appid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCDDBAppDetailCommon) GetName() string {
|
||||
if m != nil && m.Name != nil {
|
||||
return *m.Name
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCDDBAppDetailCommon) GetIcon() string {
|
||||
if m != nil && m.Icon != nil {
|
||||
return *m.Icon
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCDDBAppDetailCommon) GetLogo() string {
|
||||
if m != nil && m.Logo != nil {
|
||||
return *m.Logo
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCDDBAppDetailCommon) GetLogoSmall() string {
|
||||
if m != nil && m.LogoSmall != nil {
|
||||
return *m.LogoSmall
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCDDBAppDetailCommon) GetTool() bool {
|
||||
if m != nil && m.Tool != nil {
|
||||
return *m.Tool
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCDDBAppDetailCommon) GetDemo() bool {
|
||||
if m != nil && m.Demo != nil {
|
||||
return *m.Demo
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCDDBAppDetailCommon) GetMedia() bool {
|
||||
if m != nil && m.Media != nil {
|
||||
return *m.Media
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCDDBAppDetailCommon) GetCommunityVisibleStats() bool {
|
||||
if m != nil && m.CommunityVisibleStats != nil {
|
||||
return *m.CommunityVisibleStats
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCDDBAppDetailCommon) GetFriendlyName() string {
|
||||
if m != nil && m.FriendlyName != nil {
|
||||
return *m.FriendlyName
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCDDBAppDetailCommon) GetPropagation() string {
|
||||
if m != nil && m.Propagation != nil {
|
||||
return *m.Propagation
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCDDBAppDetailCommon) GetHasAdultContent() bool {
|
||||
if m != nil && m.HasAdultContent != nil {
|
||||
return *m.HasAdultContent
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type CMsgAppRights struct {
|
||||
EditInfo *bool `protobuf:"varint,1,opt,name=edit_info" json:"edit_info,omitempty"`
|
||||
Publish *bool `protobuf:"varint,2,opt,name=publish" json:"publish,omitempty"`
|
||||
ViewErrorData *bool `protobuf:"varint,3,opt,name=view_error_data" json:"view_error_data,omitempty"`
|
||||
Download *bool `protobuf:"varint,4,opt,name=download" json:"download,omitempty"`
|
||||
UploadCdkeys *bool `protobuf:"varint,5,opt,name=upload_cdkeys" json:"upload_cdkeys,omitempty"`
|
||||
GenerateCdkeys *bool `protobuf:"varint,6,opt,name=generate_cdkeys" json:"generate_cdkeys,omitempty"`
|
||||
ViewFinancials *bool `protobuf:"varint,7,opt,name=view_financials" json:"view_financials,omitempty"`
|
||||
ManageCeg *bool `protobuf:"varint,8,opt,name=manage_ceg" json:"manage_ceg,omitempty"`
|
||||
ManageSigning *bool `protobuf:"varint,9,opt,name=manage_signing" json:"manage_signing,omitempty"`
|
||||
ManageCdkeys *bool `protobuf:"varint,10,opt,name=manage_cdkeys" json:"manage_cdkeys,omitempty"`
|
||||
EditMarketing *bool `protobuf:"varint,11,opt,name=edit_marketing" json:"edit_marketing,omitempty"`
|
||||
EconomySupport *bool `protobuf:"varint,12,opt,name=economy_support" json:"economy_support,omitempty"`
|
||||
EconomySupportSupervisor *bool `protobuf:"varint,13,opt,name=economy_support_supervisor" json:"economy_support_supervisor,omitempty"`
|
||||
ManagePricing *bool `protobuf:"varint,14,opt,name=manage_pricing" json:"manage_pricing,omitempty"`
|
||||
BroadcastLive *bool `protobuf:"varint,15,opt,name=broadcast_live" json:"broadcast_live,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) Reset() { *m = CMsgAppRights{} }
|
||||
func (m *CMsgAppRights) String() string { return proto.CompactTextString(m) }
|
||||
func (*CMsgAppRights) ProtoMessage() {}
|
||||
func (*CMsgAppRights) Descriptor() ([]byte, []int) { return base_fileDescriptor0, []int{5} }
|
||||
|
||||
func (m *CMsgAppRights) GetEditInfo() bool {
|
||||
if m != nil && m.EditInfo != nil {
|
||||
return *m.EditInfo
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetPublish() bool {
|
||||
if m != nil && m.Publish != nil {
|
||||
return *m.Publish
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetViewErrorData() bool {
|
||||
if m != nil && m.ViewErrorData != nil {
|
||||
return *m.ViewErrorData
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetDownload() bool {
|
||||
if m != nil && m.Download != nil {
|
||||
return *m.Download
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetUploadCdkeys() bool {
|
||||
if m != nil && m.UploadCdkeys != nil {
|
||||
return *m.UploadCdkeys
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetGenerateCdkeys() bool {
|
||||
if m != nil && m.GenerateCdkeys != nil {
|
||||
return *m.GenerateCdkeys
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetViewFinancials() bool {
|
||||
if m != nil && m.ViewFinancials != nil {
|
||||
return *m.ViewFinancials
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetManageCeg() bool {
|
||||
if m != nil && m.ManageCeg != nil {
|
||||
return *m.ManageCeg
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetManageSigning() bool {
|
||||
if m != nil && m.ManageSigning != nil {
|
||||
return *m.ManageSigning
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetManageCdkeys() bool {
|
||||
if m != nil && m.ManageCdkeys != nil {
|
||||
return *m.ManageCdkeys
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetEditMarketing() bool {
|
||||
if m != nil && m.EditMarketing != nil {
|
||||
return *m.EditMarketing
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetEconomySupport() bool {
|
||||
if m != nil && m.EconomySupport != nil {
|
||||
return *m.EconomySupport
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetEconomySupportSupervisor() bool {
|
||||
if m != nil && m.EconomySupportSupervisor != nil {
|
||||
return *m.EconomySupportSupervisor
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetManagePricing() bool {
|
||||
if m != nil && m.ManagePricing != nil {
|
||||
return *m.ManagePricing
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CMsgAppRights) GetBroadcastLive() bool {
|
||||
if m != nil && m.BroadcastLive != nil {
|
||||
return *m.BroadcastLive
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
var E_MsgpoolSoftLimit = &proto.ExtensionDesc{
|
||||
ExtendedType: (*google_protobuf.MessageOptions)(nil),
|
||||
ExtensionType: (*int32)(nil),
|
||||
Field: 50000,
|
||||
Name: "msgpool_soft_limit",
|
||||
Tag: "varint,50000,opt,name=msgpool_soft_limit,def=32",
|
||||
}
|
||||
|
||||
var E_MsgpoolHardLimit = &proto.ExtensionDesc{
|
||||
ExtendedType: (*google_protobuf.MessageOptions)(nil),
|
||||
ExtensionType: (*int32)(nil),
|
||||
Field: 50001,
|
||||
Name: "msgpool_hard_limit",
|
||||
Tag: "varint,50001,opt,name=msgpool_hard_limit,def=384",
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*CMsgProtoBufHeader)(nil), "CMsgProtoBufHeader")
|
||||
proto.RegisterType((*CMsgMulti)(nil), "CMsgMulti")
|
||||
proto.RegisterType((*CMsgProtobufWrapped)(nil), "CMsgProtobufWrapped")
|
||||
proto.RegisterType((*CMsgAuthTicket)(nil), "CMsgAuthTicket")
|
||||
proto.RegisterType((*CCDDBAppDetailCommon)(nil), "CCDDBAppDetailCommon")
|
||||
proto.RegisterType((*CMsgAppRights)(nil), "CMsgAppRights")
|
||||
proto.RegisterExtension(E_MsgpoolSoftLimit)
|
||||
proto.RegisterExtension(E_MsgpoolHardLimit)
|
||||
}
|
||||
|
||||
var base_fileDescriptor0 = []byte{
|
||||
// 906 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x54, 0x4d, 0x6f, 0x1c, 0x45,
|
||||
0x10, 0x65, 0x77, 0xfd, 0x31, 0xdb, 0xde, 0x5d, 0xdb, 0x63, 0x27, 0xee, 0x98, 0x43, 0xa2, 0xbd,
|
||||
0x80, 0x40, 0x72, 0xe2, 0x78, 0x1d, 0x1b, 0xdf, 0xfc, 0x71, 0xc8, 0xc5, 0x02, 0x21, 0x24, 0x8e,
|
||||
0xad, 0x9e, 0x99, 0xda, 0xd9, 0xc6, 0x33, 0xdd, 0x4d, 0x77, 0x8f, 0xad, 0xcd, 0x89, 0x13, 0x57,
|
||||
0xfe, 0x1a, 0xfc, 0x12, 0x6e, 0x88, 0x23, 0xd5, 0x35, 0xb3, 0x38, 0x04, 0x81, 0x72, 0x1a, 0x55,
|
||||
0xd5, 0xeb, 0xaa, 0x57, 0xaf, 0xaa, 0x86, 0x71, 0x1f, 0x40, 0xd6, 0x35, 0x78, 0x2f, 0x4b, 0xf0,
|
||||
0x22, 0x93, 0x1e, 0x8e, 0xac, 0x33, 0xc1, 0x1c, 0xbe, 0x28, 0x8d, 0x29, 0x2b, 0x78, 0x49, 0x56,
|
||||
0xd6, 0xcc, 0x5f, 0x16, 0xe0, 0x73, 0xa7, 0x6c, 0x30, 0xae, 0x45, 0x4c, 0xff, 0x1c, 0xb0, 0xf4,
|
||||
0xfa, 0xd6, 0x97, 0xdf, 0x44, 0xeb, 0xaa, 0x99, 0xbf, 0x05, 0x59, 0x80, 0x4b, 0xb7, 0xd9, 0x26,
|
||||
0x25, 0x55, 0x05, 0xef, 0xbd, 0xe8, 0x7d, 0xbe, 0x91, 0x72, 0xb6, 0x93, 0x57, 0x0a, 0x74, 0x10,
|
||||
0x1e, 0xeb, 0x28, 0xa3, 0x31, 0xd2, 0xc7, 0xc8, 0x7a, 0xfa, 0x84, 0x8d, 0x9d, 0x69, 0x82, 0xd2,
|
||||
0xa5, 0x90, 0xd6, 0xa2, 0x7b, 0x80, 0xee, 0x71, 0xfa, 0x05, 0x1b, 0xfd, 0x60, 0x32, 0x55, 0x08,
|
||||
0x6f, 0x1a, 0x97, 0x03, 0x67, 0x31, 0xcd, 0xc5, 0xfe, 0xf1, 0xf9, 0x6c, 0xf6, 0xe6, 0x6c, 0x36,
|
||||
0x7b, 0x75, 0x76, 0x72, 0xf6, 0xea, 0xab, 0xd3, 0xd3, 0xe3, 0x37, 0xc7, 0xa7, 0x8f, 0xd8, 0x20,
|
||||
0x5d, 0x09, 0x81, 0x6f, 0xfd, 0x0f, 0xf6, 0x80, 0x6d, 0xb7, 0x28, 0x81, 0x4f, 0x84, 0x96, 0x35,
|
||||
0xf0, 0x11, 0xc2, 0x87, 0x44, 0x19, 0x7e, 0x14, 0xba, 0xa9, 0x39, 0x27, 0x62, 0x29, 0xdb, 0x04,
|
||||
0x07, 0xbe, 0xa9, 0x02, 0x1f, 0x47, 0xc7, 0x45, 0xef, 0x75, 0x24, 0x0b, 0xce, 0x19, 0x27, 0x3a,
|
||||
0xb5, 0xf8, 0x84, 0xde, 0x32, 0xd6, 0x57, 0x96, 0x6f, 0x13, 0xf1, 0x43, 0x96, 0xca, 0x26, 0x2c,
|
||||
0x84, 0xcc, 0x73, 0xd3, 0x60, 0xbf, 0xf3, 0x4a, 0x96, 0x9e, 0xef, 0x50, 0x6c, 0x9f, 0x8d, 0x82,
|
||||
0xb9, 0x03, 0xbd, 0x6a, 0xea, 0x29, 0x79, 0x3f, 0x65, 0x7b, 0xb2, 0xa8, 0x15, 0x7a, 0xad, 0x31,
|
||||
0xf3, 0x28, 0x44, 0xe3, 0xc1, 0xf1, 0x03, 0x0c, 0x26, 0x98, 0x6e, 0x3b, 0x38, 0xa9, 0x31, 0xe4,
|
||||
0x82, 0xa0, 0xda, 0x7c, 0xb7, 0x65, 0x73, 0x9c, 0x7e, 0xc6, 0x86, 0x1d, 0x0f, 0x94, 0x2d, 0x45,
|
||||
0xef, 0xda, 0x7f, 0x34, 0x8d, 0x9c, 0x6c, 0x93, 0x55, 0xca, 0x2f, 0xc0, 0x89, 0x12, 0xe5, 0xb6,
|
||||
0x02, 0x5f, 0xec, 0x51, 0xf5, 0x31, 0x5b, 0xf7, 0x4b, 0x8f, 0xe6, 0x3e, 0x99, 0xbb, 0x6c, 0x88,
|
||||
0xf5, 0x72, 0x40, 0x2d, 0x4b, 0xfe, 0x24, 0xe6, 0x8c, 0x4d, 0x3f, 0x40, 0x26, 0xad, 0x12, 0x77,
|
||||
0xb0, 0x8c, 0x0f, 0x9f, 0x45, 0xe4, 0xf4, 0x9c, 0x0d, 0xe3, 0xe4, 0x6f, 0x51, 0x20, 0x15, 0x31,
|
||||
0x5e, 0xbd, 0x03, 0xd1, 0xe8, 0x77, 0xca, 0x5a, 0x68, 0xc7, 0x4e, 0x0d, 0x77, 0x0c, 0x45, 0x66,
|
||||
0x8a, 0x25, 0x8d, 0x7c, 0x34, 0xfd, 0x92, 0xed, 0xfd, 0xbd, 0x33, 0xb8, 0x55, 0xdf, 0x3b, 0x19,
|
||||
0x9f, 0xfc, 0x0b, 0xdc, 0x23, 0xf0, 0x2f, 0x3d, 0x36, 0x89, 0xe8, 0x4b, 0x14, 0xf5, 0x3b, 0x95,
|
||||
0xdf, 0x41, 0x48, 0x27, 0x6c, 0x03, 0x7c, 0x90, 0x01, 0xba, 0x2a, 0xef, 0x4d, 0x2a, 0x16, 0x18,
|
||||
0xc7, 0x49, 0xbd, 0xb7, 0x81, 0x03, 0xda, 0x40, 0x7c, 0x54, 0xe2, 0xb4, 0xd1, 0x5e, 0x23, 0x1b,
|
||||
0xab, 0x2d, 0x04, 0x41, 0x84, 0x55, 0x16, 0xf8, 0x7a, 0x97, 0x8a, 0x05, 0x2a, 0x22, 0x72, 0x97,
|
||||
0xf3, 0x0d, 0xf2, 0xe1, 0xcb, 0xd6, 0xc7, 0x37, 0x89, 0xd1, 0x1f, 0x3d, 0xb6, 0x7f, 0x7d, 0x7d,
|
||||
0x73, 0x73, 0x75, 0x69, 0xed, 0x0d, 0x04, 0xa9, 0xaa, 0x6b, 0x53, 0xd7, 0x46, 0x47, 0x29, 0xdb,
|
||||
0x15, 0x6e, 0x69, 0x8d, 0xd8, 0x1a, 0xed, 0x57, 0x9f, 0x76, 0x04, 0x2d, 0x95, 0x1b, 0x4d, 0x6c,
|
||||
0xc8, 0xaa, 0x4c, 0x69, 0x88, 0xcb, 0x30, 0x56, 0x8d, 0x96, 0xf0, 0xb5, 0xac, 0x2a, 0x62, 0x42,
|
||||
0x88, 0x60, 0x4c, 0x45, 0x1c, 0x92, 0x68, 0x15, 0x50, 0x1b, 0x62, 0x90, 0xc4, 0x42, 0x35, 0x14,
|
||||
0x4a, 0xf2, 0x84, 0xcc, 0xe7, 0xec, 0x20, 0x47, 0x06, 0x8d, 0x56, 0x61, 0x29, 0xee, 0x95, 0x57,
|
||||
0x59, 0x05, 0x22, 0x0a, 0xe4, 0xf9, 0x90, 0x00, 0x38, 0x9d, 0xb9, 0xc3, 0xeb, 0x2b, 0xaa, 0x65,
|
||||
0xbb, 0xf2, 0x8c, 0x4a, 0xec, 0xb1, 0x2d, 0xbc, 0x62, 0x2b, 0x4b, 0x19, 0xf0, 0x22, 0xe9, 0x6c,
|
||||
0x86, 0xe9, 0x33, 0xb6, 0xbb, 0x90, 0x5e, 0xc8, 0x02, 0xe5, 0x14, 0x48, 0x38, 0xe0, 0xd1, 0xd2,
|
||||
0x89, 0x24, 0xd3, 0xdf, 0xfb, 0x6c, 0x4c, 0xa3, 0xb0, 0xf6, 0x5b, 0x55, 0x2e, 0x82, 0x8f, 0xdb,
|
||||
0x82, 0x3c, 0x82, 0x50, 0x7a, 0x6e, 0xa8, 0xeb, 0x24, 0x0a, 0xdf, 0xed, 0x1a, 0x35, 0x9e, 0xc4,
|
||||
0x8b, 0xbb, 0x57, 0xf0, 0xd0, 0x2e, 0xaf, 0x28, 0x64, 0x90, 0xa4, 0x41, 0x92, 0xee, 0xb0, 0xa4,
|
||||
0x30, 0x0f, 0xba, 0x32, 0xb2, 0x9d, 0x09, 0xf1, 0x6c, 0x6c, 0xb4, 0x45, 0x5e, 0xe0, 0xae, 0x79,
|
||||
0x92, 0x82, 0x32, 0x94, 0xa0, 0xc1, 0xe1, 0xc4, 0x57, 0x81, 0x8d, 0x7f, 0xa4, 0xc6, 0xa3, 0x91,
|
||||
0x3a, 0x57, 0xb2, 0xf2, 0x9d, 0x40, 0x28, 0x68, 0x2d, 0x75, 0xdc, 0xa4, 0x1c, 0xca, 0x4e, 0xa5,
|
||||
0xa7, 0x6c, 0xd2, 0xf9, 0xbc, 0x2a, 0x35, 0x9e, 0xd9, 0xa3, 0x38, 0x2b, 0x6c, 0x9b, 0x9b, 0xad,
|
||||
0xe0, 0xd4, 0x5a, 0x2d, 0x1d, 0x8e, 0x3e, 0xc2, 0xb7, 0x56, 0x35, 0x01, 0x65, 0x31, 0xf5, 0x52,
|
||||
0xf8, 0xc6, 0xc6, 0xb3, 0x6c, 0xd5, 0x49, 0xa7, 0xec, 0xf0, 0x83, 0x40, 0xfc, 0x82, 0xc3, 0x81,
|
||||
0xe0, 0xd1, 0x8e, 0x3f, 0xe0, 0x60, 0x9d, 0xca, 0x63, 0xd2, 0xc9, 0xca, 0x9f, 0x39, 0xec, 0x3b,
|
||||
0x97, 0x3e, 0x88, 0x4a, 0xdd, 0x03, 0xfd, 0x4c, 0x92, 0x8b, 0x4b, 0x96, 0xd6, 0xbe, 0xc4, 0xdf,
|
||||
0x42, 0x85, 0xbf, 0x8c, 0x79, 0x0c, 0xd5, 0x2a, 0xa4, 0xcf, 0x8f, 0xda, 0xff, 0xf2, 0xd1, 0xea,
|
||||
0xbf, 0x7c, 0x74, 0xdb, 0xde, 0xcd, 0xd7, 0x36, 0x0e, 0xd2, 0xf3, 0x5f, 0x7f, 0x1e, 0xd0, 0x3f,
|
||||
0xa2, 0x7f, 0xf2, 0xfa, 0xe2, 0xea, 0x31, 0xc5, 0x42, 0xba, 0xe2, 0x63, 0x53, 0xfc, 0xd6, 0xa5,
|
||||
0x18, 0x9c, 0x9c, 0xcf, 0xae, 0xd6, 0xdf, 0xf6, 0x7e, 0xea, 0x7d, 0xf2, 0x57, 0x00, 0x00, 0x00,
|
||||
0xff, 0xff, 0x66, 0x1a, 0xa6, 0xfc, 0x29, 0x06, 0x00, 0x00,
|
||||
}
|
||||
9259
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_server.pb.go
generated
vendored
Normal file
9259
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_server.pb.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8018
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_server_2.pb.go
generated
vendored
Normal file
8018
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_server_2.pb.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
289
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/content_manifest.pb.go
generated
vendored
Normal file
289
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/content_manifest.pb.go
generated
vendored
Normal file
@@ -0,0 +1,289 @@
|
||||
// Code generated by protoc-gen-go.
|
||||
// source: content_manifest.proto
|
||||
// DO NOT EDIT!
|
||||
|
||||
package protobuf
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
import fmt "fmt"
|
||||
import math "math"
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
type ContentManifestPayload struct {
|
||||
Mappings []*ContentManifestPayload_FileMapping `protobuf:"bytes,1,rep,name=mappings" json:"mappings,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload) Reset() { *m = ContentManifestPayload{} }
|
||||
func (m *ContentManifestPayload) String() string { return proto.CompactTextString(m) }
|
||||
func (*ContentManifestPayload) ProtoMessage() {}
|
||||
func (*ContentManifestPayload) Descriptor() ([]byte, []int) { return content_manifest_fileDescriptor0, []int{0} }
|
||||
|
||||
func (m *ContentManifestPayload) GetMappings() []*ContentManifestPayload_FileMapping {
|
||||
if m != nil {
|
||||
return m.Mappings
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type ContentManifestPayload_FileMapping struct {
|
||||
Filename *string `protobuf:"bytes,1,opt,name=filename" json:"filename,omitempty"`
|
||||
Size *uint64 `protobuf:"varint,2,opt,name=size" json:"size,omitempty"`
|
||||
Flags *uint32 `protobuf:"varint,3,opt,name=flags" json:"flags,omitempty"`
|
||||
ShaFilename []byte `protobuf:"bytes,4,opt,name=sha_filename" json:"sha_filename,omitempty"`
|
||||
ShaContent []byte `protobuf:"bytes,5,opt,name=sha_content" json:"sha_content,omitempty"`
|
||||
Chunks []*ContentManifestPayload_FileMapping_ChunkData `protobuf:"bytes,6,rep,name=chunks" json:"chunks,omitempty"`
|
||||
Linktarget *string `protobuf:"bytes,7,opt,name=linktarget" json:"linktarget,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping) Reset() { *m = ContentManifestPayload_FileMapping{} }
|
||||
func (m *ContentManifestPayload_FileMapping) String() string { return proto.CompactTextString(m) }
|
||||
func (*ContentManifestPayload_FileMapping) ProtoMessage() {}
|
||||
func (*ContentManifestPayload_FileMapping) Descriptor() ([]byte, []int) {
|
||||
return content_manifest_fileDescriptor0, []int{0, 0}
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping) GetFilename() string {
|
||||
if m != nil && m.Filename != nil {
|
||||
return *m.Filename
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping) GetSize() uint64 {
|
||||
if m != nil && m.Size != nil {
|
||||
return *m.Size
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping) GetFlags() uint32 {
|
||||
if m != nil && m.Flags != nil {
|
||||
return *m.Flags
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping) GetShaFilename() []byte {
|
||||
if m != nil {
|
||||
return m.ShaFilename
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping) GetShaContent() []byte {
|
||||
if m != nil {
|
||||
return m.ShaContent
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping) GetChunks() []*ContentManifestPayload_FileMapping_ChunkData {
|
||||
if m != nil {
|
||||
return m.Chunks
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping) GetLinktarget() string {
|
||||
if m != nil && m.Linktarget != nil {
|
||||
return *m.Linktarget
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type ContentManifestPayload_FileMapping_ChunkData struct {
|
||||
Sha []byte `protobuf:"bytes,1,opt,name=sha" json:"sha,omitempty"`
|
||||
Crc *uint32 `protobuf:"fixed32,2,opt,name=crc" json:"crc,omitempty"`
|
||||
Offset *uint64 `protobuf:"varint,3,opt,name=offset" json:"offset,omitempty"`
|
||||
CbOriginal *uint32 `protobuf:"varint,4,opt,name=cb_original" json:"cb_original,omitempty"`
|
||||
CbCompressed *uint32 `protobuf:"varint,5,opt,name=cb_compressed" json:"cb_compressed,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping_ChunkData) Reset() {
|
||||
*m = ContentManifestPayload_FileMapping_ChunkData{}
|
||||
}
|
||||
func (m *ContentManifestPayload_FileMapping_ChunkData) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*ContentManifestPayload_FileMapping_ChunkData) ProtoMessage() {}
|
||||
func (*ContentManifestPayload_FileMapping_ChunkData) Descriptor() ([]byte, []int) {
|
||||
return content_manifest_fileDescriptor0, []int{0, 0, 0}
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping_ChunkData) GetSha() []byte {
|
||||
if m != nil {
|
||||
return m.Sha
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping_ChunkData) GetCrc() uint32 {
|
||||
if m != nil && m.Crc != nil {
|
||||
return *m.Crc
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping_ChunkData) GetOffset() uint64 {
|
||||
if m != nil && m.Offset != nil {
|
||||
return *m.Offset
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping_ChunkData) GetCbOriginal() uint32 {
|
||||
if m != nil && m.CbOriginal != nil {
|
||||
return *m.CbOriginal
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ContentManifestPayload_FileMapping_ChunkData) GetCbCompressed() uint32 {
|
||||
if m != nil && m.CbCompressed != nil {
|
||||
return *m.CbCompressed
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type ContentManifestMetadata struct {
|
||||
DepotId *uint32 `protobuf:"varint,1,opt,name=depot_id" json:"depot_id,omitempty"`
|
||||
GidManifest *uint64 `protobuf:"varint,2,opt,name=gid_manifest" json:"gid_manifest,omitempty"`
|
||||
CreationTime *uint32 `protobuf:"varint,3,opt,name=creation_time" json:"creation_time,omitempty"`
|
||||
FilenamesEncrypted *bool `protobuf:"varint,4,opt,name=filenames_encrypted" json:"filenames_encrypted,omitempty"`
|
||||
CbDiskOriginal *uint64 `protobuf:"varint,5,opt,name=cb_disk_original" json:"cb_disk_original,omitempty"`
|
||||
CbDiskCompressed *uint64 `protobuf:"varint,6,opt,name=cb_disk_compressed" json:"cb_disk_compressed,omitempty"`
|
||||
UniqueChunks *uint32 `protobuf:"varint,7,opt,name=unique_chunks" json:"unique_chunks,omitempty"`
|
||||
CrcEncrypted *uint32 `protobuf:"varint,8,opt,name=crc_encrypted" json:"crc_encrypted,omitempty"`
|
||||
CrcClear *uint32 `protobuf:"varint,9,opt,name=crc_clear" json:"crc_clear,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ContentManifestMetadata) Reset() { *m = ContentManifestMetadata{} }
|
||||
func (m *ContentManifestMetadata) String() string { return proto.CompactTextString(m) }
|
||||
func (*ContentManifestMetadata) ProtoMessage() {}
|
||||
func (*ContentManifestMetadata) Descriptor() ([]byte, []int) { return content_manifest_fileDescriptor0, []int{1} }
|
||||
|
||||
func (m *ContentManifestMetadata) GetDepotId() uint32 {
|
||||
if m != nil && m.DepotId != nil {
|
||||
return *m.DepotId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ContentManifestMetadata) GetGidManifest() uint64 {
|
||||
if m != nil && m.GidManifest != nil {
|
||||
return *m.GidManifest
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ContentManifestMetadata) GetCreationTime() uint32 {
|
||||
if m != nil && m.CreationTime != nil {
|
||||
return *m.CreationTime
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ContentManifestMetadata) GetFilenamesEncrypted() bool {
|
||||
if m != nil && m.FilenamesEncrypted != nil {
|
||||
return *m.FilenamesEncrypted
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *ContentManifestMetadata) GetCbDiskOriginal() uint64 {
|
||||
if m != nil && m.CbDiskOriginal != nil {
|
||||
return *m.CbDiskOriginal
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ContentManifestMetadata) GetCbDiskCompressed() uint64 {
|
||||
if m != nil && m.CbDiskCompressed != nil {
|
||||
return *m.CbDiskCompressed
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ContentManifestMetadata) GetUniqueChunks() uint32 {
|
||||
if m != nil && m.UniqueChunks != nil {
|
||||
return *m.UniqueChunks
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ContentManifestMetadata) GetCrcEncrypted() uint32 {
|
||||
if m != nil && m.CrcEncrypted != nil {
|
||||
return *m.CrcEncrypted
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ContentManifestMetadata) GetCrcClear() uint32 {
|
||||
if m != nil && m.CrcClear != nil {
|
||||
return *m.CrcClear
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type ContentManifestSignature struct {
|
||||
Signature []byte `protobuf:"bytes,1,opt,name=signature" json:"signature,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ContentManifestSignature) Reset() { *m = ContentManifestSignature{} }
|
||||
func (m *ContentManifestSignature) String() string { return proto.CompactTextString(m) }
|
||||
func (*ContentManifestSignature) ProtoMessage() {}
|
||||
func (*ContentManifestSignature) Descriptor() ([]byte, []int) { return content_manifest_fileDescriptor0, []int{2} }
|
||||
|
||||
func (m *ContentManifestSignature) GetSignature() []byte {
|
||||
if m != nil {
|
||||
return m.Signature
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*ContentManifestPayload)(nil), "ContentManifestPayload")
|
||||
proto.RegisterType((*ContentManifestPayload_FileMapping)(nil), "ContentManifestPayload.FileMapping")
|
||||
proto.RegisterType((*ContentManifestPayload_FileMapping_ChunkData)(nil), "ContentManifestPayload.FileMapping.ChunkData")
|
||||
proto.RegisterType((*ContentManifestMetadata)(nil), "ContentManifestMetadata")
|
||||
proto.RegisterType((*ContentManifestSignature)(nil), "ContentManifestSignature")
|
||||
}
|
||||
|
||||
var content_manifest_fileDescriptor0 = []byte{
|
||||
// 409 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x91, 0xbd, 0x8e, 0xd4, 0x30,
|
||||
0x14, 0x85, 0xc9, 0xfc, 0x26, 0x37, 0x09, 0x5a, 0xbc, 0xb0, 0x58, 0x43, 0x83, 0x96, 0x66, 0x9b,
|
||||
0x4d, 0x81, 0x44, 0x49, 0xc3, 0x22, 0x44, 0x33, 0x12, 0x12, 0x0f, 0x10, 0x5d, 0x1c, 0x27, 0x6b,
|
||||
0x4d, 0x62, 0x07, 0xdb, 0x29, 0x96, 0x8a, 0x17, 0xe1, 0x0d, 0x91, 0x78, 0x05, 0x6c, 0x27, 0x99,
|
||||
0x1d, 0x8d, 0x28, 0x28, 0xcf, 0xf1, 0xb5, 0xcf, 0x77, 0x8f, 0xe1, 0x8a, 0x29, 0x69, 0xb9, 0xb4,
|
||||
0x65, 0x87, 0x52, 0xd4, 0xdc, 0xd8, 0xa2, 0xd7, 0xca, 0xaa, 0xeb, 0x3f, 0x0b, 0xb8, 0xba, 0x1b,
|
||||
0x8f, 0xf6, 0xd3, 0xc9, 0x17, 0x7c, 0x68, 0x15, 0x56, 0xe4, 0x1d, 0xc4, 0x1d, 0xf6, 0xbd, 0x90,
|
||||
0x8d, 0xa1, 0xd1, 0xeb, 0xe5, 0x4d, 0xfa, 0xf6, 0x4d, 0xf1, 0xef, 0xd1, 0xe2, 0x93, 0x68, 0xf9,
|
||||
0x7e, 0x9c, 0xdd, 0xfd, 0x5a, 0x40, 0x7a, 0xa2, 0xc9, 0x05, 0xc4, 0xb5, 0x93, 0x12, 0x3b, 0xee,
|
||||
0x9e, 0x89, 0x6e, 0x12, 0x92, 0xc1, 0xca, 0x88, 0x1f, 0x9c, 0x2e, 0x9c, 0x5a, 0x91, 0x1c, 0xd6,
|
||||
0x75, 0x8b, 0x2e, 0x63, 0xe9, 0x64, 0x4e, 0x9e, 0x43, 0x66, 0xee, 0xb1, 0x3c, 0x5e, 0x59, 0x39,
|
||||
0x37, 0x23, 0x97, 0x90, 0x7a, 0x77, 0x5a, 0x82, 0xae, 0x83, 0xf9, 0x1e, 0x36, 0xec, 0x7e, 0x90,
|
||||
0x07, 0x43, 0x37, 0x01, 0xef, 0xf6, 0x3f, 0xf0, 0x8a, 0x3b, 0x7f, 0xe3, 0x23, 0x5a, 0x24, 0x04,
|
||||
0xa0, 0x15, 0xf2, 0x60, 0x51, 0x37, 0xdc, 0xd2, 0xad, 0x47, 0xdb, 0x21, 0x24, 0x8f, 0x03, 0x29,
|
||||
0x2c, 0x5d, 0x68, 0x80, 0xce, 0xbc, 0x60, 0x9a, 0x05, 0xe6, 0x2d, 0x79, 0x0a, 0x1b, 0x55, 0xd7,
|
||||
0xc6, 0x5d, 0x5b, 0x86, 0x1d, 0x1c, 0x1e, 0xfb, 0x56, 0x2a, 0x2d, 0x1a, 0x21, 0xb1, 0x0d, 0xcc,
|
||||
0x39, 0x79, 0x01, 0xb9, 0x33, 0x99, 0xea, 0x7a, 0xcd, 0x8d, 0xe1, 0x55, 0xa0, 0xce, 0xaf, 0x7f,
|
||||
0x47, 0xf0, 0xf2, 0x8c, 0x73, 0xcf, 0x2d, 0x56, 0x3e, 0xd1, 0x75, 0x55, 0xf1, 0x5e, 0xd9, 0x52,
|
||||
0x54, 0x21, 0x36, 0xd4, 0xd1, 0x88, 0xea, 0xf8, 0x6b, 0x53, 0x67, 0xfe, 0x69, 0xcd, 0xd1, 0x0a,
|
||||
0x25, 0x4b, 0x2b, 0x5c, 0x4b, 0x63, 0x77, 0xaf, 0xe0, 0x72, 0xee, 0xcd, 0x94, 0x5c, 0x32, 0xfd,
|
||||
0xd0, 0x5b, 0x97, 0xeb, 0x71, 0x62, 0x42, 0xe1, 0xc2, 0xe1, 0x54, 0xc2, 0x1c, 0x1e, 0x41, 0xd7,
|
||||
0xe1, 0xb5, 0x1d, 0x90, 0xf9, 0xe4, 0x84, 0x76, 0x33, 0x27, 0x0d, 0x52, 0x7c, 0x1f, 0x78, 0x39,
|
||||
0x55, 0xbd, 0x3d, 0xee, 0xa6, 0xd9, 0x49, 0x46, 0x1c, 0xec, 0x67, 0x90, 0x78, 0x9b, 0xb5, 0x1c,
|
||||
0x35, 0x4d, 0xc2, 0xba, 0xb7, 0x40, 0xcf, 0xb6, 0xfd, 0x2a, 0x1a, 0x89, 0x76, 0xd0, 0xdc, 0x8f,
|
||||
0x9b, 0x59, 0x8c, 0x35, 0x7f, 0x58, 0x7f, 0x8e, 0x7e, 0x46, 0x4f, 0xfe, 0x06, 0x00, 0x00, 0xff,
|
||||
0xff, 0xc6, 0x87, 0xdb, 0xe6, 0xaf, 0x02, 0x00, 0x00,
|
||||
}
|
||||
141
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/base.pb.go
generated
vendored
Normal file
141
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/base.pb.go
generated
vendored
Normal file
@@ -0,0 +1,141 @@
|
||||
// Code generated by protoc-gen-go.
|
||||
// source: steammessages_unified_base.steamclient.proto
|
||||
// DO NOT EDIT!
|
||||
|
||||
package unified
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
import fmt "fmt"
|
||||
import math "math"
|
||||
import google_protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor"
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
type EProtoExecutionSite int32
|
||||
|
||||
const (
|
||||
EProtoExecutionSite_k_EProtoExecutionSiteUnknown EProtoExecutionSite = 0
|
||||
EProtoExecutionSite_k_EProtoExecutionSiteSteamClient EProtoExecutionSite = 2
|
||||
)
|
||||
|
||||
var EProtoExecutionSite_name = map[int32]string{
|
||||
0: "k_EProtoExecutionSiteUnknown",
|
||||
2: "k_EProtoExecutionSiteSteamClient",
|
||||
}
|
||||
var EProtoExecutionSite_value = map[string]int32{
|
||||
"k_EProtoExecutionSiteUnknown": 0,
|
||||
"k_EProtoExecutionSiteSteamClient": 2,
|
||||
}
|
||||
|
||||
func (x EProtoExecutionSite) Enum() *EProtoExecutionSite {
|
||||
p := new(EProtoExecutionSite)
|
||||
*p = x
|
||||
return p
|
||||
}
|
||||
func (x EProtoExecutionSite) String() string {
|
||||
return proto.EnumName(EProtoExecutionSite_name, int32(x))
|
||||
}
|
||||
func (x *EProtoExecutionSite) UnmarshalJSON(data []byte) error {
|
||||
value, err := proto.UnmarshalJSONEnum(EProtoExecutionSite_value, data, "EProtoExecutionSite")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*x = EProtoExecutionSite(value)
|
||||
return nil
|
||||
}
|
||||
func (EProtoExecutionSite) EnumDescriptor() ([]byte, []int) { return base_fileDescriptor0, []int{0} }
|
||||
|
||||
type NoResponse struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *NoResponse) Reset() { *m = NoResponse{} }
|
||||
func (m *NoResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*NoResponse) ProtoMessage() {}
|
||||
func (*NoResponse) Descriptor() ([]byte, []int) { return base_fileDescriptor0, []int{0} }
|
||||
|
||||
var E_Description = &proto.ExtensionDesc{
|
||||
ExtendedType: (*google_protobuf.FieldOptions)(nil),
|
||||
ExtensionType: (*string)(nil),
|
||||
Field: 50000,
|
||||
Name: "description",
|
||||
Tag: "bytes,50000,opt,name=description",
|
||||
}
|
||||
|
||||
var E_ServiceDescription = &proto.ExtensionDesc{
|
||||
ExtendedType: (*google_protobuf.ServiceOptions)(nil),
|
||||
ExtensionType: (*string)(nil),
|
||||
Field: 50000,
|
||||
Name: "service_description",
|
||||
Tag: "bytes,50000,opt,name=service_description",
|
||||
}
|
||||
|
||||
var E_ServiceExecutionSite = &proto.ExtensionDesc{
|
||||
ExtendedType: (*google_protobuf.ServiceOptions)(nil),
|
||||
ExtensionType: (*EProtoExecutionSite)(nil),
|
||||
Field: 50008,
|
||||
Name: "service_execution_site",
|
||||
Tag: "varint,50008,opt,name=service_execution_site,enum=EProtoExecutionSite,def=0",
|
||||
}
|
||||
|
||||
var E_MethodDescription = &proto.ExtensionDesc{
|
||||
ExtendedType: (*google_protobuf.MethodOptions)(nil),
|
||||
ExtensionType: (*string)(nil),
|
||||
Field: 50000,
|
||||
Name: "method_description",
|
||||
Tag: "bytes,50000,opt,name=method_description",
|
||||
}
|
||||
|
||||
var E_EnumDescription = &proto.ExtensionDesc{
|
||||
ExtendedType: (*google_protobuf.EnumOptions)(nil),
|
||||
ExtensionType: (*string)(nil),
|
||||
Field: 50000,
|
||||
Name: "enum_description",
|
||||
Tag: "bytes,50000,opt,name=enum_description",
|
||||
}
|
||||
|
||||
var E_EnumValueDescription = &proto.ExtensionDesc{
|
||||
ExtendedType: (*google_protobuf.EnumValueOptions)(nil),
|
||||
ExtensionType: (*string)(nil),
|
||||
Field: 50000,
|
||||
Name: "enum_value_description",
|
||||
Tag: "bytes,50000,opt,name=enum_value_description",
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*NoResponse)(nil), "NoResponse")
|
||||
proto.RegisterEnum("EProtoExecutionSite", EProtoExecutionSite_name, EProtoExecutionSite_value)
|
||||
proto.RegisterExtension(E_Description)
|
||||
proto.RegisterExtension(E_ServiceDescription)
|
||||
proto.RegisterExtension(E_ServiceExecutionSite)
|
||||
proto.RegisterExtension(E_MethodDescription)
|
||||
proto.RegisterExtension(E_EnumDescription)
|
||||
proto.RegisterExtension(E_EnumValueDescription)
|
||||
}
|
||||
|
||||
var base_fileDescriptor0 = []byte{
|
||||
// 306 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x90, 0x4d, 0x4b, 0xc3, 0x40,
|
||||
0x10, 0x86, 0x1b, 0xc5, 0x83, 0xa3, 0x48, 0x48, 0xa5, 0x88, 0x54, 0x8d, 0xe2, 0x41, 0x44, 0xb6,
|
||||
0x20, 0x1e, 0x24, 0x88, 0x07, 0x4b, 0xc4, 0x8b, 0x1f, 0x18, 0xf4, 0x26, 0x21, 0x4d, 0xa6, 0x71,
|
||||
0x69, 0xb2, 0x1b, 0xb2, 0xbb, 0xd5, 0xa3, 0x27, 0x7f, 0x9f, 0x47, 0x7f, 0x8e, 0xcd, 0x86, 0x80,
|
||||
0xf9, 0x40, 0x8f, 0xc9, 0xfb, 0x3e, 0xb3, 0xcf, 0x0c, 0x9c, 0x08, 0x89, 0x41, 0x9a, 0xa2, 0x10,
|
||||
0x41, 0x8c, 0xc2, 0x57, 0x8c, 0x4e, 0x29, 0x46, 0xfe, 0x24, 0x10, 0x48, 0x74, 0x14, 0x26, 0x14,
|
||||
0x99, 0x24, 0x59, 0xce, 0x25, 0xdf, 0xb6, 0x63, 0xce, 0xe3, 0x04, 0x47, 0xfa, 0x6b, 0xa2, 0xa6,
|
||||
0xa3, 0x08, 0x45, 0x98, 0xd3, 0x4c, 0xf2, 0xbc, 0x6c, 0x1c, 0xac, 0x03, 0xdc, 0xf1, 0x47, 0x14,
|
||||
0x19, 0x67, 0x02, 0x8f, 0x5f, 0xa0, 0xef, 0x3e, 0x14, 0xff, 0xdd, 0x77, 0x0c, 0x95, 0xa4, 0x9c,
|
||||
0x79, 0x54, 0xa2, 0x65, 0xc3, 0x70, 0xe6, 0x77, 0x04, 0x4f, 0x6c, 0xc6, 0xf8, 0x1b, 0x33, 0x7b,
|
||||
0xd6, 0x21, 0xd8, 0x9d, 0x0d, 0xaf, 0x50, 0x1a, 0x6b, 0x25, 0x73, 0xc9, 0x39, 0x83, 0xb5, 0x4a,
|
||||
0x60, 0x91, 0x5b, 0x3b, 0xa4, 0xd4, 0x23, 0x95, 0x1e, 0xb9, 0xa6, 0x98, 0x44, 0xf7, 0x3a, 0x15,
|
||||
0x5b, 0x5f, 0x9f, 0xcb, 0xb6, 0x71, 0xb4, 0xea, 0x5c, 0x42, 0x5f, 0x60, 0x3e, 0xa7, 0x21, 0xfa,
|
||||
0xbf, 0xe9, 0xbd, 0x16, 0xed, 0x95, 0xad, 0x26, 0xaf, 0x60, 0x50, 0xf1, 0x58, 0xb9, 0xf9, 0xa2,
|
||||
0xd8, 0xeb, 0xdf, 0x11, 0xdf, 0x7a, 0xc4, 0xc6, 0xe9, 0x26, 0xe9, 0xd8, 0xcd, 0xf9, 0xf3, 0x28,
|
||||
0xce, 0x05, 0x58, 0x29, 0xca, 0x57, 0x1e, 0xd5, 0xac, 0x77, 0x5b, 0x4f, 0xde, 0xea, 0x52, 0x53,
|
||||
0xfa, 0x1c, 0x4c, 0x64, 0x2a, 0xad, 0xb1, 0xc3, 0x16, 0xeb, 0x2e, 0x2a, 0x4d, 0x72, 0x0c, 0x03,
|
||||
0x4d, 0xce, 0x83, 0x44, 0xd5, 0x2f, 0xb6, 0xdf, 0xc9, 0x3f, 0x17, 0xbd, 0xc6, 0x90, 0xab, 0x95,
|
||||
0x1b, 0xe3, 0xc3, 0xe8, 0xfd, 0x04, 0x00, 0x00, 0xff, 0xff, 0x5c, 0xf6, 0x07, 0xbb, 0x6e, 0x02,
|
||||
0x00, 0x00,
|
||||
}
|
||||
1424
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/cloud.pb.go
generated
vendored
Normal file
1424
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/cloud.pb.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
874
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/credentials.pb.go
generated
vendored
Normal file
874
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/credentials.pb.go
generated
vendored
Normal file
@@ -0,0 +1,874 @@
|
||||
// Code generated by protoc-gen-go.
|
||||
// source: steammessages_credentials.steamclient.proto
|
||||
// DO NOT EDIT!
|
||||
|
||||
package unified
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
import fmt "fmt"
|
||||
import math "math"
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
type CCredentials_TestAvailablePassword_Request struct {
|
||||
Password *string `protobuf:"bytes,1,opt,name=password" json:"password,omitempty"`
|
||||
ShaDigestPassword []byte `protobuf:"bytes,2,opt,name=sha_digest_password" json:"sha_digest_password,omitempty"`
|
||||
AccountName *string `protobuf:"bytes,3,opt,name=account_name" json:"account_name,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_TestAvailablePassword_Request) Reset() {
|
||||
*m = CCredentials_TestAvailablePassword_Request{}
|
||||
}
|
||||
func (m *CCredentials_TestAvailablePassword_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CCredentials_TestAvailablePassword_Request) ProtoMessage() {}
|
||||
func (*CCredentials_TestAvailablePassword_Request) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{0}
|
||||
}
|
||||
|
||||
func (m *CCredentials_TestAvailablePassword_Request) GetPassword() string {
|
||||
if m != nil && m.Password != nil {
|
||||
return *m.Password
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_TestAvailablePassword_Request) GetShaDigestPassword() []byte {
|
||||
if m != nil {
|
||||
return m.ShaDigestPassword
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CCredentials_TestAvailablePassword_Request) GetAccountName() string {
|
||||
if m != nil && m.AccountName != nil {
|
||||
return *m.AccountName
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CCredentials_TestAvailablePassword_Response struct {
|
||||
IsValid *bool `protobuf:"varint,3,opt,name=is_valid" json:"is_valid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_TestAvailablePassword_Response) Reset() {
|
||||
*m = CCredentials_TestAvailablePassword_Response{}
|
||||
}
|
||||
func (m *CCredentials_TestAvailablePassword_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CCredentials_TestAvailablePassword_Response) ProtoMessage() {}
|
||||
func (*CCredentials_TestAvailablePassword_Response) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{1}
|
||||
}
|
||||
|
||||
func (m *CCredentials_TestAvailablePassword_Response) GetIsValid() bool {
|
||||
if m != nil && m.IsValid != nil {
|
||||
return *m.IsValid
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type CCredentials_GetSteamGuardDetails_Request struct {
|
||||
IncludeNewAuthentications *bool `protobuf:"varint,1,opt,name=include_new_authentications,def=1" json:"include_new_authentications,omitempty"`
|
||||
Webcookie *string `protobuf:"bytes,2,opt,name=webcookie" json:"webcookie,omitempty"`
|
||||
TimestampMinimumWanted *uint32 `protobuf:"fixed32,3,opt,name=timestamp_minimum_wanted" json:"timestamp_minimum_wanted,omitempty"`
|
||||
Ipaddress *int32 `protobuf:"varint,4,opt,name=ipaddress" json:"ipaddress,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Request) Reset() {
|
||||
*m = CCredentials_GetSteamGuardDetails_Request{}
|
||||
}
|
||||
func (m *CCredentials_GetSteamGuardDetails_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CCredentials_GetSteamGuardDetails_Request) ProtoMessage() {}
|
||||
func (*CCredentials_GetSteamGuardDetails_Request) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{2}
|
||||
}
|
||||
|
||||
const Default_CCredentials_GetSteamGuardDetails_Request_IncludeNewAuthentications bool = true
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Request) GetIncludeNewAuthentications() bool {
|
||||
if m != nil && m.IncludeNewAuthentications != nil {
|
||||
return *m.IncludeNewAuthentications
|
||||
}
|
||||
return Default_CCredentials_GetSteamGuardDetails_Request_IncludeNewAuthentications
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Request) GetWebcookie() string {
|
||||
if m != nil && m.Webcookie != nil {
|
||||
return *m.Webcookie
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Request) GetTimestampMinimumWanted() uint32 {
|
||||
if m != nil && m.TimestampMinimumWanted != nil {
|
||||
return *m.TimestampMinimumWanted
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Request) GetIpaddress() int32 {
|
||||
if m != nil && m.Ipaddress != nil {
|
||||
return *m.Ipaddress
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CCredentials_GetSteamGuardDetails_Response struct {
|
||||
IsSteamguardEnabled *bool `protobuf:"varint,1,opt,name=is_steamguard_enabled" json:"is_steamguard_enabled,omitempty"`
|
||||
TimestampSteamguardEnabled *uint32 `protobuf:"fixed32,2,opt,name=timestamp_steamguard_enabled" json:"timestamp_steamguard_enabled,omitempty"`
|
||||
DeprecatedNewauthentication []*CCredentials_GetSteamGuardDetails_Response_NewAuthentication `protobuf:"bytes,3,rep,name=deprecated_newauthentication" json:"deprecated_newauthentication,omitempty"`
|
||||
DeprecatedMachineNameUserchosen *string `protobuf:"bytes,4,opt,name=deprecated_machine_name_userchosen" json:"deprecated_machine_name_userchosen,omitempty"`
|
||||
DeprecatedTimestampMachineSteamguardEnabled *uint32 `protobuf:"fixed32,5,opt,name=deprecated_timestamp_machine_steamguard_enabled" json:"deprecated_timestamp_machine_steamguard_enabled,omitempty"`
|
||||
DeprecatedAuthenticationExistsFromGeolocBeforeMintime *bool `protobuf:"varint,6,opt,name=deprecated_authentication_exists_from_geoloc_before_mintime" json:"deprecated_authentication_exists_from_geoloc_before_mintime,omitempty"`
|
||||
DeprecatedMachineId *uint64 `protobuf:"varint,7,opt,name=deprecated_machine_id" json:"deprecated_machine_id,omitempty"`
|
||||
SessionData []*CCredentials_GetSteamGuardDetails_Response_SessionData `protobuf:"bytes,8,rep,name=session_data" json:"session_data,omitempty"`
|
||||
IsTwofactorEnabled *bool `protobuf:"varint,9,opt,name=is_twofactor_enabled" json:"is_twofactor_enabled,omitempty"`
|
||||
TimestampTwofactorEnabled *uint32 `protobuf:"fixed32,10,opt,name=timestamp_twofactor_enabled" json:"timestamp_twofactor_enabled,omitempty"`
|
||||
IsPhoneVerified *bool `protobuf:"varint,11,opt,name=is_phone_verified" json:"is_phone_verified,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response) Reset() {
|
||||
*m = CCredentials_GetSteamGuardDetails_Response{}
|
||||
}
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CCredentials_GetSteamGuardDetails_Response) ProtoMessage() {}
|
||||
func (*CCredentials_GetSteamGuardDetails_Response) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{3}
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response) GetIsSteamguardEnabled() bool {
|
||||
if m != nil && m.IsSteamguardEnabled != nil {
|
||||
return *m.IsSteamguardEnabled
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response) GetTimestampSteamguardEnabled() uint32 {
|
||||
if m != nil && m.TimestampSteamguardEnabled != nil {
|
||||
return *m.TimestampSteamguardEnabled
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response) GetDeprecatedNewauthentication() []*CCredentials_GetSteamGuardDetails_Response_NewAuthentication {
|
||||
if m != nil {
|
||||
return m.DeprecatedNewauthentication
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response) GetDeprecatedMachineNameUserchosen() string {
|
||||
if m != nil && m.DeprecatedMachineNameUserchosen != nil {
|
||||
return *m.DeprecatedMachineNameUserchosen
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response) GetDeprecatedTimestampMachineSteamguardEnabled() uint32 {
|
||||
if m != nil && m.DeprecatedTimestampMachineSteamguardEnabled != nil {
|
||||
return *m.DeprecatedTimestampMachineSteamguardEnabled
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response) GetDeprecatedAuthenticationExistsFromGeolocBeforeMintime() bool {
|
||||
if m != nil && m.DeprecatedAuthenticationExistsFromGeolocBeforeMintime != nil {
|
||||
return *m.DeprecatedAuthenticationExistsFromGeolocBeforeMintime
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response) GetDeprecatedMachineId() uint64 {
|
||||
if m != nil && m.DeprecatedMachineId != nil {
|
||||
return *m.DeprecatedMachineId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response) GetSessionData() []*CCredentials_GetSteamGuardDetails_Response_SessionData {
|
||||
if m != nil {
|
||||
return m.SessionData
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response) GetIsTwofactorEnabled() bool {
|
||||
if m != nil && m.IsTwofactorEnabled != nil {
|
||||
return *m.IsTwofactorEnabled
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response) GetTimestampTwofactorEnabled() uint32 {
|
||||
if m != nil && m.TimestampTwofactorEnabled != nil {
|
||||
return *m.TimestampTwofactorEnabled
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response) GetIsPhoneVerified() bool {
|
||||
if m != nil && m.IsPhoneVerified != nil {
|
||||
return *m.IsPhoneVerified
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type CCredentials_GetSteamGuardDetails_Response_NewAuthentication struct {
|
||||
TimestampSteamguardEnabled *uint32 `protobuf:"fixed32,1,opt,name=timestamp_steamguard_enabled" json:"timestamp_steamguard_enabled,omitempty"`
|
||||
IsWebCookie *bool `protobuf:"varint,2,opt,name=is_web_cookie" json:"is_web_cookie,omitempty"`
|
||||
Ipaddress *int32 `protobuf:"varint,3,opt,name=ipaddress" json:"ipaddress,omitempty"`
|
||||
GeolocInfo *string `protobuf:"bytes,4,opt,name=geoloc_info" json:"geoloc_info,omitempty"`
|
||||
IsRemembered *bool `protobuf:"varint,5,opt,name=is_remembered" json:"is_remembered,omitempty"`
|
||||
MachineNameUserSupplied *string `protobuf:"bytes,6,opt,name=machine_name_user_supplied" json:"machine_name_user_supplied,omitempty"`
|
||||
Status *int32 `protobuf:"varint,7,opt,name=status" json:"status,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_NewAuthentication) Reset() {
|
||||
*m = CCredentials_GetSteamGuardDetails_Response_NewAuthentication{}
|
||||
}
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_NewAuthentication) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CCredentials_GetSteamGuardDetails_Response_NewAuthentication) ProtoMessage() {}
|
||||
func (*CCredentials_GetSteamGuardDetails_Response_NewAuthentication) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{3, 0}
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_NewAuthentication) GetTimestampSteamguardEnabled() uint32 {
|
||||
if m != nil && m.TimestampSteamguardEnabled != nil {
|
||||
return *m.TimestampSteamguardEnabled
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_NewAuthentication) GetIsWebCookie() bool {
|
||||
if m != nil && m.IsWebCookie != nil {
|
||||
return *m.IsWebCookie
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_NewAuthentication) GetIpaddress() int32 {
|
||||
if m != nil && m.Ipaddress != nil {
|
||||
return *m.Ipaddress
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_NewAuthentication) GetGeolocInfo() string {
|
||||
if m != nil && m.GeolocInfo != nil {
|
||||
return *m.GeolocInfo
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_NewAuthentication) GetIsRemembered() bool {
|
||||
if m != nil && m.IsRemembered != nil {
|
||||
return *m.IsRemembered
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_NewAuthentication) GetMachineNameUserSupplied() string {
|
||||
if m != nil && m.MachineNameUserSupplied != nil {
|
||||
return *m.MachineNameUserSupplied
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_NewAuthentication) GetStatus() int32 {
|
||||
if m != nil && m.Status != nil {
|
||||
return *m.Status
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CCredentials_GetSteamGuardDetails_Response_SessionData struct {
|
||||
MachineId *uint64 `protobuf:"varint,1,opt,name=machine_id" json:"machine_id,omitempty"`
|
||||
MachineNameUserchosen *string `protobuf:"bytes,2,opt,name=machine_name_userchosen" json:"machine_name_userchosen,omitempty"`
|
||||
TimestampMachineSteamguardEnabled *uint32 `protobuf:"fixed32,3,opt,name=timestamp_machine_steamguard_enabled" json:"timestamp_machine_steamguard_enabled,omitempty"`
|
||||
AuthenticationExistsFromGeolocBeforeMintime *bool `protobuf:"varint,4,opt,name=authentication_exists_from_geoloc_before_mintime" json:"authentication_exists_from_geoloc_before_mintime,omitempty"`
|
||||
Newauthentication []*CCredentials_GetSteamGuardDetails_Response_NewAuthentication `protobuf:"bytes,5,rep,name=newauthentication" json:"newauthentication,omitempty"`
|
||||
AuthenticationExistsFromSameIpBeforeMintime *bool `protobuf:"varint,6,opt,name=authentication_exists_from_same_ip_before_mintime" json:"authentication_exists_from_same_ip_before_mintime,omitempty"`
|
||||
PublicIpv4 *uint32 `protobuf:"varint,7,opt,name=public_ipv4" json:"public_ipv4,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_SessionData) Reset() {
|
||||
*m = CCredentials_GetSteamGuardDetails_Response_SessionData{}
|
||||
}
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_SessionData) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CCredentials_GetSteamGuardDetails_Response_SessionData) ProtoMessage() {}
|
||||
func (*CCredentials_GetSteamGuardDetails_Response_SessionData) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{3, 1}
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_SessionData) GetMachineId() uint64 {
|
||||
if m != nil && m.MachineId != nil {
|
||||
return *m.MachineId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_SessionData) GetMachineNameUserchosen() string {
|
||||
if m != nil && m.MachineNameUserchosen != nil {
|
||||
return *m.MachineNameUserchosen
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_SessionData) GetTimestampMachineSteamguardEnabled() uint32 {
|
||||
if m != nil && m.TimestampMachineSteamguardEnabled != nil {
|
||||
return *m.TimestampMachineSteamguardEnabled
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_SessionData) GetAuthenticationExistsFromGeolocBeforeMintime() bool {
|
||||
if m != nil && m.AuthenticationExistsFromGeolocBeforeMintime != nil {
|
||||
return *m.AuthenticationExistsFromGeolocBeforeMintime
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_SessionData) GetNewauthentication() []*CCredentials_GetSteamGuardDetails_Response_NewAuthentication {
|
||||
if m != nil {
|
||||
return m.Newauthentication
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_SessionData) GetAuthenticationExistsFromSameIpBeforeMintime() bool {
|
||||
if m != nil && m.AuthenticationExistsFromSameIpBeforeMintime != nil {
|
||||
return *m.AuthenticationExistsFromSameIpBeforeMintime
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetSteamGuardDetails_Response_SessionData) GetPublicIpv4() uint32 {
|
||||
if m != nil && m.PublicIpv4 != nil {
|
||||
return *m.PublicIpv4
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CCredentials_NewMachineNotificationDialog_Request struct {
|
||||
IsApproved *bool `protobuf:"varint,1,opt,name=is_approved" json:"is_approved,omitempty"`
|
||||
IsWizardComplete *bool `protobuf:"varint,2,opt,name=is_wizard_complete" json:"is_wizard_complete,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_NewMachineNotificationDialog_Request) Reset() {
|
||||
*m = CCredentials_NewMachineNotificationDialog_Request{}
|
||||
}
|
||||
func (m *CCredentials_NewMachineNotificationDialog_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CCredentials_NewMachineNotificationDialog_Request) ProtoMessage() {}
|
||||
func (*CCredentials_NewMachineNotificationDialog_Request) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{4}
|
||||
}
|
||||
|
||||
func (m *CCredentials_NewMachineNotificationDialog_Request) GetIsApproved() bool {
|
||||
if m != nil && m.IsApproved != nil {
|
||||
return *m.IsApproved
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCredentials_NewMachineNotificationDialog_Request) GetIsWizardComplete() bool {
|
||||
if m != nil && m.IsWizardComplete != nil {
|
||||
return *m.IsWizardComplete
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type CCredentials_NewMachineNotificationDialog_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_NewMachineNotificationDialog_Response) Reset() {
|
||||
*m = CCredentials_NewMachineNotificationDialog_Response{}
|
||||
}
|
||||
func (m *CCredentials_NewMachineNotificationDialog_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CCredentials_NewMachineNotificationDialog_Response) ProtoMessage() {}
|
||||
func (*CCredentials_NewMachineNotificationDialog_Response) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{5}
|
||||
}
|
||||
|
||||
type CCredentials_ValidateEmailAddress_Request struct {
|
||||
Stoken *string `protobuf:"bytes,1,opt,name=stoken" json:"stoken,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_ValidateEmailAddress_Request) Reset() {
|
||||
*m = CCredentials_ValidateEmailAddress_Request{}
|
||||
}
|
||||
func (m *CCredentials_ValidateEmailAddress_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CCredentials_ValidateEmailAddress_Request) ProtoMessage() {}
|
||||
func (*CCredentials_ValidateEmailAddress_Request) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{6}
|
||||
}
|
||||
|
||||
func (m *CCredentials_ValidateEmailAddress_Request) GetStoken() string {
|
||||
if m != nil && m.Stoken != nil {
|
||||
return *m.Stoken
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CCredentials_ValidateEmailAddress_Response struct {
|
||||
WasValidated *bool `protobuf:"varint,1,opt,name=was_validated" json:"was_validated,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_ValidateEmailAddress_Response) Reset() {
|
||||
*m = CCredentials_ValidateEmailAddress_Response{}
|
||||
}
|
||||
func (m *CCredentials_ValidateEmailAddress_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CCredentials_ValidateEmailAddress_Response) ProtoMessage() {}
|
||||
func (*CCredentials_ValidateEmailAddress_Response) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{7}
|
||||
}
|
||||
|
||||
func (m *CCredentials_ValidateEmailAddress_Response) GetWasValidated() bool {
|
||||
if m != nil && m.WasValidated != nil {
|
||||
return *m.WasValidated
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type CCredentials_SteamGuardPhishingReport_Request struct {
|
||||
ParamString *string `protobuf:"bytes,1,opt,name=param_string" json:"param_string,omitempty"`
|
||||
IpaddressActual *uint32 `protobuf:"varint,2,opt,name=ipaddress_actual" json:"ipaddress_actual,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Request) Reset() {
|
||||
*m = CCredentials_SteamGuardPhishingReport_Request{}
|
||||
}
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CCredentials_SteamGuardPhishingReport_Request) ProtoMessage() {}
|
||||
func (*CCredentials_SteamGuardPhishingReport_Request) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{8}
|
||||
}
|
||||
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Request) GetParamString() string {
|
||||
if m != nil && m.ParamString != nil {
|
||||
return *m.ParamString
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Request) GetIpaddressActual() uint32 {
|
||||
if m != nil && m.IpaddressActual != nil {
|
||||
return *m.IpaddressActual
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CCredentials_SteamGuardPhishingReport_Response struct {
|
||||
IpaddressLoginattempt *uint32 `protobuf:"varint,1,opt,name=ipaddress_loginattempt" json:"ipaddress_loginattempt,omitempty"`
|
||||
CountrynameLoginattempt *string `protobuf:"bytes,2,opt,name=countryname_loginattempt" json:"countryname_loginattempt,omitempty"`
|
||||
StatenameLoginattempt *string `protobuf:"bytes,3,opt,name=statename_loginattempt" json:"statename_loginattempt,omitempty"`
|
||||
CitynameLoginattempt *string `protobuf:"bytes,4,opt,name=cityname_loginattempt" json:"cityname_loginattempt,omitempty"`
|
||||
IpaddressActual *uint32 `protobuf:"varint,5,opt,name=ipaddress_actual" json:"ipaddress_actual,omitempty"`
|
||||
CountrynameActual *string `protobuf:"bytes,6,opt,name=countryname_actual" json:"countryname_actual,omitempty"`
|
||||
StatenameActual *string `protobuf:"bytes,7,opt,name=statename_actual" json:"statename_actual,omitempty"`
|
||||
CitynameActual *string `protobuf:"bytes,8,opt,name=cityname_actual" json:"cityname_actual,omitempty"`
|
||||
SteamguardCode *string `protobuf:"bytes,9,opt,name=steamguard_code" json:"steamguard_code,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Response) Reset() {
|
||||
*m = CCredentials_SteamGuardPhishingReport_Response{}
|
||||
}
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CCredentials_SteamGuardPhishingReport_Response) ProtoMessage() {}
|
||||
func (*CCredentials_SteamGuardPhishingReport_Response) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{9}
|
||||
}
|
||||
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Response) GetIpaddressLoginattempt() uint32 {
|
||||
if m != nil && m.IpaddressLoginattempt != nil {
|
||||
return *m.IpaddressLoginattempt
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Response) GetCountrynameLoginattempt() string {
|
||||
if m != nil && m.CountrynameLoginattempt != nil {
|
||||
return *m.CountrynameLoginattempt
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Response) GetStatenameLoginattempt() string {
|
||||
if m != nil && m.StatenameLoginattempt != nil {
|
||||
return *m.StatenameLoginattempt
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Response) GetCitynameLoginattempt() string {
|
||||
if m != nil && m.CitynameLoginattempt != nil {
|
||||
return *m.CitynameLoginattempt
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Response) GetIpaddressActual() uint32 {
|
||||
if m != nil && m.IpaddressActual != nil {
|
||||
return *m.IpaddressActual
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Response) GetCountrynameActual() string {
|
||||
if m != nil && m.CountrynameActual != nil {
|
||||
return *m.CountrynameActual
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Response) GetStatenameActual() string {
|
||||
if m != nil && m.StatenameActual != nil {
|
||||
return *m.StatenameActual
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Response) GetCitynameActual() string {
|
||||
if m != nil && m.CitynameActual != nil {
|
||||
return *m.CitynameActual
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_SteamGuardPhishingReport_Response) GetSteamguardCode() string {
|
||||
if m != nil && m.SteamguardCode != nil {
|
||||
return *m.SteamguardCode
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CCredentials_AccountLockRequest_Request struct {
|
||||
ParamString *string `protobuf:"bytes,1,opt,name=param_string" json:"param_string,omitempty"`
|
||||
IpaddressActual *uint32 `protobuf:"varint,2,opt,name=ipaddress_actual" json:"ipaddress_actual,omitempty"`
|
||||
QueryOnly *bool `protobuf:"varint,3,opt,name=query_only" json:"query_only,omitempty"`
|
||||
EmailMessageType *int32 `protobuf:"varint,4,opt,name=email_message_type" json:"email_message_type,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_AccountLockRequest_Request) Reset() {
|
||||
*m = CCredentials_AccountLockRequest_Request{}
|
||||
}
|
||||
func (m *CCredentials_AccountLockRequest_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CCredentials_AccountLockRequest_Request) ProtoMessage() {}
|
||||
func (*CCredentials_AccountLockRequest_Request) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{10}
|
||||
}
|
||||
|
||||
func (m *CCredentials_AccountLockRequest_Request) GetParamString() string {
|
||||
if m != nil && m.ParamString != nil {
|
||||
return *m.ParamString
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CCredentials_AccountLockRequest_Request) GetIpaddressActual() uint32 {
|
||||
if m != nil && m.IpaddressActual != nil {
|
||||
return *m.IpaddressActual
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_AccountLockRequest_Request) GetQueryOnly() bool {
|
||||
if m != nil && m.QueryOnly != nil {
|
||||
return *m.QueryOnly
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCredentials_AccountLockRequest_Request) GetEmailMessageType() int32 {
|
||||
if m != nil && m.EmailMessageType != nil {
|
||||
return *m.EmailMessageType
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CCredentials_AccountLockRequest_Response struct {
|
||||
Success *bool `protobuf:"varint,1,opt,name=success" json:"success,omitempty"`
|
||||
AccountAlreadyLocked *bool `protobuf:"varint,2,opt,name=account_already_locked" json:"account_already_locked,omitempty"`
|
||||
ExpiredLink *bool `protobuf:"varint,3,opt,name=expired_link" json:"expired_link,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_AccountLockRequest_Response) Reset() {
|
||||
*m = CCredentials_AccountLockRequest_Response{}
|
||||
}
|
||||
func (m *CCredentials_AccountLockRequest_Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*CCredentials_AccountLockRequest_Response) ProtoMessage() {}
|
||||
func (*CCredentials_AccountLockRequest_Response) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{11}
|
||||
}
|
||||
|
||||
func (m *CCredentials_AccountLockRequest_Response) GetSuccess() bool {
|
||||
if m != nil && m.Success != nil {
|
||||
return *m.Success
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCredentials_AccountLockRequest_Response) GetAccountAlreadyLocked() bool {
|
||||
if m != nil && m.AccountAlreadyLocked != nil {
|
||||
return *m.AccountAlreadyLocked
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CCredentials_AccountLockRequest_Response) GetExpiredLink() bool {
|
||||
if m != nil && m.ExpiredLink != nil {
|
||||
return *m.ExpiredLink
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type CCredentials_LastCredentialChangeTime_Request struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_LastCredentialChangeTime_Request) Reset() {
|
||||
*m = CCredentials_LastCredentialChangeTime_Request{}
|
||||
}
|
||||
func (m *CCredentials_LastCredentialChangeTime_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CCredentials_LastCredentialChangeTime_Request) ProtoMessage() {}
|
||||
func (*CCredentials_LastCredentialChangeTime_Request) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{12}
|
||||
}
|
||||
|
||||
type CCredentials_LastCredentialChangeTime_Response struct {
|
||||
TimestampLastPasswordChange *uint32 `protobuf:"fixed32,1,opt,name=timestamp_last_password_change" json:"timestamp_last_password_change,omitempty"`
|
||||
TimestampLastEmailChange *uint32 `protobuf:"fixed32,2,opt,name=timestamp_last_email_change" json:"timestamp_last_email_change,omitempty"`
|
||||
TimestampLastPasswordReset *uint32 `protobuf:"fixed32,3,opt,name=timestamp_last_password_reset" json:"timestamp_last_password_reset,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_LastCredentialChangeTime_Response) Reset() {
|
||||
*m = CCredentials_LastCredentialChangeTime_Response{}
|
||||
}
|
||||
func (m *CCredentials_LastCredentialChangeTime_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CCredentials_LastCredentialChangeTime_Response) ProtoMessage() {}
|
||||
func (*CCredentials_LastCredentialChangeTime_Response) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{13}
|
||||
}
|
||||
|
||||
func (m *CCredentials_LastCredentialChangeTime_Response) GetTimestampLastPasswordChange() uint32 {
|
||||
if m != nil && m.TimestampLastPasswordChange != nil {
|
||||
return *m.TimestampLastPasswordChange
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_LastCredentialChangeTime_Response) GetTimestampLastEmailChange() uint32 {
|
||||
if m != nil && m.TimestampLastEmailChange != nil {
|
||||
return *m.TimestampLastEmailChange
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_LastCredentialChangeTime_Response) GetTimestampLastPasswordReset() uint32 {
|
||||
if m != nil && m.TimestampLastPasswordReset != nil {
|
||||
return *m.TimestampLastPasswordReset
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CCredentials_GetAccountAuthSecret_Request struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetAccountAuthSecret_Request) Reset() {
|
||||
*m = CCredentials_GetAccountAuthSecret_Request{}
|
||||
}
|
||||
func (m *CCredentials_GetAccountAuthSecret_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CCredentials_GetAccountAuthSecret_Request) ProtoMessage() {}
|
||||
func (*CCredentials_GetAccountAuthSecret_Request) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{14}
|
||||
}
|
||||
|
||||
type CCredentials_GetAccountAuthSecret_Response struct {
|
||||
SecretId *int32 `protobuf:"varint,1,opt,name=secret_id" json:"secret_id,omitempty"`
|
||||
Secret []byte `protobuf:"bytes,2,opt,name=secret" json:"secret,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetAccountAuthSecret_Response) Reset() {
|
||||
*m = CCredentials_GetAccountAuthSecret_Response{}
|
||||
}
|
||||
func (m *CCredentials_GetAccountAuthSecret_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CCredentials_GetAccountAuthSecret_Response) ProtoMessage() {}
|
||||
func (*CCredentials_GetAccountAuthSecret_Response) Descriptor() ([]byte, []int) {
|
||||
return credentials_fileDescriptor0, []int{15}
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetAccountAuthSecret_Response) GetSecretId() int32 {
|
||||
if m != nil && m.SecretId != nil {
|
||||
return *m.SecretId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CCredentials_GetAccountAuthSecret_Response) GetSecret() []byte {
|
||||
if m != nil {
|
||||
return m.Secret
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*CCredentials_TestAvailablePassword_Request)(nil), "CCredentials_TestAvailablePassword_Request")
|
||||
proto.RegisterType((*CCredentials_TestAvailablePassword_Response)(nil), "CCredentials_TestAvailablePassword_Response")
|
||||
proto.RegisterType((*CCredentials_GetSteamGuardDetails_Request)(nil), "CCredentials_GetSteamGuardDetails_Request")
|
||||
proto.RegisterType((*CCredentials_GetSteamGuardDetails_Response)(nil), "CCredentials_GetSteamGuardDetails_Response")
|
||||
proto.RegisterType((*CCredentials_GetSteamGuardDetails_Response_NewAuthentication)(nil), "CCredentials_GetSteamGuardDetails_Response.NewAuthentication")
|
||||
proto.RegisterType((*CCredentials_GetSteamGuardDetails_Response_SessionData)(nil), "CCredentials_GetSteamGuardDetails_Response.SessionData")
|
||||
proto.RegisterType((*CCredentials_NewMachineNotificationDialog_Request)(nil), "CCredentials_NewMachineNotificationDialog_Request")
|
||||
proto.RegisterType((*CCredentials_NewMachineNotificationDialog_Response)(nil), "CCredentials_NewMachineNotificationDialog_Response")
|
||||
proto.RegisterType((*CCredentials_ValidateEmailAddress_Request)(nil), "CCredentials_ValidateEmailAddress_Request")
|
||||
proto.RegisterType((*CCredentials_ValidateEmailAddress_Response)(nil), "CCredentials_ValidateEmailAddress_Response")
|
||||
proto.RegisterType((*CCredentials_SteamGuardPhishingReport_Request)(nil), "CCredentials_SteamGuardPhishingReport_Request")
|
||||
proto.RegisterType((*CCredentials_SteamGuardPhishingReport_Response)(nil), "CCredentials_SteamGuardPhishingReport_Response")
|
||||
proto.RegisterType((*CCredentials_AccountLockRequest_Request)(nil), "CCredentials_AccountLockRequest_Request")
|
||||
proto.RegisterType((*CCredentials_AccountLockRequest_Response)(nil), "CCredentials_AccountLockRequest_Response")
|
||||
proto.RegisterType((*CCredentials_LastCredentialChangeTime_Request)(nil), "CCredentials_LastCredentialChangeTime_Request")
|
||||
proto.RegisterType((*CCredentials_LastCredentialChangeTime_Response)(nil), "CCredentials_LastCredentialChangeTime_Response")
|
||||
proto.RegisterType((*CCredentials_GetAccountAuthSecret_Request)(nil), "CCredentials_GetAccountAuthSecret_Request")
|
||||
proto.RegisterType((*CCredentials_GetAccountAuthSecret_Response)(nil), "CCredentials_GetAccountAuthSecret_Response")
|
||||
}
|
||||
|
||||
var credentials_fileDescriptor0 = []byte{
|
||||
// 1482 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x57, 0x5d, 0x6f, 0x14, 0xd5,
|
||||
0x1b, 0xcf, 0x94, 0xbe, 0xec, 0x3e, 0xa5, 0x7f, 0xe8, 0x40, 0x61, 0x59, 0x0a, 0x4c, 0x06, 0xfe,
|
||||
0xb6, 0xd0, 0x3a, 0x48, 0x25, 0x41, 0x25, 0xc6, 0x94, 0x56, 0x09, 0x06, 0x90, 0x00, 0x51, 0xef,
|
||||
0x4e, 0x4e, 0x67, 0x4e, 0x77, 0x4f, 0x3a, 0x33, 0x67, 0x98, 0x39, 0xb3, 0x4b, 0x4d, 0x4c, 0xc4,
|
||||
0x3b, 0xbc, 0xf0, 0xce, 0x0b, 0x13, 0x2f, 0x8d, 0x5f, 0xc0, 0xe8, 0x17, 0xf0, 0x2b, 0xf8, 0x25,
|
||||
0xbc, 0x32, 0x7e, 0x03, 0x9f, 0x73, 0xe6, 0xec, 0xfb, 0x6c, 0xbb, 0x4b, 0xbc, 0xdc, 0x39, 0xcf,
|
||||
0xcb, 0xef, 0xf9, 0x3d, 0xaf, 0x0b, 0x1b, 0x99, 0x64, 0x34, 0x8a, 0x58, 0x96, 0xd1, 0x06, 0xcb,
|
||||
0x88, 0x9f, 0xb2, 0x80, 0xc5, 0x92, 0xd3, 0x30, 0xf3, 0xf4, 0x8b, 0x1f, 0x72, 0xfc, 0xed, 0x25,
|
||||
0xa9, 0x90, 0xa2, 0xbe, 0x39, 0x28, 0x9c, 0xc7, 0x7c, 0x9f, 0xb3, 0x80, 0xec, 0xd1, 0x8c, 0x8d,
|
||||
0x4a, 0xbb, 0x2f, 0xe0, 0xc6, 0xce, 0x4e, 0xcf, 0x1e, 0x79, 0xce, 0x32, 0xb9, 0xdd, 0xa2, 0x3c,
|
||||
0xa4, 0x7b, 0x21, 0x7b, 0x42, 0xb3, 0xac, 0x2d, 0xd2, 0x80, 0x3c, 0x65, 0x2f, 0x72, 0x7c, 0xb0,
|
||||
0x4f, 0x43, 0x25, 0x31, 0xdf, 0x6a, 0x96, 0x63, 0xad, 0x57, 0xed, 0x8b, 0x70, 0x26, 0x6b, 0x52,
|
||||
0x12, 0x70, 0xf4, 0x25, 0x49, 0xf7, 0x71, 0x06, 0x1f, 0x4f, 0xda, 0x67, 0xe1, 0x24, 0xf5, 0x7d,
|
||||
0x91, 0xc7, 0x92, 0xc4, 0x34, 0x62, 0xb5, 0x13, 0x4a, 0xc5, 0xfd, 0x08, 0x36, 0x26, 0x72, 0x99,
|
||||
0x25, 0x22, 0xce, 0x98, 0xf2, 0xc9, 0x33, 0xd2, 0xa2, 0x21, 0x0f, 0xb4, 0x81, 0x8a, 0xfb, 0xf7,
|
||||
0x0c, 0x5c, 0x1f, 0xb0, 0x70, 0x9f, 0xc9, 0x67, 0x2a, 0xb2, 0xfb, 0x39, 0x4d, 0x83, 0x5d, 0x26,
|
||||
0xd1, 0x56, 0xd6, 0xc5, 0x9c, 0xc3, 0x45, 0x1e, 0xfb, 0x61, 0x1e, 0x30, 0x12, 0xb3, 0x36, 0xa1,
|
||||
0xb9, 0x6c, 0x2a, 0x3d, 0x9f, 0x4a, 0x8e, 0xf6, 0x75, 0x18, 0x95, 0x0f, 0x66, 0x65, 0x9a, 0xb3,
|
||||
0x7b, 0x9f, 0x7e, 0xfb, 0x5b, 0xed, 0x93, 0x2f, 0x9a, 0x0c, 0x25, 0x52, 0x47, 0xa4, 0x4e, 0x2c,
|
||||
0xa4, 0x23, 0x85, 0x93, 0x88, 0x24, 0x0f, 0xa9, 0x64, 0x0e, 0x7e, 0x77, 0xd0, 0xc6, 0xa0, 0x09,
|
||||
0x07, 0xe9, 0x0d, 0x03, 0x87, 0xc7, 0xfa, 0x39, 0xed, 0xc0, 0xfe, 0xc1, 0x82, 0x6a, 0x9b, 0xed,
|
||||
0xf9, 0x42, 0x1c, 0x70, 0xa6, 0xf9, 0xa8, 0xde, 0x7b, 0x65, 0xa1, 0x83, 0xaf, 0x9f, 0xa3, 0x58,
|
||||
0x9e, 0xb1, 0x74, 0x2d, 0x73, 0x34, 0x6a, 0x47, 0xc3, 0x76, 0x22, 0xea, 0x37, 0x79, 0xcc, 0x1c,
|
||||
0x65, 0xdd, 0x29, 0xd4, 0x3c, 0xe7, 0xc1, 0xbe, 0x93, 0xa0, 0x49, 0xf4, 0xb6, 0xe9, 0x70, 0xb9,
|
||||
0x16, 0x86, 0xce, 0x9e, 0x56, 0x0e, 0x14, 0xae, 0x06, 0x93, 0xda, 0xa7, 0x31, 0xd6, 0x31, 0xf0,
|
||||
0x60, 0x17, 0xc1, 0xa8, 0x4c, 0x07, 0x8e, 0xd8, 0xd7, 0x02, 0xdb, 0x8f, 0x9c, 0x0c, 0xeb, 0x01,
|
||||
0xc1, 0x7a, 0xb6, 0x03, 0x35, 0xc9, 0xb1, 0x3a, 0x24, 0x8d, 0x12, 0x12, 0xf1, 0x98, 0x47, 0x79,
|
||||
0x44, 0xda, 0x34, 0x96, 0xac, 0xa0, 0x77, 0xc1, 0x5e, 0x86, 0x2a, 0x4f, 0x68, 0x10, 0xa0, 0xdf,
|
||||
0xac, 0x36, 0x8b, 0x9f, 0xe6, 0xdc, 0xbf, 0x2a, 0x43, 0x65, 0x32, 0x86, 0x71, 0x13, 0xfb, 0x25,
|
||||
0x58, 0xc1, 0x94, 0xe9, 0x62, 0x6b, 0x28, 0x01, 0xc2, 0x62, 0x95, 0xdb, 0xa2, 0x66, 0x2a, 0xf6,
|
||||
0x35, 0x58, 0xed, 0x41, 0x28, 0x91, 0x9a, 0xd1, 0x30, 0x7c, 0x58, 0x0d, 0x18, 0x06, 0x8f, 0x2c,
|
||||
0x63, 0xf9, 0x8e, 0xd0, 0x8e, 0x60, 0x4f, 0xac, 0x2f, 0x6e, 0x7d, 0xe8, 0x4d, 0x8e, 0xcb, 0x7b,
|
||||
0xcc, 0xda, 0xdb, 0x03, 0x46, 0xec, 0x1b, 0xe0, 0xf6, 0x39, 0x31, 0x0c, 0xea, 0x62, 0x25, 0x8a,
|
||||
0x55, 0xbf, 0x29, 0x90, 0x7b, 0x4d, 0x42, 0xd5, 0xbe, 0x03, 0x37, 0xfb, 0x64, 0xfb, 0x48, 0x34,
|
||||
0x5a, 0x25, 0x91, 0xcc, 0xe9, 0x48, 0x76, 0xe0, 0x6e, 0x9f, 0xe2, 0x60, 0x18, 0x84, 0xbd, 0xe4,
|
||||
0x99, 0xcc, 0xc8, 0x7e, 0x2a, 0x22, 0xd2, 0x60, 0x22, 0x14, 0x3e, 0xd9, 0x63, 0xfb, 0x22, 0x65,
|
||||
0x2a, 0x39, 0xca, 0x49, 0x6d, 0x5e, 0x93, 0x86, 0x9c, 0x96, 0x20, 0xc5, 0x9e, 0x58, 0xc0, 0xe7,
|
||||
0x59, 0xfb, 0x11, 0x9c, 0x34, 0x29, 0x26, 0x01, 0x95, 0xb4, 0x56, 0xd1, 0xec, 0xdc, 0x99, 0x86,
|
||||
0x9d, 0x67, 0x85, 0xfe, 0x2e, 0xaa, 0xdb, 0xab, 0x70, 0x16, 0x33, 0x28, 0xdb, 0x62, 0x9f, 0xfa,
|
||||
0x52, 0xa4, 0xdd, 0x80, 0xaa, 0x1a, 0xcb, 0x55, 0xb8, 0xd8, 0x0b, 0x7f, 0x54, 0x08, 0x74, 0xd4,
|
||||
0x17, 0x60, 0x19, 0x4d, 0x24, 0x4d, 0x81, 0x30, 0x5b, 0x2c, 0xd5, 0x53, 0xa8, 0xb6, 0xa8, 0xf4,
|
||||
0xeb, 0x7f, 0x58, 0xb0, 0x3c, 0x9a, 0x8b, 0xe3, 0xca, 0xc2, 0xd2, 0x66, 0x57, 0x60, 0x09, 0xcd,
|
||||
0x62, 0x67, 0x91, 0xbe, 0xd6, 0xaa, 0x0c, 0x16, 0xad, 0xaa, 0xe3, 0x39, 0xfb, 0x0c, 0x2c, 0x1a,
|
||||
0x42, 0x79, 0xbc, 0x2f, 0x4c, 0x12, 0x0b, 0xf5, 0x94, 0x45, 0x2c, 0xda, 0x63, 0xa9, 0x49, 0x51,
|
||||
0xc5, 0x76, 0xa1, 0x3e, 0x92, 0x7c, 0x92, 0xe5, 0x49, 0x12, 0x2a, 0xd4, 0xf3, 0x5a, 0xf5, 0x7f,
|
||||
0x30, 0x8f, 0xd8, 0x64, 0x9e, 0x69, 0xca, 0xe7, 0xea, 0x7f, 0xce, 0xc0, 0x62, 0x3f, 0x67, 0x36,
|
||||
0x40, 0x5f, 0x5a, 0x2c, 0x9d, 0x96, 0x2b, 0x70, 0x7e, 0x5c, 0x51, 0xe9, 0x91, 0x60, 0x6f, 0xc2,
|
||||
0xb5, 0x89, 0x2a, 0xa9, 0x68, 0xcd, 0xf7, 0xe0, 0x9d, 0xa9, 0xcb, 0x67, 0x56, 0x07, 0xf8, 0x25,
|
||||
0x2c, 0x8f, 0xb6, 0xd0, 0xdc, 0x7f, 0xd1, 0x42, 0xef, 0xc3, 0xad, 0x23, 0x30, 0x65, 0x2a, 0x6a,
|
||||
0x9e, 0x94, 0xd7, 0x34, 0x66, 0x28, 0xc9, 0xf7, 0x42, 0x8e, 0x19, 0x4a, 0x5a, 0xb7, 0x35, 0xad,
|
||||
0x4b, 0x6e, 0x00, 0xb7, 0x06, 0xf0, 0xa0, 0xc7, 0x47, 0x05, 0x2f, 0x8f, 0x85, 0xc4, 0x2a, 0x2a,
|
||||
0x9c, 0xec, 0xe2, 0x9b, 0x68, 0x74, 0x87, 0x3c, 0x5a, 0xc2, 0xb4, 0xd2, 0x04, 0x97, 0x5a, 0xab,
|
||||
0x3b, 0x67, 0xea, 0x60, 0xab, 0x52, 0xe1, 0x5f, 0x29, 0x22, 0x7d, 0x11, 0x25, 0x21, 0x93, 0xa6,
|
||||
0x5e, 0xdc, 0xdb, 0xb0, 0x35, 0x8d, 0x97, 0x22, 0x7a, 0xf7, 0xee, 0xd0, 0xe2, 0xf9, 0x5c, 0x6d,
|
||||
0x25, 0x6c, 0xc8, 0x8f, 0x23, 0x64, 0x69, 0xbb, 0xa8, 0xbe, 0x2e, 0x26, 0x5d, 0x2f, 0xe2, 0x00,
|
||||
0x53, 0xad, 0x57, 0xa5, 0xbb, 0x33, 0x34, 0x43, 0xc7, 0x28, 0x9b, 0x19, 0x8a, 0x85, 0xda, 0xa6,
|
||||
0x66, 0xef, 0xa9, 0x96, 0x2f, 0x62, 0x72, 0x09, 0xbc, 0x3d, 0x60, 0xa4, 0x97, 0xaa, 0x27, 0x4d,
|
||||
0x9e, 0x21, 0xfe, 0xc6, 0x53, 0x96, 0x88, 0x54, 0x76, 0x51, 0xe0, 0x0e, 0x4e, 0x68, 0x4a, 0x31,
|
||||
0x13, 0x32, 0xc5, 0x57, 0xb3, 0xb6, 0x6b, 0x70, 0xba, 0xdb, 0x2e, 0x04, 0xbb, 0x37, 0xa7, 0xa1,
|
||||
0x26, 0x66, 0xc9, 0xfd, 0x75, 0x06, 0xbc, 0x49, 0x3d, 0x18, 0xa8, 0x97, 0xe1, 0x5c, 0xcf, 0x18,
|
||||
0xf2, 0xc5, 0x63, 0x2a, 0x25, 0x8b, 0x12, 0xa9, 0x9d, 0x2d, 0xa9, 0x95, 0xa3, 0x8f, 0x80, 0xf4,
|
||||
0x50, 0xf7, 0xc0, 0x80, 0x44, 0xd1, 0x05, 0x68, 0x41, 0xb5, 0x16, 0x1b, 0x7d, 0xd7, 0x27, 0x83,
|
||||
0x1a, 0x7e, 0x3e, 0x97, 0x25, 0xea, 0xb3, 0x63, 0xa3, 0x99, 0xd3, 0xae, 0xb1, 0x04, 0xfa, 0x5d,
|
||||
0x9b, 0xb7, 0xf9, 0x8e, 0x56, 0xcf, 0xa9, 0x79, 0x59, 0xd0, 0x2f, 0xe7, 0xe1, 0x54, 0xd7, 0x9d,
|
||||
0x79, 0xa8, 0x74, 0x1e, 0xfa, 0x7a, 0xd3, 0x17, 0x01, 0xd3, 0x13, 0xb1, 0xea, 0xbe, 0xb6, 0x60,
|
||||
0x6d, 0x80, 0xb5, 0xed, 0xe2, 0xee, 0x79, 0x28, 0xfc, 0x03, 0x93, 0x89, 0x37, 0xcd, 0x88, 0x9a,
|
||||
0x2b, 0xa8, 0x98, 0x1e, 0x12, 0x11, 0x87, 0x87, 0xc5, 0x09, 0xa4, 0xe2, 0x62, 0xaa, 0x6c, 0x88,
|
||||
0xb9, 0xf3, 0x88, 0x3c, 0x4c, 0x98, 0x59, 0xd6, 0x2f, 0x60, 0xfd, 0x78, 0x28, 0x26, 0x75, 0xa7,
|
||||
0x60, 0x21, 0xcb, 0x7d, 0x5f, 0x0d, 0xcd, 0xa2, 0x67, 0x30, 0x13, 0x9d, 0x93, 0x8d, 0x86, 0x29,
|
||||
0xde, 0x10, 0x87, 0x48, 0xb8, 0x7f, 0x60, 0xb6, 0x72, 0x45, 0x81, 0x67, 0x2f, 0x13, 0x8e, 0xe6,
|
||||
0x49, 0xc8, 0xe3, 0x03, 0x73, 0x91, 0xdd, 0x1c, 0xaa, 0xca, 0x87, 0x34, 0x93, 0xbd, 0xdf, 0x3b,
|
||||
0x4d, 0x1a, 0x37, 0xd8, 0x73, 0xec, 0xfb, 0x0e, 0x07, 0xee, 0xcf, 0xd6, 0x50, 0x95, 0x1d, 0xa1,
|
||||
0x61, 0xa0, 0xbe, 0x05, 0x97, 0x7b, 0x93, 0x32, 0xa4, 0x7d, 0xd7, 0x26, 0xf1, 0xb5, 0xb8, 0x59,
|
||||
0x10, 0x03, 0xcb, 0x49, 0xcb, 0x15, 0x4c, 0x19, 0xa1, 0xe2, 0xb8, 0xf8, 0x3f, 0x5c, 0x1a, 0x67,
|
||||
0x4c, 0x9d, 0x5b, 0x45, 0xdd, 0x2d, 0xb8, 0x1b, 0xa3, 0x87, 0xa6, 0x61, 0x53, 0x0d, 0xc1, 0x67,
|
||||
0x0c, 0x2f, 0xf1, 0x6e, 0x5e, 0xdd, 0xcf, 0x46, 0x6f, 0xa4, 0x32, 0x61, 0x13, 0x0e, 0x2e, 0xac,
|
||||
0xac, 0xf8, 0x64, 0x96, 0xc5, 0x9c, 0x1e, 0x18, 0xfa, 0x53, 0x71, 0x3e, 0x6f, 0xfd, 0x53, 0x85,
|
||||
0xc5, 0x3e, 0x83, 0xf6, 0xf7, 0x16, 0xac, 0x94, 0x1e, 0xcb, 0xf6, 0x86, 0x37, 0xf9, 0x11, 0x5f,
|
||||
0xdf, 0xf4, 0xa6, 0x38, 0xbf, 0xdd, 0x3a, 0x9e, 0xac, 0xe7, 0x4a, 0x65, 0x3c, 0xfb, 0x3b, 0x0b,
|
||||
0xce, 0x96, 0xad, 0x0b, 0xfb, 0x86, 0x37, 0xf1, 0x7d, 0x5e, 0xdf, 0x98, 0x62, 0xfd, 0xb8, 0x17,
|
||||
0x10, 0xcd, 0x4a, 0x99, 0x88, 0x67, 0xff, 0x6e, 0x81, 0x7b, 0xd4, 0x14, 0x47, 0x1b, 0x79, 0x28,
|
||||
0xed, 0x2d, 0x6f, 0xea, 0xed, 0x52, 0x7f, 0xd7, 0x7b, 0x83, 0x5d, 0xb1, 0x86, 0x50, 0xaf, 0x1e,
|
||||
0x0f, 0xc8, 0xb3, 0x7f, 0x42, 0x16, 0xcb, 0x76, 0xc1, 0x30, 0x8b, 0x47, 0x2d, 0x9b, 0x61, 0x16,
|
||||
0x8f, 0xdc, 0x2d, 0xee, 0x06, 0x42, 0x5b, 0xeb, 0x88, 0x38, 0x34, 0x76, 0x74, 0x87, 0x38, 0x66,
|
||||
0xfa, 0x38, 0x0d, 0xde, 0x62, 0xb1, 0x43, 0x1d, 0xbd, 0xbc, 0xec, 0x1f, 0x2d, 0xa8, 0x8d, 0xdb,
|
||||
0x01, 0xb6, 0xe7, 0x4d, 0xb5, 0x8d, 0xea, 0x37, 0xa7, 0xdc, 0x2d, 0xee, 0x2a, 0x42, 0x1d, 0xef,
|
||||
0xfe, 0x95, 0x05, 0xf6, 0xe8, 0x78, 0xb3, 0xd7, 0xbd, 0x09, 0x67, 0x71, 0xfd, 0xba, 0x37, 0xe9,
|
||||
0xa8, 0x74, 0xcf, 0x21, 0x92, 0x32, 0x67, 0xbf, 0x58, 0x70, 0x19, 0x2b, 0xb2, 0x6c, 0x78, 0x75,
|
||||
0xda, 0xc1, 0xf3, 0xa6, 0x9a, 0x8e, 0xc3, 0x2c, 0x1d, 0x3b, 0x1b, 0xdd, 0xab, 0x88, 0xed, 0xca,
|
||||
0xd1, 0x20, 0x3c, 0xfb, 0x75, 0xd1, 0xad, 0x23, 0x33, 0xa9, 0xa4, 0x5b, 0xc7, 0x0e, 0xb9, 0x92,
|
||||
0x6e, 0x1d, 0x3f, 0xe3, 0xdc, 0x1a, 0xc2, 0x2a, 0x75, 0x59, 0x3f, 0x8f, 0x2f, 0x67, 0xfa, 0x0c,
|
||||
0xe1, 0xff, 0xd3, 0xb4, 0xc5, 0x7d, 0x76, 0xef, 0xc4, 0x37, 0x96, 0xf5, 0x6f, 0x00, 0x00, 0x00,
|
||||
0xff, 0xff, 0x3c, 0x6e, 0x05, 0xde, 0xf0, 0x10, 0x00, 0x00,
|
||||
}
|
||||
694
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/deviceauth.pb.go
generated
vendored
Normal file
694
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/deviceauth.pb.go
generated
vendored
Normal file
@@ -0,0 +1,694 @@
|
||||
// Code generated by protoc-gen-go.
|
||||
// source: steammessages_deviceauth.steamclient.proto
|
||||
// DO NOT EDIT!
|
||||
|
||||
package unified
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
import fmt "fmt"
|
||||
import math "math"
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
type CDeviceAuth_GetOwnAuthorizedDevices_Request struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
IncludeCanceled *bool `protobuf:"varint,2,opt,name=include_canceled" json:"include_canceled,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Request) Reset() {
|
||||
*m = CDeviceAuth_GetOwnAuthorizedDevices_Request{}
|
||||
}
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_GetOwnAuthorizedDevices_Request) ProtoMessage() {}
|
||||
func (*CDeviceAuth_GetOwnAuthorizedDevices_Request) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{0}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Request) GetIncludeCanceled() bool {
|
||||
if m != nil && m.IncludeCanceled != nil {
|
||||
return *m.IncludeCanceled
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type CDeviceAuth_GetOwnAuthorizedDevices_Response struct {
|
||||
Devices []*CDeviceAuth_GetOwnAuthorizedDevices_Response_Device `protobuf:"bytes,1,rep,name=devices" json:"devices,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Response) Reset() {
|
||||
*m = CDeviceAuth_GetOwnAuthorizedDevices_Response{}
|
||||
}
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_GetOwnAuthorizedDevices_Response) ProtoMessage() {}
|
||||
func (*CDeviceAuth_GetOwnAuthorizedDevices_Response) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{1}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Response) GetDevices() []*CDeviceAuth_GetOwnAuthorizedDevices_Response_Device {
|
||||
if m != nil {
|
||||
return m.Devices
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CDeviceAuth_GetOwnAuthorizedDevices_Response_Device struct {
|
||||
AuthDeviceToken *uint64 `protobuf:"fixed64,1,opt,name=auth_device_token" json:"auth_device_token,omitempty"`
|
||||
DeviceName *string `protobuf:"bytes,2,opt,name=device_name" json:"device_name,omitempty"`
|
||||
IsPending *bool `protobuf:"varint,3,opt,name=is_pending" json:"is_pending,omitempty"`
|
||||
IsCanceled *bool `protobuf:"varint,4,opt,name=is_canceled" json:"is_canceled,omitempty"`
|
||||
LastTimeUsed *uint32 `protobuf:"varint,5,opt,name=last_time_used" json:"last_time_used,omitempty"`
|
||||
LastBorrowerId *uint64 `protobuf:"fixed64,6,opt,name=last_borrower_id" json:"last_borrower_id,omitempty"`
|
||||
LastAppPlayed *uint32 `protobuf:"varint,7,opt,name=last_app_played" json:"last_app_played,omitempty"`
|
||||
IsLimited *bool `protobuf:"varint,8,opt,name=is_limited" json:"is_limited,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Response_Device) Reset() {
|
||||
*m = CDeviceAuth_GetOwnAuthorizedDevices_Response_Device{}
|
||||
}
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Response_Device) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_GetOwnAuthorizedDevices_Response_Device) ProtoMessage() {}
|
||||
func (*CDeviceAuth_GetOwnAuthorizedDevices_Response_Device) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{1, 0}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Response_Device) GetAuthDeviceToken() uint64 {
|
||||
if m != nil && m.AuthDeviceToken != nil {
|
||||
return *m.AuthDeviceToken
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Response_Device) GetDeviceName() string {
|
||||
if m != nil && m.DeviceName != nil {
|
||||
return *m.DeviceName
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Response_Device) GetIsPending() bool {
|
||||
if m != nil && m.IsPending != nil {
|
||||
return *m.IsPending
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Response_Device) GetIsCanceled() bool {
|
||||
if m != nil && m.IsCanceled != nil {
|
||||
return *m.IsCanceled
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Response_Device) GetLastTimeUsed() uint32 {
|
||||
if m != nil && m.LastTimeUsed != nil {
|
||||
return *m.LastTimeUsed
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Response_Device) GetLastBorrowerId() uint64 {
|
||||
if m != nil && m.LastBorrowerId != nil {
|
||||
return *m.LastBorrowerId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Response_Device) GetLastAppPlayed() uint32 {
|
||||
if m != nil && m.LastAppPlayed != nil {
|
||||
return *m.LastAppPlayed
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetOwnAuthorizedDevices_Response_Device) GetIsLimited() bool {
|
||||
if m != nil && m.IsLimited != nil {
|
||||
return *m.IsLimited
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type CDeviceAuth_AcceptAuthorizationRequest_Request struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
AuthDeviceToken *uint64 `protobuf:"fixed64,2,opt,name=auth_device_token" json:"auth_device_token,omitempty"`
|
||||
AuthCode *uint64 `protobuf:"fixed64,3,opt,name=auth_code" json:"auth_code,omitempty"`
|
||||
FromSteamid *uint64 `protobuf:"fixed64,4,opt,name=from_steamid" json:"from_steamid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AcceptAuthorizationRequest_Request) Reset() {
|
||||
*m = CDeviceAuth_AcceptAuthorizationRequest_Request{}
|
||||
}
|
||||
func (m *CDeviceAuth_AcceptAuthorizationRequest_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_AcceptAuthorizationRequest_Request) ProtoMessage() {}
|
||||
func (*CDeviceAuth_AcceptAuthorizationRequest_Request) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{2}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AcceptAuthorizationRequest_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AcceptAuthorizationRequest_Request) GetAuthDeviceToken() uint64 {
|
||||
if m != nil && m.AuthDeviceToken != nil {
|
||||
return *m.AuthDeviceToken
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AcceptAuthorizationRequest_Request) GetAuthCode() uint64 {
|
||||
if m != nil && m.AuthCode != nil {
|
||||
return *m.AuthCode
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AcceptAuthorizationRequest_Request) GetFromSteamid() uint64 {
|
||||
if m != nil && m.FromSteamid != nil {
|
||||
return *m.FromSteamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CDeviceAuth_AcceptAuthorizationRequest_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AcceptAuthorizationRequest_Response) Reset() {
|
||||
*m = CDeviceAuth_AcceptAuthorizationRequest_Response{}
|
||||
}
|
||||
func (m *CDeviceAuth_AcceptAuthorizationRequest_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_AcceptAuthorizationRequest_Response) ProtoMessage() {}
|
||||
func (*CDeviceAuth_AcceptAuthorizationRequest_Response) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{3}
|
||||
}
|
||||
|
||||
type CDeviceAuth_AuthorizeRemoteDevice_Request struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
AuthDeviceToken *uint64 `protobuf:"fixed64,2,opt,name=auth_device_token" json:"auth_device_token,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AuthorizeRemoteDevice_Request) Reset() {
|
||||
*m = CDeviceAuth_AuthorizeRemoteDevice_Request{}
|
||||
}
|
||||
func (m *CDeviceAuth_AuthorizeRemoteDevice_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CDeviceAuth_AuthorizeRemoteDevice_Request) ProtoMessage() {}
|
||||
func (*CDeviceAuth_AuthorizeRemoteDevice_Request) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{4}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AuthorizeRemoteDevice_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AuthorizeRemoteDevice_Request) GetAuthDeviceToken() uint64 {
|
||||
if m != nil && m.AuthDeviceToken != nil {
|
||||
return *m.AuthDeviceToken
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CDeviceAuth_AuthorizeRemoteDevice_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AuthorizeRemoteDevice_Response) Reset() {
|
||||
*m = CDeviceAuth_AuthorizeRemoteDevice_Response{}
|
||||
}
|
||||
func (m *CDeviceAuth_AuthorizeRemoteDevice_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_AuthorizeRemoteDevice_Response) ProtoMessage() {}
|
||||
func (*CDeviceAuth_AuthorizeRemoteDevice_Response) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{5}
|
||||
}
|
||||
|
||||
type CDeviceAuth_DeauthorizeRemoteDevice_Request struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
AuthDeviceToken *uint64 `protobuf:"fixed64,2,opt,name=auth_device_token" json:"auth_device_token,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_DeauthorizeRemoteDevice_Request) Reset() {
|
||||
*m = CDeviceAuth_DeauthorizeRemoteDevice_Request{}
|
||||
}
|
||||
func (m *CDeviceAuth_DeauthorizeRemoteDevice_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_DeauthorizeRemoteDevice_Request) ProtoMessage() {}
|
||||
func (*CDeviceAuth_DeauthorizeRemoteDevice_Request) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{6}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_DeauthorizeRemoteDevice_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_DeauthorizeRemoteDevice_Request) GetAuthDeviceToken() uint64 {
|
||||
if m != nil && m.AuthDeviceToken != nil {
|
||||
return *m.AuthDeviceToken
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CDeviceAuth_DeauthorizeRemoteDevice_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_DeauthorizeRemoteDevice_Response) Reset() {
|
||||
*m = CDeviceAuth_DeauthorizeRemoteDevice_Response{}
|
||||
}
|
||||
func (m *CDeviceAuth_DeauthorizeRemoteDevice_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_DeauthorizeRemoteDevice_Response) ProtoMessage() {}
|
||||
func (*CDeviceAuth_DeauthorizeRemoteDevice_Response) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{7}
|
||||
}
|
||||
|
||||
type CDeviceAuth_GetUsedAuthorizedDevices_Request struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetUsedAuthorizedDevices_Request) Reset() {
|
||||
*m = CDeviceAuth_GetUsedAuthorizedDevices_Request{}
|
||||
}
|
||||
func (m *CDeviceAuth_GetUsedAuthorizedDevices_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_GetUsedAuthorizedDevices_Request) ProtoMessage() {}
|
||||
func (*CDeviceAuth_GetUsedAuthorizedDevices_Request) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{8}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetUsedAuthorizedDevices_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CDeviceAuth_GetUsedAuthorizedDevices_Response struct {
|
||||
Devices []*CDeviceAuth_GetUsedAuthorizedDevices_Response_Device `protobuf:"bytes,1,rep,name=devices" json:"devices,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetUsedAuthorizedDevices_Response) Reset() {
|
||||
*m = CDeviceAuth_GetUsedAuthorizedDevices_Response{}
|
||||
}
|
||||
func (m *CDeviceAuth_GetUsedAuthorizedDevices_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_GetUsedAuthorizedDevices_Response) ProtoMessage() {}
|
||||
func (*CDeviceAuth_GetUsedAuthorizedDevices_Response) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{9}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetUsedAuthorizedDevices_Response) GetDevices() []*CDeviceAuth_GetUsedAuthorizedDevices_Response_Device {
|
||||
if m != nil {
|
||||
return m.Devices
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CDeviceAuth_GetUsedAuthorizedDevices_Response_Device struct {
|
||||
AuthDeviceToken *uint64 `protobuf:"fixed64,1,opt,name=auth_device_token" json:"auth_device_token,omitempty"`
|
||||
DeviceName *string `protobuf:"bytes,2,opt,name=device_name" json:"device_name,omitempty"`
|
||||
OwnerSteamid *uint64 `protobuf:"fixed64,3,opt,name=owner_steamid" json:"owner_steamid,omitempty"`
|
||||
LastTimeUsed *uint32 `protobuf:"varint,4,opt,name=last_time_used" json:"last_time_used,omitempty"`
|
||||
LastAppPlayed *uint32 `protobuf:"varint,5,opt,name=last_app_played" json:"last_app_played,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetUsedAuthorizedDevices_Response_Device) Reset() {
|
||||
*m = CDeviceAuth_GetUsedAuthorizedDevices_Response_Device{}
|
||||
}
|
||||
func (m *CDeviceAuth_GetUsedAuthorizedDevices_Response_Device) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_GetUsedAuthorizedDevices_Response_Device) ProtoMessage() {}
|
||||
func (*CDeviceAuth_GetUsedAuthorizedDevices_Response_Device) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{9, 0}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetUsedAuthorizedDevices_Response_Device) GetAuthDeviceToken() uint64 {
|
||||
if m != nil && m.AuthDeviceToken != nil {
|
||||
return *m.AuthDeviceToken
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetUsedAuthorizedDevices_Response_Device) GetDeviceName() string {
|
||||
if m != nil && m.DeviceName != nil {
|
||||
return *m.DeviceName
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetUsedAuthorizedDevices_Response_Device) GetOwnerSteamid() uint64 {
|
||||
if m != nil && m.OwnerSteamid != nil {
|
||||
return *m.OwnerSteamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetUsedAuthorizedDevices_Response_Device) GetLastTimeUsed() uint32 {
|
||||
if m != nil && m.LastTimeUsed != nil {
|
||||
return *m.LastTimeUsed
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetUsedAuthorizedDevices_Response_Device) GetLastAppPlayed() uint32 {
|
||||
if m != nil && m.LastAppPlayed != nil {
|
||||
return *m.LastAppPlayed
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CDeviceAuth_GetAuthorizedBorrowers_Request struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
IncludeCanceled *bool `protobuf:"varint,2,opt,name=include_canceled" json:"include_canceled,omitempty"`
|
||||
IncludePending *bool `protobuf:"varint,3,opt,name=include_pending" json:"include_pending,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Request) Reset() {
|
||||
*m = CDeviceAuth_GetAuthorizedBorrowers_Request{}
|
||||
}
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_GetAuthorizedBorrowers_Request) ProtoMessage() {}
|
||||
func (*CDeviceAuth_GetAuthorizedBorrowers_Request) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{10}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Request) GetIncludeCanceled() bool {
|
||||
if m != nil && m.IncludeCanceled != nil {
|
||||
return *m.IncludeCanceled
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Request) GetIncludePending() bool {
|
||||
if m != nil && m.IncludePending != nil {
|
||||
return *m.IncludePending
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type CDeviceAuth_GetAuthorizedBorrowers_Response struct {
|
||||
Borrowers []*CDeviceAuth_GetAuthorizedBorrowers_Response_Borrower `protobuf:"bytes,1,rep,name=borrowers" json:"borrowers,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Response) Reset() {
|
||||
*m = CDeviceAuth_GetAuthorizedBorrowers_Response{}
|
||||
}
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_GetAuthorizedBorrowers_Response) ProtoMessage() {}
|
||||
func (*CDeviceAuth_GetAuthorizedBorrowers_Response) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{11}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Response) GetBorrowers() []*CDeviceAuth_GetAuthorizedBorrowers_Response_Borrower {
|
||||
if m != nil {
|
||||
return m.Borrowers
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CDeviceAuth_GetAuthorizedBorrowers_Response_Borrower struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
IsPending *bool `protobuf:"varint,2,opt,name=is_pending" json:"is_pending,omitempty"`
|
||||
IsCanceled *bool `protobuf:"varint,3,opt,name=is_canceled" json:"is_canceled,omitempty"`
|
||||
TimeCreated *uint32 `protobuf:"varint,4,opt,name=time_created" json:"time_created,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Response_Borrower) Reset() {
|
||||
*m = CDeviceAuth_GetAuthorizedBorrowers_Response_Borrower{}
|
||||
}
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Response_Borrower) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_GetAuthorizedBorrowers_Response_Borrower) ProtoMessage() {}
|
||||
func (*CDeviceAuth_GetAuthorizedBorrowers_Response_Borrower) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{11, 0}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Response_Borrower) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Response_Borrower) GetIsPending() bool {
|
||||
if m != nil && m.IsPending != nil {
|
||||
return *m.IsPending
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Response_Borrower) GetIsCanceled() bool {
|
||||
if m != nil && m.IsCanceled != nil {
|
||||
return *m.IsCanceled
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_GetAuthorizedBorrowers_Response_Borrower) GetTimeCreated() uint32 {
|
||||
if m != nil && m.TimeCreated != nil {
|
||||
return *m.TimeCreated
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CDeviceAuth_AddAuthorizedBorrowers_Request struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
SteamidBorrower []uint64 `protobuf:"fixed64,2,rep,name=steamid_borrower" json:"steamid_borrower,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AddAuthorizedBorrowers_Request) Reset() {
|
||||
*m = CDeviceAuth_AddAuthorizedBorrowers_Request{}
|
||||
}
|
||||
func (m *CDeviceAuth_AddAuthorizedBorrowers_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_AddAuthorizedBorrowers_Request) ProtoMessage() {}
|
||||
func (*CDeviceAuth_AddAuthorizedBorrowers_Request) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{12}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AddAuthorizedBorrowers_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AddAuthorizedBorrowers_Request) GetSteamidBorrower() []uint64 {
|
||||
if m != nil {
|
||||
return m.SteamidBorrower
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CDeviceAuth_AddAuthorizedBorrowers_Response struct {
|
||||
SecondsToWait *int32 `protobuf:"varint,1,opt,name=seconds_to_wait" json:"seconds_to_wait,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AddAuthorizedBorrowers_Response) Reset() {
|
||||
*m = CDeviceAuth_AddAuthorizedBorrowers_Response{}
|
||||
}
|
||||
func (m *CDeviceAuth_AddAuthorizedBorrowers_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_AddAuthorizedBorrowers_Response) ProtoMessage() {}
|
||||
func (*CDeviceAuth_AddAuthorizedBorrowers_Response) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{13}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_AddAuthorizedBorrowers_Response) GetSecondsToWait() int32 {
|
||||
if m != nil && m.SecondsToWait != nil {
|
||||
return *m.SecondsToWait
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CDeviceAuth_RemoveAuthorizedBorrowers_Request struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
SteamidBorrower []uint64 `protobuf:"fixed64,2,rep,name=steamid_borrower" json:"steamid_borrower,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_RemoveAuthorizedBorrowers_Request) Reset() {
|
||||
*m = CDeviceAuth_RemoveAuthorizedBorrowers_Request{}
|
||||
}
|
||||
func (m *CDeviceAuth_RemoveAuthorizedBorrowers_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_RemoveAuthorizedBorrowers_Request) ProtoMessage() {}
|
||||
func (*CDeviceAuth_RemoveAuthorizedBorrowers_Request) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{14}
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_RemoveAuthorizedBorrowers_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_RemoveAuthorizedBorrowers_Request) GetSteamidBorrower() []uint64 {
|
||||
if m != nil {
|
||||
return m.SteamidBorrower
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CDeviceAuth_RemoveAuthorizedBorrowers_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CDeviceAuth_RemoveAuthorizedBorrowers_Response) Reset() {
|
||||
*m = CDeviceAuth_RemoveAuthorizedBorrowers_Response{}
|
||||
}
|
||||
func (m *CDeviceAuth_RemoveAuthorizedBorrowers_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CDeviceAuth_RemoveAuthorizedBorrowers_Response) ProtoMessage() {}
|
||||
func (*CDeviceAuth_RemoveAuthorizedBorrowers_Response) Descriptor() ([]byte, []int) {
|
||||
return deviceauth_fileDescriptor0, []int{15}
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*CDeviceAuth_GetOwnAuthorizedDevices_Request)(nil), "CDeviceAuth_GetOwnAuthorizedDevices_Request")
|
||||
proto.RegisterType((*CDeviceAuth_GetOwnAuthorizedDevices_Response)(nil), "CDeviceAuth_GetOwnAuthorizedDevices_Response")
|
||||
proto.RegisterType((*CDeviceAuth_GetOwnAuthorizedDevices_Response_Device)(nil), "CDeviceAuth_GetOwnAuthorizedDevices_Response.Device")
|
||||
proto.RegisterType((*CDeviceAuth_AcceptAuthorizationRequest_Request)(nil), "CDeviceAuth_AcceptAuthorizationRequest_Request")
|
||||
proto.RegisterType((*CDeviceAuth_AcceptAuthorizationRequest_Response)(nil), "CDeviceAuth_AcceptAuthorizationRequest_Response")
|
||||
proto.RegisterType((*CDeviceAuth_AuthorizeRemoteDevice_Request)(nil), "CDeviceAuth_AuthorizeRemoteDevice_Request")
|
||||
proto.RegisterType((*CDeviceAuth_AuthorizeRemoteDevice_Response)(nil), "CDeviceAuth_AuthorizeRemoteDevice_Response")
|
||||
proto.RegisterType((*CDeviceAuth_DeauthorizeRemoteDevice_Request)(nil), "CDeviceAuth_DeauthorizeRemoteDevice_Request")
|
||||
proto.RegisterType((*CDeviceAuth_DeauthorizeRemoteDevice_Response)(nil), "CDeviceAuth_DeauthorizeRemoteDevice_Response")
|
||||
proto.RegisterType((*CDeviceAuth_GetUsedAuthorizedDevices_Request)(nil), "CDeviceAuth_GetUsedAuthorizedDevices_Request")
|
||||
proto.RegisterType((*CDeviceAuth_GetUsedAuthorizedDevices_Response)(nil), "CDeviceAuth_GetUsedAuthorizedDevices_Response")
|
||||
proto.RegisterType((*CDeviceAuth_GetUsedAuthorizedDevices_Response_Device)(nil), "CDeviceAuth_GetUsedAuthorizedDevices_Response.Device")
|
||||
proto.RegisterType((*CDeviceAuth_GetAuthorizedBorrowers_Request)(nil), "CDeviceAuth_GetAuthorizedBorrowers_Request")
|
||||
proto.RegisterType((*CDeviceAuth_GetAuthorizedBorrowers_Response)(nil), "CDeviceAuth_GetAuthorizedBorrowers_Response")
|
||||
proto.RegisterType((*CDeviceAuth_GetAuthorizedBorrowers_Response_Borrower)(nil), "CDeviceAuth_GetAuthorizedBorrowers_Response.Borrower")
|
||||
proto.RegisterType((*CDeviceAuth_AddAuthorizedBorrowers_Request)(nil), "CDeviceAuth_AddAuthorizedBorrowers_Request")
|
||||
proto.RegisterType((*CDeviceAuth_AddAuthorizedBorrowers_Response)(nil), "CDeviceAuth_AddAuthorizedBorrowers_Response")
|
||||
proto.RegisterType((*CDeviceAuth_RemoveAuthorizedBorrowers_Request)(nil), "CDeviceAuth_RemoveAuthorizedBorrowers_Request")
|
||||
proto.RegisterType((*CDeviceAuth_RemoveAuthorizedBorrowers_Response)(nil), "CDeviceAuth_RemoveAuthorizedBorrowers_Response")
|
||||
}
|
||||
|
||||
var deviceauth_fileDescriptor0 = []byte{
|
||||
// 934 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x56, 0xdf, 0x4e, 0x3b, 0x45,
|
||||
0x14, 0xce, 0xb6, 0x50, 0x60, 0x10, 0x91, 0x51, 0xa0, 0xec, 0x85, 0x4e, 0x56, 0x2f, 0x10, 0xca,
|
||||
0x80, 0x04, 0xe3, 0xff, 0x3f, 0x20, 0xa2, 0x17, 0x26, 0x26, 0x18, 0xa3, 0x72, 0xb3, 0x99, 0xee,
|
||||
0x0e, 0x74, 0x62, 0xbb, 0xbb, 0xee, 0x4c, 0x69, 0xf0, 0x8a, 0x98, 0xf8, 0x12, 0xfa, 0x06, 0x5e,
|
||||
0x19, 0x13, 0xa2, 0x89, 0x5e, 0xf8, 0x0e, 0xbe, 0x8d, 0x57, 0xbf, 0xb3, 0xb3, 0xb3, 0x85, 0x6d,
|
||||
0x77, 0x4b, 0xb7, 0xe1, 0xaa, 0x9b, 0x73, 0xce, 0x9c, 0xf9, 0xce, 0x99, 0xf3, 0x7d, 0xa7, 0x68,
|
||||
0x47, 0x2a, 0xce, 0x7a, 0x3d, 0x2e, 0x25, 0xbb, 0xe2, 0xd2, 0xf5, 0xf9, 0xb5, 0xf0, 0x38, 0xeb,
|
||||
0xab, 0x0e, 0xd5, 0x0e, 0xaf, 0x2b, 0x78, 0xa0, 0x68, 0x14, 0x87, 0x2a, 0xb4, 0x5b, 0xf9, 0xd8,
|
||||
0x7e, 0x20, 0x2e, 0x05, 0xf7, 0xdd, 0x36, 0x93, 0x7c, 0x3c, 0xda, 0xf9, 0x16, 0xed, 0x7e, 0x72,
|
||||
0xaa, 0xd3, 0x1d, 0x43, 0x3a, 0xf7, 0x33, 0xae, 0xbe, 0x1c, 0x04, 0xc9, 0x67, 0x18, 0x8b, 0x1f,
|
||||
0xb9, 0x9f, 0xba, 0xa4, 0x7b, 0xce, 0x7f, 0xe8, 0x73, 0xa9, 0xf0, 0x2a, 0x5a, 0xd0, 0x39, 0x84,
|
||||
0xdf, 0xb4, 0x88, 0xb5, 0xdd, 0xc0, 0x4d, 0xf4, 0x82, 0x08, 0xbc, 0x6e, 0xdf, 0xe7, 0xae, 0xc7,
|
||||
0x02, 0x8f, 0x77, 0xb9, 0xdf, 0xac, 0x81, 0x67, 0xd1, 0xf9, 0xab, 0x86, 0x5a, 0xd3, 0xa5, 0x96,
|
||||
0x51, 0x18, 0x48, 0x8e, 0x3f, 0x45, 0x0b, 0x69, 0x61, 0x12, 0x72, 0xd7, 0xb7, 0x97, 0x0f, 0x8f,
|
||||
0x68, 0x95, 0xf3, 0x34, 0x35, 0xd8, 0xff, 0x5a, 0xa8, 0x91, 0x7e, 0xe2, 0x2d, 0xb4, 0x96, 0x34,
|
||||
0xc9, 0xf4, 0xcb, 0x55, 0xe1, 0xf7, 0x3c, 0x30, 0xb8, 0x5f, 0x44, 0xcb, 0xc6, 0x1a, 0xb0, 0x1e,
|
||||
0xd7, 0x90, 0x97, 0x30, 0x46, 0x48, 0x48, 0x37, 0xe2, 0x81, 0x2f, 0x82, 0xab, 0x66, 0x3d, 0x29,
|
||||
0x23, 0x09, 0x04, 0xdb, 0xb0, 0xb6, 0x39, 0x6d, 0xdc, 0x40, 0xcf, 0x77, 0x99, 0x54, 0xae, 0x12,
|
||||
0x3d, 0xee, 0xf6, 0x25, 0xd8, 0xe7, 0xc1, 0xbe, 0x92, 0x74, 0x43, 0xdb, 0xdb, 0x61, 0x1c, 0x87,
|
||||
0x03, 0x1e, 0xbb, 0xd0, 0xa7, 0x86, 0xbe, 0x6f, 0x13, 0xad, 0x6a, 0x0f, 0x8b, 0x22, 0x37, 0xea,
|
||||
0xb2, 0x1b, 0x38, 0xb2, 0xa0, 0x8f, 0xa4, 0x77, 0x76, 0x45, 0x4f, 0x28, 0xb0, 0x2d, 0xea, 0xd6,
|
||||
0xfd, 0x6c, 0xa1, 0x5c, 0xe9, 0xc7, 0x9e, 0xc7, 0x23, 0x95, 0x95, 0xce, 0x94, 0x08, 0x03, 0xf3,
|
||||
0x20, 0xe5, 0x0f, 0x53, 0x58, 0x7b, 0x4d, 0xbb, 0xd6, 0xd0, 0x92, 0x76, 0x79, 0xa1, 0xcf, 0x75,
|
||||
0x95, 0x0d, 0xfc, 0x12, 0x7a, 0xee, 0x32, 0x0e, 0x7b, 0x6e, 0x96, 0x23, 0x29, 0xb3, 0xe1, 0xbc,
|
||||
0x81, 0xf6, 0xa7, 0x86, 0x91, 0x3e, 0x82, 0xf3, 0x0d, 0x7a, 0x3d, 0x77, 0x24, 0x7b, 0xae, 0x73,
|
||||
0xde, 0x0b, 0x15, 0x4f, 0x3d, 0xb3, 0x80, 0x76, 0x5a, 0x68, 0x67, 0x9a, 0xc4, 0x06, 0xc6, 0x77,
|
||||
0xf9, 0xb1, 0x3e, 0xd5, 0x64, 0x79, 0x1a, 0x20, 0x34, 0x3f, 0xd6, 0xe5, 0xa9, 0x0d, 0x94, 0x8f,
|
||||
0xc6, 0x68, 0xf0, 0x35, 0x0c, 0xcc, 0xf4, 0x14, 0x73, 0xfe, 0xb7, 0xd0, 0xde, 0x94, 0x19, 0x0c,
|
||||
0x93, 0xce, 0x46, 0x99, 0xf4, 0x26, 0xad, 0x94, 0x20, 0xa3, 0xd2, 0xed, 0xec, 0x54, 0x5a, 0x47,
|
||||
0x2b, 0xe1, 0x20, 0x00, 0x06, 0x64, 0xb5, 0xa4, 0x73, 0x36, 0x4e, 0x9c, 0x39, 0xcd, 0x82, 0x02,
|
||||
0x7a, 0x68, 0x46, 0x39, 0x51, 0xfe, 0xd9, 0x01, 0xfa, 0x3d, 0xec, 0x13, 0xc3, 0xb2, 0x59, 0xe4,
|
||||
0x29, 0xb9, 0x31, 0xf3, 0xe4, 0x08, 0xef, 0xfc, 0x67, 0x8d, 0x49, 0x62, 0xf1, 0x95, 0xa6, 0xd9,
|
||||
0x9f, 0xa3, 0xa5, 0x8c, 0xee, 0xa5, 0xed, 0x9e, 0x94, 0x80, 0x66, 0x26, 0xfb, 0x02, 0x2d, 0x66,
|
||||
0xdf, 0xe3, 0x95, 0xe4, 0xb5, 0xa9, 0x56, 0xa4, 0x4d, 0xa9, 0x60, 0x01, 0x95, 0x75, 0x77, 0xbd,
|
||||
0x98, 0x33, 0x95, 0x35, 0x18, 0x78, 0x99, 0xa7, 0x8f, 0xef, 0x57, 0xed, 0xa3, 0x31, 0x0c, 0xb5,
|
||||
0x0d, 0x30, 0xd4, 0x61, 0x3a, 0xcf, 0xf2, 0xdd, 0x2a, 0x4d, 0x6c, 0xba, 0x05, 0x6d, 0x97, 0xdc,
|
||||
0x0b, 0x03, 0x5f, 0xc2, 0x0c, 0xb9, 0x03, 0x26, 0x94, 0xbe, 0x61, 0xde, 0xb9, 0xc8, 0x0f, 0x79,
|
||||
0xc2, 0xa5, 0x6b, 0xfe, 0x44, 0x18, 0x0f, 0xf2, 0x72, 0x3a, 0x29, 0x77, 0x0a, 0xf3, 0xf0, 0xcf,
|
||||
0x65, 0x84, 0xee, 0x4f, 0xe0, 0x5f, 0x2c, 0xb4, 0x59, 0xb2, 0x7f, 0x70, 0x8b, 0x56, 0x58, 0xa0,
|
||||
0xf6, 0x5e, 0xa5, 0x9d, 0xe6, 0x38, 0x3f, 0xdd, 0x35, 0x5f, 0x86, 0x28, 0xd2, 0x15, 0x52, 0x91,
|
||||
0xf0, 0x92, 0x0c, 0xc5, 0xc6, 0x27, 0x86, 0xe2, 0xf8, 0xce, 0x42, 0x76, 0xb9, 0x34, 0xe3, 0xfd,
|
||||
0x8a, 0xab, 0xc4, 0x3e, 0xa0, 0x55, 0x45, 0xff, 0x08, 0x50, 0x1e, 0xa4, 0x81, 0x84, 0x05, 0x43,
|
||||
0x8c, 0x3a, 0x98, 0xc4, 0x69, 0x34, 0x69, 0xdf, 0x80, 0x2f, 0x54, 0x1d, 0x1e, 0x13, 0x20, 0x7e,
|
||||
0x2c, 0xf1, 0x6f, 0x16, 0x5a, 0x2f, 0x94, 0x71, 0xbc, 0x43, 0xa7, 0xde, 0x21, 0xf6, 0x2e, 0xad,
|
||||
0xb0, 0x16, 0xde, 0x06, 0xa0, 0x47, 0xc3, 0x18, 0x02, 0x0a, 0x05, 0xf0, 0x92, 0x40, 0xd3, 0x4c,
|
||||
0xa2, 0x3a, 0x4c, 0x91, 0x0e, 0x93, 0xc4, 0x10, 0x2d, 0x43, 0x8f, 0x7f, 0x85, 0x09, 0x28, 0x91,
|
||||
0xfa, 0x91, 0x09, 0x78, 0x64, 0xd7, 0x8c, 0x4c, 0xc0, 0xa3, 0xeb, 0xe3, 0x55, 0x80, 0xfc, 0xca,
|
||||
0x39, 0xbf, 0x06, 0xc1, 0xd5, 0x78, 0x0d, 0xd0, 0x5c, 0x8f, 0xf1, 0xdf, 0x16, 0x6a, 0x96, 0xa9,
|
||||
0x3a, 0xde, 0xa3, 0x55, 0xf6, 0x8f, 0x4d, 0xab, 0xed, 0x0a, 0xe7, 0x63, 0x00, 0xf8, 0xfe, 0xe4,
|
||||
0x11, 0xd5, 0x0f, 0x4e, 0x52, 0x5d, 0x27, 0x86, 0x9b, 0x3e, 0xb9, 0x82, 0x6d, 0x21, 0x09, 0xa0,
|
||||
0xff, 0xc3, 0x42, 0x1b, 0xc5, 0x22, 0x89, 0x77, 0xe9, 0xf4, 0xea, 0x6f, 0xb7, 0xaa, 0xc8, 0xae,
|
||||
0xf3, 0x01, 0xe0, 0x7e, 0xe7, 0x21, 0x6e, 0x3d, 0x95, 0xe9, 0x04, 0x80, 0xa4, 0x1a, 0x9c, 0x80,
|
||||
0xef, 0xe1, 0x48, 0x0f, 0x6b, 0xc2, 0xbf, 0x03, 0xe8, 0x62, 0xb1, 0x1b, 0x01, 0x3d, 0x59, 0x6a,
|
||||
0x47, 0x40, 0x3f, 0x22, 0x9f, 0xce, 0x7b, 0x00, 0xfa, 0x2d, 0x08, 0x2a, 0x07, 0x6b, 0xfe, 0x49,
|
||||
0x16, 0x09, 0xc5, 0x3f, 0x16, 0xda, 0x2a, 0xd5, 0x3e, 0x4c, 0x69, 0x25, 0xfd, 0xb5, 0xf7, 0x2b,
|
||||
0x6a, 0xaa, 0xf3, 0x21, 0x60, 0x7f, 0x37, 0x8d, 0x9b, 0x05, 0xbe, 0xfd, 0x1a, 0x9c, 0x27, 0x5f,
|
||||
0x88, 0x76, 0xcc, 0xe2, 0x1b, 0xf2, 0x55, 0x87, 0xc5, 0x09, 0x3f, 0x25, 0x57, 0x0a, 0x7e, 0x25,
|
||||
0x7c, 0xc4, 0x49, 0xd8, 0x49, 0xfd, 0xd6, 0xb2, 0x9e, 0x05, 0x00, 0x00, 0xff, 0xff, 0x27, 0xc5,
|
||||
0x15, 0xba, 0x30, 0x0d, 0x00, 0x00,
|
||||
}
|
||||
850
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/gamenotifications.pb.go
generated
vendored
Normal file
850
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/gamenotifications.pb.go
generated
vendored
Normal file
@@ -0,0 +1,850 @@
|
||||
// Code generated by protoc-gen-go.
|
||||
// source: steammessages_gamenotifications.steamclient.proto
|
||||
// DO NOT EDIT!
|
||||
|
||||
package unified
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
import fmt "fmt"
|
||||
import math "math"
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
type CGameNotifications_Variable struct {
|
||||
Key *string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"`
|
||||
Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_Variable) Reset() { *m = CGameNotifications_Variable{} }
|
||||
func (m *CGameNotifications_Variable) String() string { return proto.CompactTextString(m) }
|
||||
func (*CGameNotifications_Variable) ProtoMessage() {}
|
||||
func (*CGameNotifications_Variable) Descriptor() ([]byte, []int) { return gamenotifications_fileDescriptor0, []int{0} }
|
||||
|
||||
func (m *CGameNotifications_Variable) GetKey() string {
|
||||
if m != nil && m.Key != nil {
|
||||
return *m.Key
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_Variable) GetValue() string {
|
||||
if m != nil && m.Value != nil {
|
||||
return *m.Value
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CGameNotifications_LocalizedText struct {
|
||||
Token *string `protobuf:"bytes,1,opt,name=token" json:"token,omitempty"`
|
||||
Variables []*CGameNotifications_Variable `protobuf:"bytes,2,rep,name=variables" json:"variables,omitempty"`
|
||||
RenderedText *string `protobuf:"bytes,3,opt,name=rendered_text" json:"rendered_text,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_LocalizedText) Reset() { *m = CGameNotifications_LocalizedText{} }
|
||||
func (m *CGameNotifications_LocalizedText) String() string { return proto.CompactTextString(m) }
|
||||
func (*CGameNotifications_LocalizedText) ProtoMessage() {}
|
||||
func (*CGameNotifications_LocalizedText) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{1}
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_LocalizedText) GetToken() string {
|
||||
if m != nil && m.Token != nil {
|
||||
return *m.Token
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_LocalizedText) GetVariables() []*CGameNotifications_Variable {
|
||||
if m != nil {
|
||||
return m.Variables
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_LocalizedText) GetRenderedText() string {
|
||||
if m != nil && m.RenderedText != nil {
|
||||
return *m.RenderedText
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CGameNotifications_UserStatus struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
State *string `protobuf:"bytes,2,opt,name=state" json:"state,omitempty"`
|
||||
Title *CGameNotifications_LocalizedText `protobuf:"bytes,3,opt,name=title" json:"title,omitempty"`
|
||||
Message *CGameNotifications_LocalizedText `protobuf:"bytes,4,opt,name=message" json:"message,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UserStatus) Reset() { *m = CGameNotifications_UserStatus{} }
|
||||
func (m *CGameNotifications_UserStatus) String() string { return proto.CompactTextString(m) }
|
||||
func (*CGameNotifications_UserStatus) ProtoMessage() {}
|
||||
func (*CGameNotifications_UserStatus) Descriptor() ([]byte, []int) { return gamenotifications_fileDescriptor0, []int{2} }
|
||||
|
||||
func (m *CGameNotifications_UserStatus) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UserStatus) GetState() string {
|
||||
if m != nil && m.State != nil {
|
||||
return *m.State
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UserStatus) GetTitle() *CGameNotifications_LocalizedText {
|
||||
if m != nil {
|
||||
return m.Title
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UserStatus) GetMessage() *CGameNotifications_LocalizedText {
|
||||
if m != nil {
|
||||
return m.Message
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CGameNotifications_CreateSession_Request struct {
|
||||
Appid *uint32 `protobuf:"varint,1,opt,name=appid" json:"appid,omitempty"`
|
||||
Context *uint64 `protobuf:"varint,2,opt,name=context" json:"context,omitempty"`
|
||||
Title *CGameNotifications_LocalizedText `protobuf:"bytes,3,opt,name=title" json:"title,omitempty"`
|
||||
Users []*CGameNotifications_UserStatus `protobuf:"bytes,4,rep,name=users" json:"users,omitempty"`
|
||||
Steamid *uint64 `protobuf:"fixed64,5,opt,name=steamid" json:"steamid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_CreateSession_Request) Reset() {
|
||||
*m = CGameNotifications_CreateSession_Request{}
|
||||
}
|
||||
func (m *CGameNotifications_CreateSession_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CGameNotifications_CreateSession_Request) ProtoMessage() {}
|
||||
func (*CGameNotifications_CreateSession_Request) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{3}
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_CreateSession_Request) GetAppid() uint32 {
|
||||
if m != nil && m.Appid != nil {
|
||||
return *m.Appid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_CreateSession_Request) GetContext() uint64 {
|
||||
if m != nil && m.Context != nil {
|
||||
return *m.Context
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_CreateSession_Request) GetTitle() *CGameNotifications_LocalizedText {
|
||||
if m != nil {
|
||||
return m.Title
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_CreateSession_Request) GetUsers() []*CGameNotifications_UserStatus {
|
||||
if m != nil {
|
||||
return m.Users
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_CreateSession_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CGameNotifications_CreateSession_Response struct {
|
||||
Sessionid *uint64 `protobuf:"varint,1,opt,name=sessionid" json:"sessionid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_CreateSession_Response) Reset() {
|
||||
*m = CGameNotifications_CreateSession_Response{}
|
||||
}
|
||||
func (m *CGameNotifications_CreateSession_Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*CGameNotifications_CreateSession_Response) ProtoMessage() {}
|
||||
func (*CGameNotifications_CreateSession_Response) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{4}
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_CreateSession_Response) GetSessionid() uint64 {
|
||||
if m != nil && m.Sessionid != nil {
|
||||
return *m.Sessionid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CGameNotifications_DeleteSession_Request struct {
|
||||
Sessionid *uint64 `protobuf:"varint,1,opt,name=sessionid" json:"sessionid,omitempty"`
|
||||
Appid *uint32 `protobuf:"varint,2,opt,name=appid" json:"appid,omitempty"`
|
||||
Steamid *uint64 `protobuf:"fixed64,3,opt,name=steamid" json:"steamid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_DeleteSession_Request) Reset() {
|
||||
*m = CGameNotifications_DeleteSession_Request{}
|
||||
}
|
||||
func (m *CGameNotifications_DeleteSession_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CGameNotifications_DeleteSession_Request) ProtoMessage() {}
|
||||
func (*CGameNotifications_DeleteSession_Request) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{5}
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_DeleteSession_Request) GetSessionid() uint64 {
|
||||
if m != nil && m.Sessionid != nil {
|
||||
return *m.Sessionid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_DeleteSession_Request) GetAppid() uint32 {
|
||||
if m != nil && m.Appid != nil {
|
||||
return *m.Appid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_DeleteSession_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CGameNotifications_DeleteSession_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_DeleteSession_Response) Reset() {
|
||||
*m = CGameNotifications_DeleteSession_Response{}
|
||||
}
|
||||
func (m *CGameNotifications_DeleteSession_Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*CGameNotifications_DeleteSession_Response) ProtoMessage() {}
|
||||
func (*CGameNotifications_DeleteSession_Response) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{6}
|
||||
}
|
||||
|
||||
type CGameNotifications_UpdateSession_Request struct {
|
||||
Sessionid *uint64 `protobuf:"varint,1,opt,name=sessionid" json:"sessionid,omitempty"`
|
||||
Appid *uint32 `protobuf:"varint,2,opt,name=appid" json:"appid,omitempty"`
|
||||
Title *CGameNotifications_LocalizedText `protobuf:"bytes,3,opt,name=title" json:"title,omitempty"`
|
||||
Users []*CGameNotifications_UserStatus `protobuf:"bytes,4,rep,name=users" json:"users,omitempty"`
|
||||
Steamid *uint64 `protobuf:"fixed64,6,opt,name=steamid" json:"steamid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UpdateSession_Request) Reset() {
|
||||
*m = CGameNotifications_UpdateSession_Request{}
|
||||
}
|
||||
func (m *CGameNotifications_UpdateSession_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CGameNotifications_UpdateSession_Request) ProtoMessage() {}
|
||||
func (*CGameNotifications_UpdateSession_Request) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{7}
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UpdateSession_Request) GetSessionid() uint64 {
|
||||
if m != nil && m.Sessionid != nil {
|
||||
return *m.Sessionid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UpdateSession_Request) GetAppid() uint32 {
|
||||
if m != nil && m.Appid != nil {
|
||||
return *m.Appid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UpdateSession_Request) GetTitle() *CGameNotifications_LocalizedText {
|
||||
if m != nil {
|
||||
return m.Title
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UpdateSession_Request) GetUsers() []*CGameNotifications_UserStatus {
|
||||
if m != nil {
|
||||
return m.Users
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UpdateSession_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CGameNotifications_UpdateSession_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UpdateSession_Response) Reset() {
|
||||
*m = CGameNotifications_UpdateSession_Response{}
|
||||
}
|
||||
func (m *CGameNotifications_UpdateSession_Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*CGameNotifications_UpdateSession_Response) ProtoMessage() {}
|
||||
func (*CGameNotifications_UpdateSession_Response) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{8}
|
||||
}
|
||||
|
||||
type CGameNotifications_EnumerateSessions_Request struct {
|
||||
Appid *uint32 `protobuf:"varint,1,opt,name=appid" json:"appid,omitempty"`
|
||||
IncludeAllUserMessages *bool `protobuf:"varint,3,opt,name=include_all_user_messages" json:"include_all_user_messages,omitempty"`
|
||||
IncludeAuthUserMessage *bool `protobuf:"varint,4,opt,name=include_auth_user_message" json:"include_auth_user_message,omitempty"`
|
||||
Language *string `protobuf:"bytes,5,opt,name=language" json:"language,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_EnumerateSessions_Request) Reset() {
|
||||
*m = CGameNotifications_EnumerateSessions_Request{}
|
||||
}
|
||||
func (m *CGameNotifications_EnumerateSessions_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CGameNotifications_EnumerateSessions_Request) ProtoMessage() {}
|
||||
func (*CGameNotifications_EnumerateSessions_Request) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{9}
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_EnumerateSessions_Request) GetAppid() uint32 {
|
||||
if m != nil && m.Appid != nil {
|
||||
return *m.Appid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_EnumerateSessions_Request) GetIncludeAllUserMessages() bool {
|
||||
if m != nil && m.IncludeAllUserMessages != nil {
|
||||
return *m.IncludeAllUserMessages
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_EnumerateSessions_Request) GetIncludeAuthUserMessage() bool {
|
||||
if m != nil && m.IncludeAuthUserMessage != nil {
|
||||
return *m.IncludeAuthUserMessage
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_EnumerateSessions_Request) GetLanguage() string {
|
||||
if m != nil && m.Language != nil {
|
||||
return *m.Language
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CGameNotifications_Session struct {
|
||||
Sessionid *uint64 `protobuf:"varint,1,opt,name=sessionid" json:"sessionid,omitempty"`
|
||||
Appid *uint64 `protobuf:"varint,2,opt,name=appid" json:"appid,omitempty"`
|
||||
Context *uint64 `protobuf:"varint,3,opt,name=context" json:"context,omitempty"`
|
||||
Title *CGameNotifications_LocalizedText `protobuf:"bytes,4,opt,name=title" json:"title,omitempty"`
|
||||
TimeCreated *uint32 `protobuf:"varint,5,opt,name=time_created" json:"time_created,omitempty"`
|
||||
TimeUpdated *uint32 `protobuf:"varint,6,opt,name=time_updated" json:"time_updated,omitempty"`
|
||||
UserStatus []*CGameNotifications_UserStatus `protobuf:"bytes,7,rep,name=user_status" json:"user_status,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_Session) Reset() { *m = CGameNotifications_Session{} }
|
||||
func (m *CGameNotifications_Session) String() string { return proto.CompactTextString(m) }
|
||||
func (*CGameNotifications_Session) ProtoMessage() {}
|
||||
func (*CGameNotifications_Session) Descriptor() ([]byte, []int) { return gamenotifications_fileDescriptor0, []int{10} }
|
||||
|
||||
func (m *CGameNotifications_Session) GetSessionid() uint64 {
|
||||
if m != nil && m.Sessionid != nil {
|
||||
return *m.Sessionid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_Session) GetAppid() uint64 {
|
||||
if m != nil && m.Appid != nil {
|
||||
return *m.Appid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_Session) GetContext() uint64 {
|
||||
if m != nil && m.Context != nil {
|
||||
return *m.Context
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_Session) GetTitle() *CGameNotifications_LocalizedText {
|
||||
if m != nil {
|
||||
return m.Title
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_Session) GetTimeCreated() uint32 {
|
||||
if m != nil && m.TimeCreated != nil {
|
||||
return *m.TimeCreated
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_Session) GetTimeUpdated() uint32 {
|
||||
if m != nil && m.TimeUpdated != nil {
|
||||
return *m.TimeUpdated
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_Session) GetUserStatus() []*CGameNotifications_UserStatus {
|
||||
if m != nil {
|
||||
return m.UserStatus
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CGameNotifications_EnumerateSessions_Response struct {
|
||||
Sessions []*CGameNotifications_Session `protobuf:"bytes,1,rep,name=sessions" json:"sessions,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_EnumerateSessions_Response) Reset() {
|
||||
*m = CGameNotifications_EnumerateSessions_Response{}
|
||||
}
|
||||
func (m *CGameNotifications_EnumerateSessions_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CGameNotifications_EnumerateSessions_Response) ProtoMessage() {}
|
||||
func (*CGameNotifications_EnumerateSessions_Response) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{11}
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_EnumerateSessions_Response) GetSessions() []*CGameNotifications_Session {
|
||||
if m != nil {
|
||||
return m.Sessions
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CGameNotifications_GetSessionDetails_Request struct {
|
||||
Sessions []*CGameNotifications_GetSessionDetails_Request_RequestedSession `protobuf:"bytes,1,rep,name=sessions" json:"sessions,omitempty"`
|
||||
Appid *uint32 `protobuf:"varint,2,opt,name=appid" json:"appid,omitempty"`
|
||||
Language *string `protobuf:"bytes,3,opt,name=language" json:"language,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_GetSessionDetails_Request) Reset() {
|
||||
*m = CGameNotifications_GetSessionDetails_Request{}
|
||||
}
|
||||
func (m *CGameNotifications_GetSessionDetails_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CGameNotifications_GetSessionDetails_Request) ProtoMessage() {}
|
||||
func (*CGameNotifications_GetSessionDetails_Request) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{12}
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_GetSessionDetails_Request) GetSessions() []*CGameNotifications_GetSessionDetails_Request_RequestedSession {
|
||||
if m != nil {
|
||||
return m.Sessions
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_GetSessionDetails_Request) GetAppid() uint32 {
|
||||
if m != nil && m.Appid != nil {
|
||||
return *m.Appid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_GetSessionDetails_Request) GetLanguage() string {
|
||||
if m != nil && m.Language != nil {
|
||||
return *m.Language
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CGameNotifications_GetSessionDetails_Request_RequestedSession struct {
|
||||
Sessionid *uint64 `protobuf:"varint,1,opt,name=sessionid" json:"sessionid,omitempty"`
|
||||
IncludeAuthUserMessage *bool `protobuf:"varint,3,opt,name=include_auth_user_message" json:"include_auth_user_message,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_GetSessionDetails_Request_RequestedSession) Reset() {
|
||||
*m = CGameNotifications_GetSessionDetails_Request_RequestedSession{}
|
||||
}
|
||||
func (m *CGameNotifications_GetSessionDetails_Request_RequestedSession) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CGameNotifications_GetSessionDetails_Request_RequestedSession) ProtoMessage() {}
|
||||
func (*CGameNotifications_GetSessionDetails_Request_RequestedSession) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{12, 0}
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_GetSessionDetails_Request_RequestedSession) GetSessionid() uint64 {
|
||||
if m != nil && m.Sessionid != nil {
|
||||
return *m.Sessionid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_GetSessionDetails_Request_RequestedSession) GetIncludeAuthUserMessage() bool {
|
||||
if m != nil && m.IncludeAuthUserMessage != nil {
|
||||
return *m.IncludeAuthUserMessage
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type CGameNotifications_GetSessionDetails_Response struct {
|
||||
Sessions []*CGameNotifications_Session `protobuf:"bytes,1,rep,name=sessions" json:"sessions,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_GetSessionDetails_Response) Reset() {
|
||||
*m = CGameNotifications_GetSessionDetails_Response{}
|
||||
}
|
||||
func (m *CGameNotifications_GetSessionDetails_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CGameNotifications_GetSessionDetails_Response) ProtoMessage() {}
|
||||
func (*CGameNotifications_GetSessionDetails_Response) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{13}
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_GetSessionDetails_Response) GetSessions() []*CGameNotifications_Session {
|
||||
if m != nil {
|
||||
return m.Sessions
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type GameNotificationSettings struct {
|
||||
Appid *uint32 `protobuf:"varint,1,opt,name=appid" json:"appid,omitempty"`
|
||||
AllowNotifications *bool `protobuf:"varint,2,opt,name=allow_notifications" json:"allow_notifications,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *GameNotificationSettings) Reset() { *m = GameNotificationSettings{} }
|
||||
func (m *GameNotificationSettings) String() string { return proto.CompactTextString(m) }
|
||||
func (*GameNotificationSettings) ProtoMessage() {}
|
||||
func (*GameNotificationSettings) Descriptor() ([]byte, []int) { return gamenotifications_fileDescriptor0, []int{14} }
|
||||
|
||||
func (m *GameNotificationSettings) GetAppid() uint32 {
|
||||
if m != nil && m.Appid != nil {
|
||||
return *m.Appid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *GameNotificationSettings) GetAllowNotifications() bool {
|
||||
if m != nil && m.AllowNotifications != nil {
|
||||
return *m.AllowNotifications
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type CGameNotifications_UpdateNotificationSettings_Request struct {
|
||||
GameNotificationSettings []*GameNotificationSettings `protobuf:"bytes,1,rep,name=game_notification_settings" json:"game_notification_settings,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UpdateNotificationSettings_Request) Reset() {
|
||||
*m = CGameNotifications_UpdateNotificationSettings_Request{}
|
||||
}
|
||||
func (m *CGameNotifications_UpdateNotificationSettings_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CGameNotifications_UpdateNotificationSettings_Request) ProtoMessage() {}
|
||||
func (*CGameNotifications_UpdateNotificationSettings_Request) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{15}
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UpdateNotificationSettings_Request) GetGameNotificationSettings() []*GameNotificationSettings {
|
||||
if m != nil {
|
||||
return m.GameNotificationSettings
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CGameNotifications_UpdateNotificationSettings_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_UpdateNotificationSettings_Response) Reset() {
|
||||
*m = CGameNotifications_UpdateNotificationSettings_Response{}
|
||||
}
|
||||
func (m *CGameNotifications_UpdateNotificationSettings_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CGameNotifications_UpdateNotificationSettings_Response) ProtoMessage() {}
|
||||
func (*CGameNotifications_UpdateNotificationSettings_Response) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{16}
|
||||
}
|
||||
|
||||
type CGameNotifications_OnNotificationsRequested_Notification struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
Appid *uint32 `protobuf:"varint,2,opt,name=appid" json:"appid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_OnNotificationsRequested_Notification) Reset() {
|
||||
*m = CGameNotifications_OnNotificationsRequested_Notification{}
|
||||
}
|
||||
func (m *CGameNotifications_OnNotificationsRequested_Notification) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CGameNotifications_OnNotificationsRequested_Notification) ProtoMessage() {}
|
||||
func (*CGameNotifications_OnNotificationsRequested_Notification) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{17}
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_OnNotificationsRequested_Notification) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_OnNotificationsRequested_Notification) GetAppid() uint32 {
|
||||
if m != nil && m.Appid != nil {
|
||||
return *m.Appid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CGameNotifications_OnUserStatusChanged_Notification struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
Sessionid *uint64 `protobuf:"varint,2,opt,name=sessionid" json:"sessionid,omitempty"`
|
||||
Appid *uint32 `protobuf:"varint,3,opt,name=appid" json:"appid,omitempty"`
|
||||
Status *CGameNotifications_UserStatus `protobuf:"bytes,4,opt,name=status" json:"status,omitempty"`
|
||||
Removed *bool `protobuf:"varint,5,opt,name=removed" json:"removed,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_OnUserStatusChanged_Notification) Reset() {
|
||||
*m = CGameNotifications_OnUserStatusChanged_Notification{}
|
||||
}
|
||||
func (m *CGameNotifications_OnUserStatusChanged_Notification) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CGameNotifications_OnUserStatusChanged_Notification) ProtoMessage() {}
|
||||
func (*CGameNotifications_OnUserStatusChanged_Notification) Descriptor() ([]byte, []int) {
|
||||
return gamenotifications_fileDescriptor0, []int{18}
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_OnUserStatusChanged_Notification) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_OnUserStatusChanged_Notification) GetSessionid() uint64 {
|
||||
if m != nil && m.Sessionid != nil {
|
||||
return *m.Sessionid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_OnUserStatusChanged_Notification) GetAppid() uint32 {
|
||||
if m != nil && m.Appid != nil {
|
||||
return *m.Appid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_OnUserStatusChanged_Notification) GetStatus() *CGameNotifications_UserStatus {
|
||||
if m != nil {
|
||||
return m.Status
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CGameNotifications_OnUserStatusChanged_Notification) GetRemoved() bool {
|
||||
if m != nil && m.Removed != nil {
|
||||
return *m.Removed
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*CGameNotifications_Variable)(nil), "CGameNotifications_Variable")
|
||||
proto.RegisterType((*CGameNotifications_LocalizedText)(nil), "CGameNotifications_LocalizedText")
|
||||
proto.RegisterType((*CGameNotifications_UserStatus)(nil), "CGameNotifications_UserStatus")
|
||||
proto.RegisterType((*CGameNotifications_CreateSession_Request)(nil), "CGameNotifications_CreateSession_Request")
|
||||
proto.RegisterType((*CGameNotifications_CreateSession_Response)(nil), "CGameNotifications_CreateSession_Response")
|
||||
proto.RegisterType((*CGameNotifications_DeleteSession_Request)(nil), "CGameNotifications_DeleteSession_Request")
|
||||
proto.RegisterType((*CGameNotifications_DeleteSession_Response)(nil), "CGameNotifications_DeleteSession_Response")
|
||||
proto.RegisterType((*CGameNotifications_UpdateSession_Request)(nil), "CGameNotifications_UpdateSession_Request")
|
||||
proto.RegisterType((*CGameNotifications_UpdateSession_Response)(nil), "CGameNotifications_UpdateSession_Response")
|
||||
proto.RegisterType((*CGameNotifications_EnumerateSessions_Request)(nil), "CGameNotifications_EnumerateSessions_Request")
|
||||
proto.RegisterType((*CGameNotifications_Session)(nil), "CGameNotifications_Session")
|
||||
proto.RegisterType((*CGameNotifications_EnumerateSessions_Response)(nil), "CGameNotifications_EnumerateSessions_Response")
|
||||
proto.RegisterType((*CGameNotifications_GetSessionDetails_Request)(nil), "CGameNotifications_GetSessionDetails_Request")
|
||||
proto.RegisterType((*CGameNotifications_GetSessionDetails_Request_RequestedSession)(nil), "CGameNotifications_GetSessionDetails_Request.RequestedSession")
|
||||
proto.RegisterType((*CGameNotifications_GetSessionDetails_Response)(nil), "CGameNotifications_GetSessionDetails_Response")
|
||||
proto.RegisterType((*GameNotificationSettings)(nil), "GameNotificationSettings")
|
||||
proto.RegisterType((*CGameNotifications_UpdateNotificationSettings_Request)(nil), "CGameNotifications_UpdateNotificationSettings_Request")
|
||||
proto.RegisterType((*CGameNotifications_UpdateNotificationSettings_Response)(nil), "CGameNotifications_UpdateNotificationSettings_Response")
|
||||
proto.RegisterType((*CGameNotifications_OnNotificationsRequested_Notification)(nil), "CGameNotifications_OnNotificationsRequested_Notification")
|
||||
proto.RegisterType((*CGameNotifications_OnUserStatusChanged_Notification)(nil), "CGameNotifications_OnUserStatusChanged_Notification")
|
||||
}
|
||||
|
||||
var gamenotifications_fileDescriptor0 = []byte{
|
||||
// 2245 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xd4, 0x59, 0xcd, 0x8f, 0x1c, 0x47,
|
||||
0x15, 0x57, 0xef, 0xec, 0x7a, 0xd7, 0x65, 0x2c, 0x91, 0x0e, 0x12, 0x93, 0xb1, 0xe3, 0xb4, 0x3b,
|
||||
0x38, 0xde, 0x8d, 0x77, 0xcb, 0x78, 0x43, 0xfc, 0x01, 0x24, 0xc2, 0xbd, 0x8e, 0x4c, 0x24, 0xb3,
|
||||
0x49, 0xbc, 0x9b, 0x60, 0x21, 0xc4, 0xa8, 0xa6, 0xbb, 0x66, 0xa7, 0xb3, 0x3d, 0xdd, 0x43, 0x57,
|
||||
0xf5, 0x6e, 0x36, 0x07, 0x82, 0xcc, 0xd7, 0x09, 0x82, 0x48, 0x22, 0x40, 0x48, 0x91, 0x90, 0x50,
|
||||
0xc4, 0x81, 0x0b, 0x87, 0x1c, 0x41, 0x48, 0x91, 0x38, 0x72, 0xcc, 0x15, 0xce, 0xfc, 0x15, 0xbc,
|
||||
0xfa, 0xec, 0xee, 0x99, 0x1e, 0xef, 0xcc, 0x22, 0x11, 0x71, 0xb1, 0x3c, 0x5d, 0xf5, 0xde, 0xfb,
|
||||
0xd5, 0x7b, 0xbf, 0xf7, 0x51, 0xb5, 0xe8, 0x1a, 0xe3, 0x94, 0x0c, 0x87, 0x94, 0x31, 0xb2, 0x47,
|
||||
0x59, 0x77, 0x8f, 0x0c, 0x69, 0x9a, 0xf1, 0xb8, 0x1f, 0x87, 0x84, 0xc7, 0x59, 0xca, 0xb0, 0x5c,
|
||||
0x0f, 0x93, 0x98, 0xa6, 0x1c, 0x8f, 0xf2, 0x8c, 0x67, 0x9d, 0xf5, 0xba, 0x48, 0x91, 0xc2, 0x6e,
|
||||
0x1a, 0x75, 0x7b, 0x84, 0xd1, 0xc9, 0xdd, 0xfe, 0xbf, 0x16, 0xd0, 0xb9, 0xad, 0xbb, 0xa0, 0x76,
|
||||
0xbb, 0xaa, 0xb6, 0xfb, 0x06, 0xc9, 0x63, 0xd2, 0x4b, 0xa8, 0xfb, 0x91, 0x83, 0x5a, 0xfb, 0xf4,
|
||||
0xa8, 0xed, 0x78, 0xce, 0xea, 0xe9, 0xe0, 0x37, 0xce, 0xc3, 0x8f, 0xdb, 0xef, 0x39, 0xbb, 0x03,
|
||||
0xea, 0xa5, 0x20, 0xe3, 0x65, 0x7d, 0x8f, 0xc3, 0xff, 0x0f, 0xf4, 0x6e, 0x2f, 0x4e, 0xe5, 0xef,
|
||||
0x24, 0x0b, 0x49, 0x12, 0xbf, 0x4d, 0x23, 0x8f, 0xd3, 0xb7, 0xb8, 0xb7, 0xb1, 0xe1, 0x91, 0xf4,
|
||||
0xe8, 0x70, 0x40, 0x73, 0x0a, 0xcb, 0x84, 0x7b, 0x97, 0x8c, 0x80, 0x50, 0x72, 0xc9, 0x8b, 0x99,
|
||||
0xd7, 0xcf, 0x8a, 0x34, 0xf2, 0x0e, 0x63, 0x3e, 0xd0, 0x2a, 0xa4, 0x60, 0xcc, 0xe1, 0x53, 0x92,
|
||||
0x78, 0x3d, 0xea, 0xb1, 0xa2, 0xc7, 0x78, 0xcc, 0x8b, 0x88, 0xaa, 0x6d, 0x72, 0xd3, 0x5e, 0x7c,
|
||||
0x40, 0x53, 0xb0, 0x9e, 0x14, 0xd4, 0xfd, 0xb5, 0x83, 0x96, 0xe4, 0xff, 0xda, 0x0b, 0x12, 0xea,
|
||||
0xcf, 0x04, 0xd4, 0x87, 0x12, 0xaa, 0xfc, 0x3c, 0x81, 0x95, 0x67, 0x56, 0x29, 0x9f, 0x86, 0x1c,
|
||||
0xbe, 0x8e, 0x12, 0x12, 0x5a, 0x61, 0x63, 0x50, 0xa9, 0xc0, 0x9e, 0xb7, 0x45, 0x52, 0x40, 0xc9,
|
||||
0x68, 0xd2, 0x17, 0x20, 0x89, 0x91, 0x97, 0x5e, 0x04, 0x0b, 0xfb, 0x34, 0xc5, 0xfe, 0x4f, 0x5a,
|
||||
0xc8, 0x6b, 0x70, 0xf1, 0x3d, 0x63, 0x6a, 0x17, 0x2c, 0xb9, 0xdf, 0x44, 0x4b, 0x72, 0xbb, 0x76,
|
||||
0xf4, 0x2d, 0x00, 0xff, 0xfc, 0xed, 0x06, 0x75, 0xca, 0x81, 0x43, 0x32, 0x62, 0xe2, 0x00, 0x02,
|
||||
0x53, 0x44, 0x59, 0x9c, 0x03, 0x60, 0xc6, 0xf3, 0x38, 0xdd, 0xc3, 0xee, 0xcf, 0x1d, 0x74, 0xda,
|
||||
0x20, 0x64, 0xe0, 0x8c, 0xd6, 0xea, 0x99, 0xcd, 0xf3, 0xf8, 0x11, 0x31, 0x0e, 0xbe, 0x0b, 0xc6,
|
||||
0x1e, 0x80, 0xb1, 0x98, 0x71, 0x71, 0x50, 0x2b, 0xac, 0x1c, 0xc7, 0x26, 0x3d, 0x05, 0xd1, 0xac,
|
||||
0xec, 0x52, 0xb1, 0x9b, 0x70, 0xa0, 0xc1, 0xf3, 0x53, 0x07, 0x9d, 0xcd, 0x69, 0x1a, 0x41, 0xf4,
|
||||
0xa3, 0xae, 0xf0, 0x6a, 0xbb, 0x25, 0x8f, 0x98, 0x81, 0xd5, 0x7d, 0x71, 0x76, 0xcf, 0xac, 0x1a,
|
||||
0x1d, 0x39, 0xfd, 0x3e, 0x98, 0xe5, 0xf0, 0x21, 0x21, 0xe9, 0x5e, 0x01, 0x34, 0x5e, 0xf7, 0xc2,
|
||||
0x6c, 0x38, 0x4a, 0x28, 0x98, 0x97, 0xc1, 0xb7, 0x41, 0xb4, 0xb8, 0xc4, 0x89, 0xd6, 0xbd, 0xb8,
|
||||
0x2f, 0x62, 0xa0, 0x85, 0xbc, 0x43, 0xc2, 0x3c, 0x36, 0xa2, 0xa1, 0x4c, 0x00, 0xec, 0x7f, 0xb0,
|
||||
0x88, 0x9e, 0x6c, 0x70, 0xc3, 0xeb, 0x8c, 0xe6, 0x3b, 0x9c, 0xf0, 0x82, 0xb9, 0xd7, 0xd0, 0xb2,
|
||||
0xcc, 0x90, 0x38, 0x92, 0x61, 0x38, 0x15, 0x78, 0x80, 0xf1, 0xbc, 0xa0, 0x90, 0x56, 0x13, 0x7a,
|
||||
0x05, 0xec, 0xbe, 0x0c, 0x6a, 0xd5, 0x36, 0xec, 0xfe, 0x01, 0x68, 0xc7, 0x40, 0xda, 0xd0, 0xee,
|
||||
0x7d, 0x41, 0xbb, 0x77, 0x25, 0xed, 0xec, 0x56, 0x58, 0x05, 0xaa, 0xe4, 0x94, 0x44, 0x47, 0x22,
|
||||
0x17, 0xb8, 0x5e, 0x13, 0xbc, 0x57, 0x1f, 0xc1, 0xc1, 0x40, 0xb3, 0x23, 0xd8, 0x74, 0x48, 0x62,
|
||||
0x0e, 0x5e, 0x13, 0xdb, 0x84, 0x0a, 0x91, 0xef, 0x62, 0x9b, 0xf9, 0x9c, 0x09, 0xdf, 0x7b, 0x24,
|
||||
0x94, 0x7c, 0xe8, 0xe7, 0xd9, 0xd0, 0x2a, 0xc3, 0xd6, 0x43, 0xd1, 0xba, 0xa2, 0xaa, 0x16, 0xcd,
|
||||
0x0e, 0x60, 0xd1, 0xfd, 0x31, 0xc0, 0x04, 0x3f, 0x25, 0x54, 0x3a, 0xff, 0xcc, 0xe6, 0x45, 0x7c,
|
||||
0x1c, 0x23, 0x83, 0xfb, 0x70, 0x90, 0xed, 0x5d, 0x21, 0x63, 0xd8, 0xcf, 0xa0, 0xa6, 0x28, 0x22,
|
||||
0x7a, 0x51, 0xcc, 0x04, 0x62, 0xc5, 0x41, 0xb0, 0xa2, 0xce, 0x23, 0xc3, 0x17, 0xe7, 0x96, 0x49,
|
||||
0x02, 0xe8, 0x81, 0x95, 0x63, 0xd8, 0xfd, 0x95, 0x83, 0x96, 0x75, 0x65, 0x6a, 0x2f, 0xce, 0x0a,
|
||||
0xe4, 0x7b, 0x00, 0xe4, 0x3b, 0x3b, 0x45, 0x8f, 0xcf, 0x83, 0x45, 0xfe, 0x53, 0xd6, 0x93, 0x47,
|
||||
0x80, 0xf2, 0xdf, 0x5b, 0x42, 0xab, 0x0d, 0x20, 0xb6, 0x20, 0x36, 0x9c, 0xee, 0xa8, 0x6d, 0xdd,
|
||||
0xfb, 0x8a, 0x93, 0xee, 0x0d, 0xb4, 0x44, 0x46, 0x23, 0x4d, 0x90, 0xb3, 0xc1, 0x2a, 0x60, 0xfb,
|
||||
0x92, 0x88, 0x94, 0xfc, 0x28, 0x20, 0x84, 0x52, 0xac, 0x86, 0xb1, 0x9f, 0x41, 0x04, 0xde, 0x41,
|
||||
0xcb, 0x61, 0x96, 0x4a, 0xfe, 0x0b, 0xa6, 0x2c, 0x06, 0x29, 0x88, 0xbe, 0x29, 0xcc, 0x6e, 0x58,
|
||||
0x8e, 0x7a, 0x7a, 0x87, 0xae, 0x58, 0x36, 0x8c, 0x21, 0x04, 0x1d, 0x0e, 0x24, 0xf5, 0x13, 0xc6,
|
||||
0xb2, 0x30, 0x1e, 0x37, 0x21, 0xb3, 0x82, 0x65, 0xa2, 0x24, 0xf7, 0xde, 0xa4, 0x21, 0x17, 0x4c,
|
||||
0x51, 0xc7, 0xee, 0x91, 0x10, 0xca, 0x06, 0x30, 0xf5, 0x47, 0xf3, 0x53, 0xe0, 0x35, 0x80, 0xf8,
|
||||
0x2d, 0x71, 0xba, 0x69, 0xae, 0x87, 0x9a, 0xa7, 0xbd, 0x4f, 0x6d, 0xf5, 0xa6, 0x24, 0x1c, 0x18,
|
||||
0xee, 0x1b, 0x9f, 0x97, 0x0c, 0x20, 0x68, 0x49, 0xac, 0x31, 0x08, 0xbf, 0x28, 0x4c, 0x17, 0xf0,
|
||||
0x23, 0x33, 0x32, 0xd8, 0x04, 0x04, 0x58, 0x20, 0x88, 0x53, 0xc8, 0x00, 0x92, 0xa8, 0x6c, 0x92,
|
||||
0x61, 0x84, 0xbe, 0x20, 0x35, 0x99, 0xaa, 0xa1, 0x6d, 0x60, 0xf7, 0x13, 0xa7, 0x4c, 0xe3, 0x25,
|
||||
0x99, 0xc6, 0x7f, 0x16, 0x49, 0xf9, 0x27, 0x67, 0xf5, 0x95, 0x91, 0x30, 0x40, 0x92, 0x35, 0x93,
|
||||
0xbf, 0xe2, 0x0c, 0x43, 0xb2, 0x4f, 0xab, 0x65, 0x47, 0xb8, 0xae, 0x47, 0x07, 0x04, 0x4a, 0x3a,
|
||||
0x98, 0x81, 0x44, 0x84, 0xa2, 0x62, 0x23, 0xb4, 0x5e, 0x66, 0xef, 0xb0, 0x80, 0xbd, 0x3d, 0x3a,
|
||||
0x66, 0x1e, 0xf2, 0x33, 0xaa, 0x60, 0xeb, 0x51, 0x91, 0xb6, 0x24, 0x8a, 0x54, 0xf0, 0xaa, 0x1b,
|
||||
0x8d, 0x7c, 0x3f, 0x87, 0x76, 0x1c, 0xb1, 0xb2, 0xab, 0xc9, 0x74, 0xf6, 0x63, 0xb4, 0x36, 0x03,
|
||||
0x29, 0xd9, 0x08, 0xbe, 0x52, 0xf7, 0xeb, 0xe8, 0xb4, 0x56, 0xab, 0x99, 0xb9, 0x18, 0xac, 0xc1,
|
||||
0x91, 0x2f, 0xed, 0x96, 0xf6, 0xe0, 0xb0, 0x3a, 0x7e, 0x8a, 0xa1, 0x91, 0x75, 0x98, 0xff, 0xee,
|
||||
0x42, 0x63, 0x02, 0xdc, 0xa1, 0xa2, 0x9c, 0x8c, 0x27, 0xc0, 0xd5, 0x49, 0x53, 0xe7, 0xc1, 0x54,
|
||||
0xbb, 0x6e, 0x4a, 0xa4, 0xa5, 0x14, 0xc7, 0xee, 0x75, 0x93, 0x31, 0x0b, 0x32, 0x63, 0x2e, 0xc3,
|
||||
0xe6, 0xa7, 0xcb, 0x8c, 0x69, 0x48, 0x67, 0x2d, 0xf7, 0x76, 0x19, 0xc5, 0x96, 0x8c, 0x62, 0x0c,
|
||||
0x92, 0xf4, 0x7f, 0x11, 0x43, 0xec, 0x5f, 0x69, 0x74, 0xfe, 0xb8, 0x43, 0x94, 0xf3, 0xfd, 0xbf,
|
||||
0x34, 0xd7, 0x8f, 0xd7, 0x47, 0x11, 0xf9, 0x2f, 0xdc, 0x57, 0x48, 0xf1, 0xf9, 0xdd, 0x67, 0xe4,
|
||||
0x7e, 0x39, 0x7f, 0xba, 0xcb, 0x42, 0x5b, 0x71, 0xb0, 0x1c, 0xf3, 0xe8, 0x61, 0x63, 0xf6, 0x43,
|
||||
0xaf, 0x7a, 0xb9, 0xef, 0xc1, 0x2c, 0x3a, 0xee, 0x57, 0xb5, 0x59, 0x8e, 0x6d, 0x62, 0x15, 0x9c,
|
||||
0x1b, 0x0e, 0xa0, 0x21, 0x43, 0x03, 0x76, 0xff, 0xe1, 0xcc, 0x97, 0xfc, 0x1f, 0x8a, 0xb4, 0xfd,
|
||||
0x6d, 0x35, 0x6d, 0xcb, 0x21, 0x45, 0xa5, 0xd7, 0xe1, 0x20, 0x63, 0x54, 0xd7, 0x04, 0x33, 0x29,
|
||||
0x2a, 0x07, 0x48, 0x1f, 0xe6, 0xb4, 0x9f, 0x88, 0x62, 0x58, 0x8e, 0x6e, 0xba, 0x19, 0xbf, 0xdc,
|
||||
0xb7, 0x1c, 0x60, 0x1e, 0x81, 0xb1, 0x54, 0x40, 0x25, 0x89, 0xea, 0xc6, 0x75, 0x32, 0xc8, 0x53,
|
||||
0x1d, 0x59, 0xed, 0x36, 0x95, 0x63, 0x5e, 0xaf, 0x34, 0xa7, 0xfe, 0x6f, 0x2b, 0x4d, 0x33, 0xd9,
|
||||
0xc7, 0xe9, 0xab, 0xc9, 0xfe, 0xfb, 0x45, 0xb4, 0xde, 0xb0, 0xfb, 0xa5, 0xb4, 0x18, 0xd2, 0xbc,
|
||||
0x14, 0x60, 0x96, 0xf0, 0x3f, 0xa8, 0x37, 0x4c, 0x35, 0xf5, 0x8d, 0x93, 0xdd, 0x38, 0x24, 0xa2,
|
||||
0x9c, 0xc4, 0x09, 0x93, 0x1d, 0xd3, 0x33, 0x3e, 0xc4, 0x0d, 0x4c, 0x13, 0xe7, 0xe6, 0x95, 0x19,
|
||||
0x4b, 0x5b, 0xb5, 0x61, 0xca, 0x29, 0x2f, 0xf2, 0x54, 0x90, 0xee, 0x17, 0x0e, 0x7a, 0x22, 0x4e,
|
||||
0xc3, 0x04, 0x6e, 0x0e, 0x5d, 0x90, 0xea, 0x0a, 0x89, 0xae, 0xb9, 0x1d, 0xc9, 0xdc, 0x58, 0x09,
|
||||
0xf6, 0x01, 0xd4, 0x5e, 0x25, 0x66, 0x41, 0x96, 0x25, 0x14, 0x7a, 0x2e, 0xc0, 0xa1, 0xf9, 0x10,
|
||||
0x5a, 0x0f, 0x78, 0x16, 0xae, 0x2f, 0x60, 0x30, 0x97, 0x56, 0xb5, 0xb8, 0x80, 0x59, 0x89, 0x00,
|
||||
0x1b, 0x64, 0x45, 0x12, 0xa9, 0x40, 0x49, 0x7b, 0x11, 0xf6, 0xee, 0xd0, 0x3e, 0x29, 0x12, 0x2e,
|
||||
0x67, 0xe8, 0x3e, 0x49, 0xe0, 0x0a, 0xe6, 0xfe, 0xae, 0x0a, 0xa8, 0xe0, 0x83, 0x1a, 0x22, 0x39,
|
||||
0x15, 0xad, 0x04, 0x6f, 0x01, 0x20, 0x7e, 0x42, 0x40, 0xe2, 0xb7, 0xd0, 0x0b, 0x77, 0x3c, 0x11,
|
||||
0x1e, 0xa0, 0x83, 0x24, 0xd1, 0x8c, 0xe8, 0x02, 0xb4, 0x62, 0xe6, 0x67, 0xd9, 0x3c, 0x4f, 0x07,
|
||||
0x5f, 0x06, 0x2c, 0xeb, 0x15, 0x2c, 0xf7, 0xcc, 0x78, 0x0d, 0x42, 0x66, 0xda, 0xaf, 0x5c, 0xd9,
|
||||
0xa0, 0x7a, 0x7e, 0xb2, 0x88, 0x3a, 0x0d, 0x1c, 0xd1, 0xd4, 0x80, 0x8a, 0x36, 0x51, 0x02, 0x9f,
|
||||
0x06, 0x1b, 0x4f, 0xd5, 0x59, 0xa1, 0x8e, 0x12, 0xb3, 0xb2, 0xaf, 0x6f, 0x54, 0x2b, 0xe1, 0x62,
|
||||
0x70, 0x01, 0x64, 0x3a, 0x65, 0x25, 0x34, 0x47, 0xb7, 0xdb, 0x2b, 0x03, 0x57, 0xeb, 0x33, 0x19,
|
||||
0xb8, 0x1e, 0x98, 0x02, 0x3c, 0xf3, 0xa4, 0xfb, 0x0c, 0x20, 0xf4, 0xc5, 0x91, 0xc2, 0x22, 0x87,
|
||||
0x4b, 0x11, 0xd7, 0xc5, 0x74, 0xe2, 0x68, 0x5f, 0x43, 0x9f, 0xe3, 0xf1, 0x90, 0x76, 0x75, 0x27,
|
||||
0x97, 0x81, 0x3a, 0x1b, 0x5c, 0x02, 0xe9, 0x8b, 0x6a, 0x5a, 0x1b, 0x8e, 0x81, 0x85, 0x8b, 0x90,
|
||||
0xde, 0x8b, 0xdd, 0x6f, 0x68, 0x61, 0x5d, 0x27, 0x65, 0xe1, 0x3a, 0x1b, 0x3c, 0x0b, 0xc2, 0xcf,
|
||||
0x08, 0xe1, 0x84, 0x30, 0xde, 0xac, 0x41, 0x0b, 0x60, 0x37, 0x42, 0x67, 0x24, 0x67, 0x99, 0x2c,
|
||||
0xd3, 0xed, 0xe5, 0x99, 0x8a, 0xf9, 0x55, 0x30, 0x70, 0x45, 0x86, 0x58, 0xfe, 0x36, 0x23, 0x5c,
|
||||
0x59, 0x86, 0xc7, 0x7b, 0xf0, 0x43, 0x07, 0x6d, 0xcc, 0x58, 0x69, 0xf4, 0x14, 0xf4, 0x1a, 0x5a,
|
||||
0x31, 0x85, 0x00, 0x78, 0x25, 0x40, 0x9d, 0xc3, 0xd3, 0x79, 0x18, 0xf8, 0x80, 0xe8, 0x42, 0xd9,
|
||||
0x51, 0x1a, 0xca, 0x09, 0xf6, 0x3f, 0x6d, 0x35, 0x96, 0xbb, 0xbb, 0x94, 0x6b, 0x2d, 0x77, 0x54,
|
||||
0xc5, 0xb2, 0xe5, 0xee, 0xd5, 0x09, 0x0c, 0x2f, 0xe2, 0x79, 0x14, 0xe0, 0xfb, 0xe6, 0xf2, 0x6b,
|
||||
0xd2, 0x05, 0xd7, 0x07, 0x80, 0xa7, 0x00, 0xf5, 0xb9, 0xa9, 0xb4, 0x87, 0x09, 0xfb, 0x46, 0x25,
|
||||
0x83, 0xd5, 0x4d, 0x5b, 0x12, 0xe3, 0xd8, 0xb4, 0xed, 0xfc, 0xdb, 0x41, 0x9f, 0x9f, 0xb0, 0x7e,
|
||||
0x73, 0x32, 0x59, 0x2d, 0xcf, 0x6a, 0x25, 0x7c, 0x8f, 0xd6, 0xcb, 0xf7, 0x31, 0x75, 0xae, 0xf5,
|
||||
0xd9, 0xd6, 0x39, 0xff, 0x9d, 0x46, 0x72, 0x35, 0x85, 0x45, 0x93, 0x6b, 0x7b, 0x3e, 0x72, 0xd9,
|
||||
0x30, 0x19, 0x9f, 0x8c, 0x8d, 0x4f, 0xfe, 0x1f, 0x1d, 0xd4, 0x1e, 0x17, 0xdf, 0xa1, 0x5c, 0x5c,
|
||||
0xf3, 0xd9, 0xc9, 0x6f, 0x99, 0x3b, 0xe8, 0x71, 0xc8, 0xaa, 0xec, 0xb0, 0x5b, 0x7b, 0x25, 0x94,
|
||||
0xd4, 0x59, 0x09, 0xae, 0x83, 0x9a, 0xcd, 0x6f, 0x57, 0xdc, 0x29, 0x1d, 0x26, 0xf7, 0x33, 0xaf,
|
||||
0x2a, 0x50, 0x16, 0x5f, 0x30, 0x88, 0xfd, 0x03, 0xf4, 0xfc, 0xd4, 0x01, 0xa1, 0x09, 0xbe, 0x4d,
|
||||
0x86, 0x17, 0x50, 0x47, 0x94, 0xd3, 0x1a, 0x98, 0x2e, 0xd3, 0xbb, 0xb4, 0x17, 0x9f, 0xc0, 0xd3,
|
||||
0xbc, 0xe0, 0xdf, 0x44, 0xd7, 0xe7, 0xb5, 0xab, 0xa7, 0x94, 0xbf, 0x3b, 0xe8, 0x66, 0x83, 0xe8,
|
||||
0x2b, 0x69, 0xed, 0xb7, 0x25, 0x7b, 0xb7, 0xfa, 0x19, 0x22, 0x3d, 0xf6, 0x0a, 0xf4, 0x02, 0xf8,
|
||||
0xed, 0x96, 0x99, 0xe3, 0x2a, 0x95, 0x42, 0x8c, 0x9f, 0x35, 0xbf, 0xc1, 0xfc, 0x21, 0xde, 0x38,
|
||||
0xcb, 0xf7, 0x2b, 0x19, 0x93, 0xaf, 0xd6, 0x13, 0xf8, 0x0a, 0x68, 0xbb, 0x5c, 0x09, 0xa6, 0x78,
|
||||
0xcf, 0x2b, 0x25, 0xea, 0xaf, 0xbb, 0xfe, 0x5f, 0x5b, 0xe8, 0xb9, 0xc6, 0x83, 0x94, 0x95, 0x75,
|
||||
0x4b, 0x8d, 0xd7, 0xf5, 0x33, 0xbc, 0x38, 0x7e, 0x86, 0x0d, 0xb0, 0xba, 0x36, 0xe5, 0x0c, 0xcc,
|
||||
0x16, 0x65, 0x3b, 0xaa, 0x3f, 0xa8, 0xa6, 0xbd, 0xea, 0xb7, 0x2f, 0x81, 0x86, 0xdb, 0x8d, 0x17,
|
||||
0x4a, 0xdb, 0x24, 0xf4, 0x0b, 0x6f, 0xed, 0xe9, 0xab, 0x60, 0xaa, 0xfd, 0x18, 0xcd, 0xf7, 0x8c,
|
||||
0x37, 0x5a, 0xd2, 0x1b, 0xd2, 0xb7, 0x53, 0xef, 0x33, 0xd3, 0x34, 0x5a, 0x6d, 0x6f, 0xa0, 0x53,
|
||||
0xba, 0x0b, 0xa9, 0x26, 0x7b, 0x5c, 0x17, 0x92, 0x1d, 0xb6, 0x52, 0x70, 0xb6, 0xe1, 0x7a, 0x53,
|
||||
0x36, 0x24, 0x3b, 0x13, 0xbb, 0x77, 0xd1, 0x72, 0x4e, 0x87, 0xd9, 0x81, 0x6e, 0xae, 0x3a, 0x77,
|
||||
0x2a, 0x82, 0x42, 0xa7, 0x37, 0x20, 0x62, 0xee, 0x86, 0x6b, 0x85, 0xde, 0x5b, 0x3e, 0xc9, 0x99,
|
||||
0x34, 0xdf, 0xfc, 0x68, 0x05, 0x3d, 0x36, 0x81, 0x48, 0xbc, 0xd1, 0x3e, 0x26, 0x34, 0xd4, 0xae,
|
||||
0xf3, 0xee, 0x1a, 0x9e, 0xf5, 0x19, 0xaa, 0xf3, 0x2c, 0x9e, 0xf9, 0x71, 0xc0, 0xbf, 0x08, 0xd0,
|
||||
0x9f, 0x54, 0x6b, 0x4c, 0x3e, 0x1f, 0xb2, 0xa3, 0x34, 0x54, 0x73, 0x8e, 0x86, 0x69, 0xf1, 0xd4,
|
||||
0x6e, 0xb8, 0xcd, 0x78, 0x1a, 0x5f, 0x05, 0x9a, 0xf1, 0x4c, 0xb9, 0x2f, 0x4b, 0x3c, 0x6a, 0xed,
|
||||
0x38, 0x3c, 0xb5, 0x4b, 0x48, 0x33, 0x9e, 0xc6, 0x6b, 0x76, 0x33, 0x9e, 0x29, 0x57, 0x1a, 0x89,
|
||||
0x47, 0xad, 0x4d, 0xc3, 0xf3, 0x3e, 0xe0, 0x99, 0x18, 0x3c, 0xdc, 0x0d, 0x3c, 0xcf, 0x4d, 0xa8,
|
||||
0x83, 0xf1, 0x5c, 0xe3, 0x8c, 0x2f, 0x1f, 0x9f, 0xed, 0x3a, 0x40, 0x1b, 0x1f, 0x4f, 0xdc, 0x0f,
|
||||
0x01, 0xd6, 0x44, 0xcb, 0x6a, 0x86, 0x35, 0x75, 0xe0, 0x68, 0x86, 0x35, 0xbd, 0x11, 0xfa, 0x72,
|
||||
0x52, 0x84, 0x75, 0xfd, 0xc7, 0x07, 0xdb, 0xf1, 0x01, 0x9f, 0x7d, 0x25, 0x37, 0x7e, 0xfb, 0xd4,
|
||||
0x41, 0x9d, 0xe9, 0xf5, 0xda, 0xbd, 0x8e, 0x4f, 0xd4, 0x57, 0x3a, 0x37, 0xf0, 0x09, 0xfb, 0xc2,
|
||||
0x5d, 0xc0, 0xbe, 0x65, 0x42, 0x6d, 0x06, 0x0b, 0x52, 0xeb, 0x83, 0x32, 0xee, 0xf5, 0xa2, 0x3e,
|
||||
0x76, 0x38, 0xa8, 0x54, 0x9d, 0x57, 0x41, 0xd1, 0xbd, 0xdb, 0x70, 0xce, 0xfc, 0x20, 0x0e, 0xd5,
|
||||
0x3c, 0xd2, 0x2f, 0xd2, 0x50, 0xed, 0xcf, 0x69, 0x62, 0x5e, 0x20, 0xe4, 0x90, 0x22, 0xf8, 0x94,
|
||||
0x67, 0x69, 0x56, 0x34, 0x68, 0x97, 0x2a, 0xa0, 0xe2, 0x6c, 0xfe, 0x73, 0x01, 0x7d, 0x71, 0xe2,
|
||||
0x50, 0x5b, 0xf2, 0x4f, 0x75, 0xee, 0x07, 0x30, 0x2b, 0x4c, 0xeb, 0x5d, 0xee, 0x2d, 0x7c, 0xd2,
|
||||
0x4e, 0xd7, 0x39, 0x83, 0xb7, 0x33, 0xeb, 0x9b, 0x6b, 0x70, 0xa4, 0x0d, 0xbd, 0x91, 0xa9, 0xb6,
|
||||
0x64, 0x9b, 0x44, 0x36, 0x12, 0x23, 0x22, 0x1f, 0xeb, 0x76, 0x22, 0x4d, 0x1f, 0x6f, 0x68, 0x45,
|
||||
0xee, 0x57, 0xf0, 0x09, 0x7a, 0x56, 0x1d, 0xcd, 0x73, 0x80, 0xe6, 0x6a, 0x75, 0xb9, 0x8e, 0xa8,
|
||||
0x6c, 0x05, 0x83, 0xb2, 0xb9, 0x74, 0xc4, 0x4b, 0xda, 0x17, 0x94, 0xcf, 0xea, 0x48, 0xff, 0xf6,
|
||||
0x71, 0x7b, 0x21, 0x68, 0xfd, 0xd0, 0x71, 0xfe, 0x13, 0x00, 0x00, 0xff, 0xff, 0x0c, 0x81, 0x5e,
|
||||
0xd6, 0x51, 0x1d, 0x00, 0x00,
|
||||
}
|
||||
163
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/offline.pb.go
generated
vendored
Normal file
163
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/offline.pb.go
generated
vendored
Normal file
@@ -0,0 +1,163 @@
|
||||
// Code generated by protoc-gen-go.
|
||||
// source: steammessages_offline.steamclient.proto
|
||||
// DO NOT EDIT!
|
||||
|
||||
package unified
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
import fmt "fmt"
|
||||
import math "math"
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
type COffline_GetOfflineLogonTicket_Request struct {
|
||||
Priority *uint32 `protobuf:"varint,1,opt,name=priority" json:"priority,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *COffline_GetOfflineLogonTicket_Request) Reset() {
|
||||
*m = COffline_GetOfflineLogonTicket_Request{}
|
||||
}
|
||||
func (m *COffline_GetOfflineLogonTicket_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*COffline_GetOfflineLogonTicket_Request) ProtoMessage() {}
|
||||
func (*COffline_GetOfflineLogonTicket_Request) Descriptor() ([]byte, []int) {
|
||||
return offline_fileDescriptor0, []int{0}
|
||||
}
|
||||
|
||||
func (m *COffline_GetOfflineLogonTicket_Request) GetPriority() uint32 {
|
||||
if m != nil && m.Priority != nil {
|
||||
return *m.Priority
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type COffline_GetOfflineLogonTicket_Response struct {
|
||||
SerializedTicket []byte `protobuf:"bytes,1,opt,name=serialized_ticket" json:"serialized_ticket,omitempty"`
|
||||
Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *COffline_GetOfflineLogonTicket_Response) Reset() {
|
||||
*m = COffline_GetOfflineLogonTicket_Response{}
|
||||
}
|
||||
func (m *COffline_GetOfflineLogonTicket_Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*COffline_GetOfflineLogonTicket_Response) ProtoMessage() {}
|
||||
func (*COffline_GetOfflineLogonTicket_Response) Descriptor() ([]byte, []int) {
|
||||
return offline_fileDescriptor0, []int{1}
|
||||
}
|
||||
|
||||
func (m *COffline_GetOfflineLogonTicket_Response) GetSerializedTicket() []byte {
|
||||
if m != nil {
|
||||
return m.SerializedTicket
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *COffline_GetOfflineLogonTicket_Response) GetSignature() []byte {
|
||||
if m != nil {
|
||||
return m.Signature
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type COffline_GetUnsignedOfflineLogonTicket_Request struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *COffline_GetUnsignedOfflineLogonTicket_Request) Reset() {
|
||||
*m = COffline_GetUnsignedOfflineLogonTicket_Request{}
|
||||
}
|
||||
func (m *COffline_GetUnsignedOfflineLogonTicket_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*COffline_GetUnsignedOfflineLogonTicket_Request) ProtoMessage() {}
|
||||
func (*COffline_GetUnsignedOfflineLogonTicket_Request) Descriptor() ([]byte, []int) {
|
||||
return offline_fileDescriptor0, []int{2}
|
||||
}
|
||||
|
||||
type COffline_OfflineLogonTicket struct {
|
||||
Accountid *uint32 `protobuf:"varint,1,opt,name=accountid" json:"accountid,omitempty"`
|
||||
Rtime32CreationTime *uint32 `protobuf:"fixed32,2,opt,name=rtime32_creation_time" json:"rtime32_creation_time,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *COffline_OfflineLogonTicket) Reset() { *m = COffline_OfflineLogonTicket{} }
|
||||
func (m *COffline_OfflineLogonTicket) String() string { return proto.CompactTextString(m) }
|
||||
func (*COffline_OfflineLogonTicket) ProtoMessage() {}
|
||||
func (*COffline_OfflineLogonTicket) Descriptor() ([]byte, []int) { return offline_fileDescriptor0, []int{3} }
|
||||
|
||||
func (m *COffline_OfflineLogonTicket) GetAccountid() uint32 {
|
||||
if m != nil && m.Accountid != nil {
|
||||
return *m.Accountid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *COffline_OfflineLogonTicket) GetRtime32CreationTime() uint32 {
|
||||
if m != nil && m.Rtime32CreationTime != nil {
|
||||
return *m.Rtime32CreationTime
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type COffline_GetUnsignedOfflineLogonTicket_Response struct {
|
||||
Ticket *COffline_OfflineLogonTicket `protobuf:"bytes,1,opt,name=ticket" json:"ticket,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *COffline_GetUnsignedOfflineLogonTicket_Response) Reset() {
|
||||
*m = COffline_GetUnsignedOfflineLogonTicket_Response{}
|
||||
}
|
||||
func (m *COffline_GetUnsignedOfflineLogonTicket_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*COffline_GetUnsignedOfflineLogonTicket_Response) ProtoMessage() {}
|
||||
func (*COffline_GetUnsignedOfflineLogonTicket_Response) Descriptor() ([]byte, []int) {
|
||||
return offline_fileDescriptor0, []int{4}
|
||||
}
|
||||
|
||||
func (m *COffline_GetUnsignedOfflineLogonTicket_Response) GetTicket() *COffline_OfflineLogonTicket {
|
||||
if m != nil {
|
||||
return m.Ticket
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*COffline_GetOfflineLogonTicket_Request)(nil), "COffline_GetOfflineLogonTicket_Request")
|
||||
proto.RegisterType((*COffline_GetOfflineLogonTicket_Response)(nil), "COffline_GetOfflineLogonTicket_Response")
|
||||
proto.RegisterType((*COffline_GetUnsignedOfflineLogonTicket_Request)(nil), "COffline_GetUnsignedOfflineLogonTicket_Request")
|
||||
proto.RegisterType((*COffline_OfflineLogonTicket)(nil), "COffline_OfflineLogonTicket")
|
||||
proto.RegisterType((*COffline_GetUnsignedOfflineLogonTicket_Response)(nil), "COffline_GetUnsignedOfflineLogonTicket_Response")
|
||||
}
|
||||
|
||||
var offline_fileDescriptor0 = []byte{
|
||||
// 377 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x94, 0x52, 0xcd, 0x4a, 0xf3, 0x40,
|
||||
0x14, 0x25, 0x5f, 0xe1, 0xab, 0x8e, 0x0a, 0x76, 0xa0, 0x10, 0x63, 0x0b, 0x43, 0x16, 0xb6, 0x8b,
|
||||
0x92, 0x96, 0xba, 0x52, 0x70, 0xa3, 0x88, 0x08, 0x42, 0x41, 0x14, 0x97, 0x61, 0x4c, 0x6e, 0xe2,
|
||||
0x60, 0x3a, 0x53, 0x67, 0x6e, 0x04, 0x5d, 0x89, 0xaf, 0xe2, 0x33, 0xf4, 0x01, 0x7c, 0x33, 0xf3,
|
||||
0x87, 0x56, 0xac, 0xb5, 0xdd, 0x25, 0x37, 0xe7, 0xdc, 0x9c, 0x9f, 0x4b, 0x3a, 0x06, 0x81, 0x8f,
|
||||
0xc7, 0x60, 0x0c, 0x8f, 0xc1, 0xf8, 0x2a, 0x8a, 0x12, 0x21, 0xc1, 0x2b, 0xa6, 0x41, 0x22, 0x40,
|
||||
0xa2, 0x37, 0xd1, 0x0a, 0x95, 0xd3, 0xfb, 0x0e, 0x4c, 0xa5, 0x88, 0x04, 0x84, 0xfe, 0x2d, 0x37,
|
||||
0x73, 0xd0, 0xee, 0x21, 0xd9, 0x3b, 0x19, 0x95, 0xbb, 0xfc, 0x33, 0xc0, 0xea, 0xf1, 0x42, 0xc5,
|
||||
0x4a, 0x5e, 0x89, 0xe0, 0x1e, 0xd0, 0xbf, 0x84, 0x87, 0x14, 0x0c, 0xd2, 0x6d, 0xb2, 0x36, 0xd1,
|
||||
0x42, 0x69, 0x81, 0x4f, 0xb6, 0xc5, 0xac, 0xee, 0x96, 0x7b, 0x43, 0x3a, 0x7f, 0x72, 0xcd, 0x44,
|
||||
0x49, 0x03, 0x74, 0x87, 0x34, 0x0c, 0x68, 0xc1, 0x13, 0xf1, 0x9c, 0x69, 0xc1, 0xe2, 0x6b, 0xb1,
|
||||
0x65, 0x93, 0x36, 0xc8, 0xba, 0x11, 0xb1, 0xe4, 0x98, 0x6a, 0xb0, 0xff, 0xe5, 0x23, 0x77, 0x40,
|
||||
0xbc, 0xd9, 0xc5, 0xd7, 0x32, 0x07, 0x40, 0xf8, 0xbb, 0x38, 0x77, 0x44, 0x76, 0x3f, 0x19, 0x3f,
|
||||
0x61, 0xf9, 0x3f, 0x78, 0x10, 0xa8, 0x54, 0xa2, 0x08, 0x4b, 0xf1, 0xb4, 0x4d, 0x9a, 0x1a, 0xc5,
|
||||
0x18, 0xf6, 0x87, 0x7e, 0xa0, 0x81, 0xa3, 0x50, 0xd2, 0xcf, 0xdf, 0x0b, 0x09, 0x75, 0xd7, 0x27,
|
||||
0xfd, 0xa5, 0x25, 0x54, 0x1e, 0x7b, 0xe4, 0xff, 0x8c, 0xb1, 0x8d, 0x61, 0xcb, 0x5b, 0x20, 0x69,
|
||||
0xf8, 0x56, 0x23, 0xf5, 0x6a, 0x4c, 0xa7, 0x16, 0x69, 0xce, 0x0d, 0x90, 0x76, 0xbc, 0xe5, 0xda,
|
||||
0x71, 0xba, 0xde, 0x92, 0x55, 0xb8, 0xe7, 0xaf, 0x53, 0xfb, 0x34, 0xc3, 0x30, 0xce, 0xbe, 0x2a,
|
||||
0x61, 0x5c, 0x86, 0xac, 0xb4, 0xc8, 0xaa, 0xd3, 0x62, 0x49, 0xce, 0x66, 0xa5, 0x25, 0x16, 0x29,
|
||||
0xcd, 0xf0, 0x0e, 0x58, 0x90, 0x6a, 0x9d, 0x5d, 0x0f, 0x4b, 0x33, 0x2e, 0x7d, 0xb7, 0x48, 0x7b,
|
||||
0x61, 0x38, 0xb4, 0xbf, 0x62, 0x91, 0xce, 0xc0, 0x5b, 0x31, 0x76, 0xf7, 0x28, 0xf3, 0x73, 0x50,
|
||||
0xf8, 0x91, 0x2c, 0x95, 0xab, 0x7a, 0x70, 0x5a, 0x19, 0xdd, 0xae, 0xf6, 0x67, 0x81, 0x20, 0x0a,
|
||||
0x19, 0x9b, 0x3c, 0x99, 0x47, 0x11, 0xc0, 0x71, 0xed, 0xc5, 0xb2, 0x3e, 0x02, 0x00, 0x00, 0xff,
|
||||
0xff, 0x90, 0xd3, 0xb5, 0xf7, 0x7b, 0x03, 0x00, 0x00,
|
||||
}
|
||||
791
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/parental.pb.go
generated
vendored
Normal file
791
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/unified/parental.pb.go
generated
vendored
Normal file
@@ -0,0 +1,791 @@
|
||||
// Code generated by protoc-gen-go.
|
||||
// source: steammessages_parental.steamclient.proto
|
||||
// DO NOT EDIT!
|
||||
|
||||
package unified
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
import fmt "fmt"
|
||||
import math "math"
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
type ParentalApp struct {
|
||||
Appid *uint32 `protobuf:"varint,1,opt,name=appid" json:"appid,omitempty"`
|
||||
IsAllowed *bool `protobuf:"varint,2,opt,name=is_allowed" json:"is_allowed,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ParentalApp) Reset() { *m = ParentalApp{} }
|
||||
func (m *ParentalApp) String() string { return proto.CompactTextString(m) }
|
||||
func (*ParentalApp) ProtoMessage() {}
|
||||
func (*ParentalApp) Descriptor() ([]byte, []int) { return parental_fileDescriptor0, []int{0} }
|
||||
|
||||
func (m *ParentalApp) GetAppid() uint32 {
|
||||
if m != nil && m.Appid != nil {
|
||||
return *m.Appid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ParentalApp) GetIsAllowed() bool {
|
||||
if m != nil && m.IsAllowed != nil {
|
||||
return *m.IsAllowed
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type ParentalSettings struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,1,opt,name=steamid" json:"steamid,omitempty"`
|
||||
ApplistBaseId *uint32 `protobuf:"varint,2,opt,name=applist_base_id" json:"applist_base_id,omitempty"`
|
||||
ApplistBaseDescription *string `protobuf:"bytes,3,opt,name=applist_base_description" json:"applist_base_description,omitempty"`
|
||||
ApplistBase []*ParentalApp `protobuf:"bytes,4,rep,name=applist_base" json:"applist_base,omitempty"`
|
||||
ApplistCustom []*ParentalApp `protobuf:"bytes,5,rep,name=applist_custom" json:"applist_custom,omitempty"`
|
||||
Passwordhashtype *uint32 `protobuf:"varint,6,opt,name=passwordhashtype" json:"passwordhashtype,omitempty"`
|
||||
Salt []byte `protobuf:"bytes,7,opt,name=salt" json:"salt,omitempty"`
|
||||
Passwordhash []byte `protobuf:"bytes,8,opt,name=passwordhash" json:"passwordhash,omitempty"`
|
||||
IsEnabled *bool `protobuf:"varint,9,opt,name=is_enabled" json:"is_enabled,omitempty"`
|
||||
EnabledFeatures *uint32 `protobuf:"varint,10,opt,name=enabled_features" json:"enabled_features,omitempty"`
|
||||
RecoveryEmail *string `protobuf:"bytes,11,opt,name=recovery_email" json:"recovery_email,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ParentalSettings) Reset() { *m = ParentalSettings{} }
|
||||
func (m *ParentalSettings) String() string { return proto.CompactTextString(m) }
|
||||
func (*ParentalSettings) ProtoMessage() {}
|
||||
func (*ParentalSettings) Descriptor() ([]byte, []int) { return parental_fileDescriptor0, []int{1} }
|
||||
|
||||
func (m *ParentalSettings) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ParentalSettings) GetApplistBaseId() uint32 {
|
||||
if m != nil && m.ApplistBaseId != nil {
|
||||
return *m.ApplistBaseId
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ParentalSettings) GetApplistBaseDescription() string {
|
||||
if m != nil && m.ApplistBaseDescription != nil {
|
||||
return *m.ApplistBaseDescription
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *ParentalSettings) GetApplistBase() []*ParentalApp {
|
||||
if m != nil {
|
||||
return m.ApplistBase
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ParentalSettings) GetApplistCustom() []*ParentalApp {
|
||||
if m != nil {
|
||||
return m.ApplistCustom
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ParentalSettings) GetPasswordhashtype() uint32 {
|
||||
if m != nil && m.Passwordhashtype != nil {
|
||||
return *m.Passwordhashtype
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ParentalSettings) GetSalt() []byte {
|
||||
if m != nil {
|
||||
return m.Salt
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ParentalSettings) GetPasswordhash() []byte {
|
||||
if m != nil {
|
||||
return m.Passwordhash
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *ParentalSettings) GetIsEnabled() bool {
|
||||
if m != nil && m.IsEnabled != nil {
|
||||
return *m.IsEnabled
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *ParentalSettings) GetEnabledFeatures() uint32 {
|
||||
if m != nil && m.EnabledFeatures != nil {
|
||||
return *m.EnabledFeatures
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *ParentalSettings) GetRecoveryEmail() string {
|
||||
if m != nil && m.RecoveryEmail != nil {
|
||||
return *m.RecoveryEmail
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CParental_EnableParentalSettings_Request struct {
|
||||
Password *string `protobuf:"bytes,1,opt,name=password" json:"password,omitempty"`
|
||||
Settings *ParentalSettings `protobuf:"bytes,2,opt,name=settings" json:"settings,omitempty"`
|
||||
Sessionid *string `protobuf:"bytes,3,opt,name=sessionid" json:"sessionid,omitempty"`
|
||||
Enablecode *uint32 `protobuf:"varint,4,opt,name=enablecode" json:"enablecode,omitempty"`
|
||||
Steamid *uint64 `protobuf:"fixed64,10,opt,name=steamid" json:"steamid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_EnableParentalSettings_Request) Reset() {
|
||||
*m = CParental_EnableParentalSettings_Request{}
|
||||
}
|
||||
func (m *CParental_EnableParentalSettings_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_EnableParentalSettings_Request) ProtoMessage() {}
|
||||
func (*CParental_EnableParentalSettings_Request) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{2}
|
||||
}
|
||||
|
||||
func (m *CParental_EnableParentalSettings_Request) GetPassword() string {
|
||||
if m != nil && m.Password != nil {
|
||||
return *m.Password
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CParental_EnableParentalSettings_Request) GetSettings() *ParentalSettings {
|
||||
if m != nil {
|
||||
return m.Settings
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CParental_EnableParentalSettings_Request) GetSessionid() string {
|
||||
if m != nil && m.Sessionid != nil {
|
||||
return *m.Sessionid
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CParental_EnableParentalSettings_Request) GetEnablecode() uint32 {
|
||||
if m != nil && m.Enablecode != nil {
|
||||
return *m.Enablecode
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CParental_EnableParentalSettings_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CParental_EnableParentalSettings_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_EnableParentalSettings_Response) Reset() {
|
||||
*m = CParental_EnableParentalSettings_Response{}
|
||||
}
|
||||
func (m *CParental_EnableParentalSettings_Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_EnableParentalSettings_Response) ProtoMessage() {}
|
||||
func (*CParental_EnableParentalSettings_Response) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{3}
|
||||
}
|
||||
|
||||
type CParental_DisableParentalSettings_Request struct {
|
||||
Password *string `protobuf:"bytes,1,opt,name=password" json:"password,omitempty"`
|
||||
Steamid *uint64 `protobuf:"fixed64,10,opt,name=steamid" json:"steamid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_DisableParentalSettings_Request) Reset() {
|
||||
*m = CParental_DisableParentalSettings_Request{}
|
||||
}
|
||||
func (m *CParental_DisableParentalSettings_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_DisableParentalSettings_Request) ProtoMessage() {}
|
||||
func (*CParental_DisableParentalSettings_Request) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{4}
|
||||
}
|
||||
|
||||
func (m *CParental_DisableParentalSettings_Request) GetPassword() string {
|
||||
if m != nil && m.Password != nil {
|
||||
return *m.Password
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CParental_DisableParentalSettings_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CParental_DisableParentalSettings_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_DisableParentalSettings_Response) Reset() {
|
||||
*m = CParental_DisableParentalSettings_Response{}
|
||||
}
|
||||
func (m *CParental_DisableParentalSettings_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CParental_DisableParentalSettings_Response) ProtoMessage() {}
|
||||
func (*CParental_DisableParentalSettings_Response) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{5}
|
||||
}
|
||||
|
||||
type CParental_GetParentalSettings_Request struct {
|
||||
Steamid *uint64 `protobuf:"fixed64,10,opt,name=steamid" json:"steamid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_GetParentalSettings_Request) Reset() { *m = CParental_GetParentalSettings_Request{} }
|
||||
func (m *CParental_GetParentalSettings_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_GetParentalSettings_Request) ProtoMessage() {}
|
||||
func (*CParental_GetParentalSettings_Request) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{6}
|
||||
}
|
||||
|
||||
func (m *CParental_GetParentalSettings_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CParental_GetParentalSettings_Response struct {
|
||||
Settings *ParentalSettings `protobuf:"bytes,1,opt,name=settings" json:"settings,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_GetParentalSettings_Response) Reset() {
|
||||
*m = CParental_GetParentalSettings_Response{}
|
||||
}
|
||||
func (m *CParental_GetParentalSettings_Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_GetParentalSettings_Response) ProtoMessage() {}
|
||||
func (*CParental_GetParentalSettings_Response) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{7}
|
||||
}
|
||||
|
||||
func (m *CParental_GetParentalSettings_Response) GetSettings() *ParentalSettings {
|
||||
if m != nil {
|
||||
return m.Settings
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CParental_GetSignedParentalSettings_Request struct {
|
||||
Priority *uint32 `protobuf:"varint,1,opt,name=priority" json:"priority,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_GetSignedParentalSettings_Request) Reset() {
|
||||
*m = CParental_GetSignedParentalSettings_Request{}
|
||||
}
|
||||
func (m *CParental_GetSignedParentalSettings_Request) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CParental_GetSignedParentalSettings_Request) ProtoMessage() {}
|
||||
func (*CParental_GetSignedParentalSettings_Request) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{8}
|
||||
}
|
||||
|
||||
func (m *CParental_GetSignedParentalSettings_Request) GetPriority() uint32 {
|
||||
if m != nil && m.Priority != nil {
|
||||
return *m.Priority
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CParental_GetSignedParentalSettings_Response struct {
|
||||
SerializedSettings []byte `protobuf:"bytes,1,opt,name=serialized_settings" json:"serialized_settings,omitempty"`
|
||||
Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_GetSignedParentalSettings_Response) Reset() {
|
||||
*m = CParental_GetSignedParentalSettings_Response{}
|
||||
}
|
||||
func (m *CParental_GetSignedParentalSettings_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CParental_GetSignedParentalSettings_Response) ProtoMessage() {}
|
||||
func (*CParental_GetSignedParentalSettings_Response) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{9}
|
||||
}
|
||||
|
||||
func (m *CParental_GetSignedParentalSettings_Response) GetSerializedSettings() []byte {
|
||||
if m != nil {
|
||||
return m.SerializedSettings
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CParental_GetSignedParentalSettings_Response) GetSignature() []byte {
|
||||
if m != nil {
|
||||
return m.Signature
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CParental_SetParentalSettings_Request struct {
|
||||
Password *string `protobuf:"bytes,1,opt,name=password" json:"password,omitempty"`
|
||||
Settings *ParentalSettings `protobuf:"bytes,2,opt,name=settings" json:"settings,omitempty"`
|
||||
NewPassword *string `protobuf:"bytes,3,opt,name=new_password" json:"new_password,omitempty"`
|
||||
Sessionid *string `protobuf:"bytes,4,opt,name=sessionid" json:"sessionid,omitempty"`
|
||||
Steamid *uint64 `protobuf:"fixed64,10,opt,name=steamid" json:"steamid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_SetParentalSettings_Request) Reset() { *m = CParental_SetParentalSettings_Request{} }
|
||||
func (m *CParental_SetParentalSettings_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_SetParentalSettings_Request) ProtoMessage() {}
|
||||
func (*CParental_SetParentalSettings_Request) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{10}
|
||||
}
|
||||
|
||||
func (m *CParental_SetParentalSettings_Request) GetPassword() string {
|
||||
if m != nil && m.Password != nil {
|
||||
return *m.Password
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CParental_SetParentalSettings_Request) GetSettings() *ParentalSettings {
|
||||
if m != nil {
|
||||
return m.Settings
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CParental_SetParentalSettings_Request) GetNewPassword() string {
|
||||
if m != nil && m.NewPassword != nil {
|
||||
return *m.NewPassword
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CParental_SetParentalSettings_Request) GetSessionid() string {
|
||||
if m != nil && m.Sessionid != nil {
|
||||
return *m.Sessionid
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CParental_SetParentalSettings_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CParental_SetParentalSettings_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_SetParentalSettings_Response) Reset() {
|
||||
*m = CParental_SetParentalSettings_Response{}
|
||||
}
|
||||
func (m *CParental_SetParentalSettings_Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_SetParentalSettings_Response) ProtoMessage() {}
|
||||
func (*CParental_SetParentalSettings_Response) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{11}
|
||||
}
|
||||
|
||||
type CParental_ValidateToken_Request struct {
|
||||
UnlockToken *string `protobuf:"bytes,1,opt,name=unlock_token" json:"unlock_token,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_ValidateToken_Request) Reset() { *m = CParental_ValidateToken_Request{} }
|
||||
func (m *CParental_ValidateToken_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_ValidateToken_Request) ProtoMessage() {}
|
||||
func (*CParental_ValidateToken_Request) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{12}
|
||||
}
|
||||
|
||||
func (m *CParental_ValidateToken_Request) GetUnlockToken() string {
|
||||
if m != nil && m.UnlockToken != nil {
|
||||
return *m.UnlockToken
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CParental_ValidateToken_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_ValidateToken_Response) Reset() { *m = CParental_ValidateToken_Response{} }
|
||||
func (m *CParental_ValidateToken_Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_ValidateToken_Response) ProtoMessage() {}
|
||||
func (*CParental_ValidateToken_Response) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{13}
|
||||
}
|
||||
|
||||
type CParental_ValidatePassword_Request struct {
|
||||
Password *string `protobuf:"bytes,1,opt,name=password" json:"password,omitempty"`
|
||||
Session *string `protobuf:"bytes,2,opt,name=session" json:"session,omitempty"`
|
||||
SendUnlockOnSuccess *bool `protobuf:"varint,3,opt,name=send_unlock_on_success" json:"send_unlock_on_success,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_ValidatePassword_Request) Reset() { *m = CParental_ValidatePassword_Request{} }
|
||||
func (m *CParental_ValidatePassword_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_ValidatePassword_Request) ProtoMessage() {}
|
||||
func (*CParental_ValidatePassword_Request) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{14}
|
||||
}
|
||||
|
||||
func (m *CParental_ValidatePassword_Request) GetPassword() string {
|
||||
if m != nil && m.Password != nil {
|
||||
return *m.Password
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CParental_ValidatePassword_Request) GetSession() string {
|
||||
if m != nil && m.Session != nil {
|
||||
return *m.Session
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CParental_ValidatePassword_Request) GetSendUnlockOnSuccess() bool {
|
||||
if m != nil && m.SendUnlockOnSuccess != nil {
|
||||
return *m.SendUnlockOnSuccess
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type CParental_ValidatePassword_Response struct {
|
||||
Token *string `protobuf:"bytes,1,opt,name=token" json:"token,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_ValidatePassword_Response) Reset() { *m = CParental_ValidatePassword_Response{} }
|
||||
func (m *CParental_ValidatePassword_Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_ValidatePassword_Response) ProtoMessage() {}
|
||||
func (*CParental_ValidatePassword_Response) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{15}
|
||||
}
|
||||
|
||||
func (m *CParental_ValidatePassword_Response) GetToken() string {
|
||||
if m != nil && m.Token != nil {
|
||||
return *m.Token
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CParental_LockClient_Request struct {
|
||||
Session *string `protobuf:"bytes,1,opt,name=session" json:"session,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_LockClient_Request) Reset() { *m = CParental_LockClient_Request{} }
|
||||
func (m *CParental_LockClient_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_LockClient_Request) ProtoMessage() {}
|
||||
func (*CParental_LockClient_Request) Descriptor() ([]byte, []int) { return parental_fileDescriptor0, []int{16} }
|
||||
|
||||
func (m *CParental_LockClient_Request) GetSession() string {
|
||||
if m != nil && m.Session != nil {
|
||||
return *m.Session
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CParental_LockClient_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_LockClient_Response) Reset() { *m = CParental_LockClient_Response{} }
|
||||
func (m *CParental_LockClient_Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_LockClient_Response) ProtoMessage() {}
|
||||
func (*CParental_LockClient_Response) Descriptor() ([]byte, []int) { return parental_fileDescriptor0, []int{17} }
|
||||
|
||||
type CParental_RequestRecoveryCode_Request struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_RequestRecoveryCode_Request) Reset() { *m = CParental_RequestRecoveryCode_Request{} }
|
||||
func (m *CParental_RequestRecoveryCode_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_RequestRecoveryCode_Request) ProtoMessage() {}
|
||||
func (*CParental_RequestRecoveryCode_Request) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{18}
|
||||
}
|
||||
|
||||
type CParental_RequestRecoveryCode_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_RequestRecoveryCode_Response) Reset() {
|
||||
*m = CParental_RequestRecoveryCode_Response{}
|
||||
}
|
||||
func (m *CParental_RequestRecoveryCode_Response) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_RequestRecoveryCode_Response) ProtoMessage() {}
|
||||
func (*CParental_RequestRecoveryCode_Response) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{19}
|
||||
}
|
||||
|
||||
type CParental_DisableWithRecoveryCode_Request struct {
|
||||
RecoveryCode *uint32 `protobuf:"varint,1,opt,name=recovery_code" json:"recovery_code,omitempty"`
|
||||
Steamid *uint64 `protobuf:"fixed64,10,opt,name=steamid" json:"steamid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_DisableWithRecoveryCode_Request) Reset() {
|
||||
*m = CParental_DisableWithRecoveryCode_Request{}
|
||||
}
|
||||
func (m *CParental_DisableWithRecoveryCode_Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_DisableWithRecoveryCode_Request) ProtoMessage() {}
|
||||
func (*CParental_DisableWithRecoveryCode_Request) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{20}
|
||||
}
|
||||
|
||||
func (m *CParental_DisableWithRecoveryCode_Request) GetRecoveryCode() uint32 {
|
||||
if m != nil && m.RecoveryCode != nil {
|
||||
return *m.RecoveryCode
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *CParental_DisableWithRecoveryCode_Request) GetSteamid() uint64 {
|
||||
if m != nil && m.Steamid != nil {
|
||||
return *m.Steamid
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type CParental_DisableWithRecoveryCode_Response struct {
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_DisableWithRecoveryCode_Response) Reset() {
|
||||
*m = CParental_DisableWithRecoveryCode_Response{}
|
||||
}
|
||||
func (m *CParental_DisableWithRecoveryCode_Response) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CParental_DisableWithRecoveryCode_Response) ProtoMessage() {}
|
||||
func (*CParental_DisableWithRecoveryCode_Response) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{21}
|
||||
}
|
||||
|
||||
type CParental_ParentalSettingsChange_Notification struct {
|
||||
SerializedSettings []byte `protobuf:"bytes,1,opt,name=serialized_settings" json:"serialized_settings,omitempty"`
|
||||
Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"`
|
||||
Password *string `protobuf:"bytes,3,opt,name=password" json:"password,omitempty"`
|
||||
Sessionid *string `protobuf:"bytes,4,opt,name=sessionid" json:"sessionid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_ParentalSettingsChange_Notification) Reset() {
|
||||
*m = CParental_ParentalSettingsChange_Notification{}
|
||||
}
|
||||
func (m *CParental_ParentalSettingsChange_Notification) String() string {
|
||||
return proto.CompactTextString(m)
|
||||
}
|
||||
func (*CParental_ParentalSettingsChange_Notification) ProtoMessage() {}
|
||||
func (*CParental_ParentalSettingsChange_Notification) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{22}
|
||||
}
|
||||
|
||||
func (m *CParental_ParentalSettingsChange_Notification) GetSerializedSettings() []byte {
|
||||
if m != nil {
|
||||
return m.SerializedSettings
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CParental_ParentalSettingsChange_Notification) GetSignature() []byte {
|
||||
if m != nil {
|
||||
return m.Signature
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *CParental_ParentalSettingsChange_Notification) GetPassword() string {
|
||||
if m != nil && m.Password != nil {
|
||||
return *m.Password
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CParental_ParentalSettingsChange_Notification) GetSessionid() string {
|
||||
if m != nil && m.Sessionid != nil {
|
||||
return *m.Sessionid
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CParental_ParentalUnlock_Notification struct {
|
||||
Password *string `protobuf:"bytes,1,opt,name=password" json:"password,omitempty"`
|
||||
Sessionid *string `protobuf:"bytes,2,opt,name=sessionid" json:"sessionid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_ParentalUnlock_Notification) Reset() { *m = CParental_ParentalUnlock_Notification{} }
|
||||
func (m *CParental_ParentalUnlock_Notification) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_ParentalUnlock_Notification) ProtoMessage() {}
|
||||
func (*CParental_ParentalUnlock_Notification) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{23}
|
||||
}
|
||||
|
||||
func (m *CParental_ParentalUnlock_Notification) GetPassword() string {
|
||||
if m != nil && m.Password != nil {
|
||||
return *m.Password
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *CParental_ParentalUnlock_Notification) GetSessionid() string {
|
||||
if m != nil && m.Sessionid != nil {
|
||||
return *m.Sessionid
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CParental_ParentalLock_Notification struct {
|
||||
Sessionid *string `protobuf:"bytes,1,opt,name=sessionid" json:"sessionid,omitempty"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
}
|
||||
|
||||
func (m *CParental_ParentalLock_Notification) Reset() { *m = CParental_ParentalLock_Notification{} }
|
||||
func (m *CParental_ParentalLock_Notification) String() string { return proto.CompactTextString(m) }
|
||||
func (*CParental_ParentalLock_Notification) ProtoMessage() {}
|
||||
func (*CParental_ParentalLock_Notification) Descriptor() ([]byte, []int) {
|
||||
return parental_fileDescriptor0, []int{24}
|
||||
}
|
||||
|
||||
func (m *CParental_ParentalLock_Notification) GetSessionid() string {
|
||||
if m != nil && m.Sessionid != nil {
|
||||
return *m.Sessionid
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*ParentalApp)(nil), "ParentalApp")
|
||||
proto.RegisterType((*ParentalSettings)(nil), "ParentalSettings")
|
||||
proto.RegisterType((*CParental_EnableParentalSettings_Request)(nil), "CParental_EnableParentalSettings_Request")
|
||||
proto.RegisterType((*CParental_EnableParentalSettings_Response)(nil), "CParental_EnableParentalSettings_Response")
|
||||
proto.RegisterType((*CParental_DisableParentalSettings_Request)(nil), "CParental_DisableParentalSettings_Request")
|
||||
proto.RegisterType((*CParental_DisableParentalSettings_Response)(nil), "CParental_DisableParentalSettings_Response")
|
||||
proto.RegisterType((*CParental_GetParentalSettings_Request)(nil), "CParental_GetParentalSettings_Request")
|
||||
proto.RegisterType((*CParental_GetParentalSettings_Response)(nil), "CParental_GetParentalSettings_Response")
|
||||
proto.RegisterType((*CParental_GetSignedParentalSettings_Request)(nil), "CParental_GetSignedParentalSettings_Request")
|
||||
proto.RegisterType((*CParental_GetSignedParentalSettings_Response)(nil), "CParental_GetSignedParentalSettings_Response")
|
||||
proto.RegisterType((*CParental_SetParentalSettings_Request)(nil), "CParental_SetParentalSettings_Request")
|
||||
proto.RegisterType((*CParental_SetParentalSettings_Response)(nil), "CParental_SetParentalSettings_Response")
|
||||
proto.RegisterType((*CParental_ValidateToken_Request)(nil), "CParental_ValidateToken_Request")
|
||||
proto.RegisterType((*CParental_ValidateToken_Response)(nil), "CParental_ValidateToken_Response")
|
||||
proto.RegisterType((*CParental_ValidatePassword_Request)(nil), "CParental_ValidatePassword_Request")
|
||||
proto.RegisterType((*CParental_ValidatePassword_Response)(nil), "CParental_ValidatePassword_Response")
|
||||
proto.RegisterType((*CParental_LockClient_Request)(nil), "CParental_LockClient_Request")
|
||||
proto.RegisterType((*CParental_LockClient_Response)(nil), "CParental_LockClient_Response")
|
||||
proto.RegisterType((*CParental_RequestRecoveryCode_Request)(nil), "CParental_RequestRecoveryCode_Request")
|
||||
proto.RegisterType((*CParental_RequestRecoveryCode_Response)(nil), "CParental_RequestRecoveryCode_Response")
|
||||
proto.RegisterType((*CParental_DisableWithRecoveryCode_Request)(nil), "CParental_DisableWithRecoveryCode_Request")
|
||||
proto.RegisterType((*CParental_DisableWithRecoveryCode_Response)(nil), "CParental_DisableWithRecoveryCode_Response")
|
||||
proto.RegisterType((*CParental_ParentalSettingsChange_Notification)(nil), "CParental_ParentalSettingsChange_Notification")
|
||||
proto.RegisterType((*CParental_ParentalUnlock_Notification)(nil), "CParental_ParentalUnlock_Notification")
|
||||
proto.RegisterType((*CParental_ParentalLock_Notification)(nil), "CParental_ParentalLock_Notification")
|
||||
}
|
||||
|
||||
var parental_fileDescriptor0 = []byte{
|
||||
// 1337 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x57, 0x41, 0x8f, 0x14, 0xc5,
|
||||
0x17, 0x4f, 0xc3, 0x02, 0xbb, 0xb5, 0xb3, 0xcb, 0x52, 0xf0, 0x87, 0x66, 0xfe, 0x02, 0x65, 0x2f,
|
||||
0xc2, 0x02, 0x4b, 0x6b, 0x56, 0x23, 0x26, 0x26, 0x12, 0x58, 0x0d, 0x26, 0x2e, 0x88, 0x0c, 0x8a,
|
||||
0x09, 0x89, 0x9d, 0xda, 0xee, 0xda, 0xd9, 0x92, 0x9e, 0xaa, 0xb6, 0xab, 0x86, 0x75, 0x3d, 0x19,
|
||||
0x63, 0xbc, 0x19, 0x2f, 0x1e, 0x34, 0xf1, 0x6e, 0xa2, 0x5e, 0x89, 0x57, 0x13, 0xbf, 0x80, 0xf1,
|
||||
0x53, 0xf8, 0x31, 0x7c, 0x5d, 0xd5, 0x3d, 0xd3, 0xbd, 0xd3, 0x33, 0xd3, 0x23, 0xb7, 0x99, 0xaa,
|
||||
0xf7, 0x5e, 0xfd, 0xde, 0x7b, 0xbf, 0x7a, 0xbf, 0x6a, 0xb4, 0xa6, 0x34, 0xa3, 0xbd, 0x1e, 0x53,
|
||||
0x8a, 0x76, 0x99, 0x0a, 0x12, 0x9a, 0x32, 0xa1, 0x69, 0xec, 0x9b, 0xe5, 0x30, 0xe6, 0xf0, 0xcf,
|
||||
0x4f, 0x52, 0xa9, 0x65, 0x7b, 0xbd, 0x6a, 0xd9, 0x17, 0x7c, 0x87, 0xb3, 0x28, 0xd8, 0xa6, 0x8a,
|
||||
0x8d, 0x5a, 0x7b, 0xaf, 0xa0, 0xc5, 0xfb, 0x79, 0xac, 0x5b, 0x49, 0x82, 0x97, 0xd0, 0x11, 0x9a,
|
||||
0x24, 0x3c, 0x72, 0x1d, 0xe2, 0xac, 0x2d, 0x61, 0x8c, 0x10, 0x57, 0x01, 0x8d, 0x63, 0xb9, 0xc7,
|
||||
0x22, 0xf7, 0x10, 0xac, 0xcd, 0x7b, 0xbf, 0x1d, 0x42, 0x2b, 0x85, 0x4b, 0x87, 0x69, 0xcd, 0x45,
|
||||
0x57, 0xe1, 0xe3, 0xe8, 0x98, 0x89, 0x9d, 0x7b, 0x1e, 0xc5, 0x67, 0xd0, 0x71, 0x08, 0x14, 0x73,
|
||||
0xa5, 0xcd, 0xc9, 0x01, 0xb7, 0xee, 0x4b, 0x98, 0x20, 0xb7, 0xb2, 0x11, 0x31, 0x15, 0xa6, 0x3c,
|
||||
0xd1, 0x5c, 0x0a, 0xf7, 0x30, 0x58, 0x2c, 0x60, 0x0f, 0xb5, 0xca, 0x16, 0xee, 0x1c, 0x39, 0xbc,
|
||||
0xb6, 0xb8, 0xd1, 0xf2, 0xcb, 0x38, 0x2f, 0xa2, 0xe5, 0xc2, 0x26, 0xec, 0x2b, 0x2d, 0x7b, 0xee,
|
||||
0x91, 0x1a, 0x2b, 0x17, 0xad, 0x24, 0x54, 0xa9, 0x3d, 0x99, 0x46, 0xbb, 0x54, 0xed, 0xea, 0xfd,
|
||||
0x84, 0xb9, 0x47, 0x0d, 0x8a, 0x16, 0x9a, 0x53, 0x34, 0xd6, 0xee, 0x31, 0xf8, 0xd7, 0xc2, 0xa7,
|
||||
0x50, 0xab, 0x6c, 0xe7, 0xce, 0x9b, 0x55, 0x9b, 0x3c, 0x13, 0x74, 0x3b, 0x86, 0xe4, 0x17, 0xb2,
|
||||
0xe4, 0xb3, 0x88, 0xf9, 0x42, 0xb0, 0xc3, 0xa8, 0xee, 0xa7, 0x4c, 0xb9, 0xc8, 0x44, 0x3c, 0x8d,
|
||||
0x96, 0x53, 0x16, 0xca, 0xa7, 0x2c, 0xdd, 0x0f, 0x58, 0x8f, 0xf2, 0xd8, 0x5d, 0xcc, 0xb2, 0xf1,
|
||||
0x7e, 0x74, 0xd0, 0xda, 0x66, 0x01, 0x2a, 0x78, 0xc7, 0x38, 0x1f, 0x2c, 0x5f, 0xf0, 0x80, 0x7d,
|
||||
0xd6, 0x67, 0x4a, 0xe3, 0x15, 0x34, 0x5f, 0x00, 0x31, 0x75, 0x5c, 0xc0, 0xab, 0x68, 0x5e, 0xe5,
|
||||
0x56, 0xa6, 0x80, 0x8b, 0x1b, 0x27, 0xfc, 0x91, 0xea, 0x9f, 0x40, 0x0b, 0x0a, 0xfa, 0x0d, 0x25,
|
||||
0x84, 0x32, 0xdb, 0x22, 0x02, 0x78, 0x0b, 0x34, 0x94, 0x51, 0x56, 0xc2, 0x0c, 0x62, 0xa9, 0x49,
|
||||
0x19, 0xe6, 0xa3, 0xde, 0x35, 0x74, 0xa5, 0x01, 0x34, 0x95, 0x48, 0xa1, 0x98, 0x77, 0xaf, 0x6c,
|
||||
0xfc, 0x36, 0x57, 0x33, 0x26, 0x32, 0x72, 0xf8, 0x3a, 0xba, 0xda, 0x24, 0x5e, 0x7e, 0xfa, 0x1b,
|
||||
0xe8, 0xa5, 0xa1, 0xf5, 0x1d, 0xa6, 0xc7, 0x9e, 0x3c, 0x72, 0xce, 0x5d, 0x74, 0x69, 0x9a, 0xa7,
|
||||
0x3d, 0xa3, 0x52, 0x6b, 0x67, 0x4c, 0xad, 0xbd, 0x9b, 0xe8, 0x5a, 0x25, 0x5c, 0x87, 0x77, 0x05,
|
||||
0x8b, 0x26, 0x16, 0x22, 0xe5, 0x32, 0xe5, 0x7a, 0xdf, 0xde, 0x29, 0xef, 0x13, 0xb4, 0xde, 0x2c,
|
||||
0x40, 0x8e, 0xea, 0xff, 0xe8, 0xa4, 0x62, 0x29, 0xa7, 0x31, 0xff, 0x02, 0x58, 0x57, 0x01, 0xd8,
|
||||
0x32, 0x9d, 0x07, 0x7f, 0xc3, 0x44, 0xc3, 0x8f, 0x96, 0xf7, 0x83, 0x53, 0x2e, 0x55, 0x67, 0x42,
|
||||
0xa9, 0xfe, 0x23, 0xdb, 0xe0, 0xb6, 0x08, 0xb6, 0x17, 0x0c, 0x5c, 0x2d, 0xe1, 0x2a, 0x1c, 0x9c,
|
||||
0xab, 0x6f, 0xf9, 0x5a, 0xb9, 0x15, 0x9d, 0x09, 0xad, 0xf0, 0x6e, 0xa0, 0x0b, 0x43, 0xcb, 0x8f,
|
||||
0x20, 0xf7, 0x88, 0x6a, 0xf6, 0x50, 0x3e, 0x61, 0x62, 0x80, 0x1e, 0x60, 0xf4, 0x45, 0x2c, 0xc3,
|
||||
0x27, 0x81, 0xce, 0xd6, 0x6d, 0x06, 0x9e, 0x87, 0xc8, 0x78, 0xc7, 0x3c, 0x78, 0x17, 0x79, 0xa3,
|
||||
0x36, 0xf7, 0xf3, 0x74, 0xa6, 0x50, 0xd8, 0xa6, 0x68, 0x8a, 0xb3, 0x80, 0xcf, 0xa3, 0xd3, 0x8a,
|
||||
0x89, 0x28, 0xc8, 0x71, 0x48, 0x11, 0xa8, 0x7e, 0x18, 0x82, 0x89, 0xa9, 0xc9, 0xbc, 0xf7, 0x1a,
|
||||
0x5a, 0x9d, 0x78, 0x50, 0xde, 0x61, 0x18, 0xba, 0xe5, 0x14, 0x5e, 0x46, 0x2f, 0x0c, 0xbd, 0xb6,
|
||||
0x20, 0xf0, 0xa6, 0x19, 0xd8, 0x15, 0x86, 0xe7, 0x30, 0xac, 0xc3, 0x05, 0x74, 0x6e, 0x8c, 0x43,
|
||||
0x9e, 0xf0, 0xe5, 0x32, 0x23, 0xf2, 0x30, 0x0f, 0xf2, 0x61, 0xb5, 0x09, 0xf3, 0xa1, 0x58, 0xab,
|
||||
0x36, 0xa8, 0xde, 0x30, 0x0f, 0xd9, 0xa9, 0x99, 0x06, 0x8f, 0xb8, 0xde, 0xad, 0x0b, 0x8b, 0xff,
|
||||
0x87, 0x96, 0x06, 0xb3, 0xd1, 0xcc, 0x23, 0xa7, 0x7e, 0x1e, 0xd5, 0x8d, 0x84, 0x9a, 0xa0, 0x39,
|
||||
0x84, 0xaf, 0x1d, 0x74, 0x7d, 0x68, 0x7e, 0x90, 0x4b, 0x9b, 0xbb, 0x54, 0x74, 0x59, 0x70, 0x4f,
|
||||
0x6a, 0xd0, 0xbf, 0x90, 0x66, 0xfa, 0x32, 0xeb, 0x55, 0xaa, 0x50, 0x60, 0x1c, 0xcb, 0xbd, 0xad,
|
||||
0x72, 0x71, 0x8b, 0x1f, 0x1f, 0x5a, 0x46, 0x54, 0x4e, 0x1f, 0x25, 0x54, 0x25, 0x9a, 0xa1, 0x14,
|
||||
0xcc, 0xb9, 0xd5, 0xd1, 0x68, 0x5b, 0x23, 0xb1, 0x2a, 0x9e, 0x26, 0xd8, 0xc6, 0xdf, 0xcb, 0x68,
|
||||
0xbe, 0x70, 0xc0, 0x7f, 0x39, 0xe8, 0x74, 0xfd, 0x40, 0xc7, 0x57, 0xfc, 0xa6, 0x72, 0xd4, 0xbe,
|
||||
0xea, 0x37, 0x97, 0x87, 0xe0, 0xab, 0x67, 0xee, 0x63, 0x6b, 0x44, 0x8a, 0xd7, 0x09, 0x29, 0x4a,
|
||||
0x4c, 0x76, 0x64, 0x4a, 0xf4, 0x2e, 0x23, 0xb1, 0xec, 0x76, 0x59, 0x44, 0xb8, 0x20, 0x34, 0x0c,
|
||||
0x65, 0x5f, 0xe8, 0x75, 0x22, 0x8d, 0xf6, 0xc3, 0x1b, 0x63, 0xbf, 0x30, 0x37, 0x96, 0x61, 0x3f,
|
||||
0xcd, 0x82, 0x0c, 0x42, 0xe0, 0x5f, 0x1d, 0x74, 0x66, 0x8c, 0x4c, 0xe0, 0x32, 0xd0, 0x29, 0xd2,
|
||||
0xd4, 0xbe, 0xe6, 0xcf, 0x20, 0x3b, 0x37, 0x20, 0xab, 0x57, 0x73, 0xab, 0x59, 0xd2, 0xc2, 0x3f,
|
||||
0x3b, 0xe8, 0x64, 0x8d, 0xd8, 0xe0, 0x4b, 0x7e, 0x23, 0x19, 0x6b, 0x5f, 0xf6, 0x9b, 0x89, 0x96,
|
||||
0x77, 0x13, 0x10, 0xbe, 0x09, 0x16, 0x95, 0xa2, 0xcd, 0x82, 0xf4, 0x1f, 0x07, 0x9d, 0x1d, 0x2b,
|
||||
0x43, 0x78, 0xdd, 0x9f, 0x41, 0xed, 0xda, 0xd7, 0xfd, 0x59, 0xa4, 0xcd, 0x13, 0x80, 0xfd, 0xd3,
|
||||
0xe7, 0xc0, 0x6e, 0x7e, 0x66, 0xdb, 0x3d, 0xd8, 0xa7, 0x9a, 0x84, 0x54, 0x90, 0xed, 0x7d, 0x02,
|
||||
0xa3, 0xc2, 0xbc, 0x79, 0xb3, 0xdf, 0x99, 0x1f, 0xcc, 0x1e, 0xc6, 0x61, 0xd1, 0x34, 0xa5, 0x33,
|
||||
0xa5, 0x29, 0x9d, 0x86, 0x4d, 0xe9, 0x4c, 0x6d, 0x4a, 0xe7, 0x39, 0x9a, 0x02, 0x48, 0x97, 0x2a,
|
||||
0xea, 0x85, 0x89, 0x3f, 0x45, 0x10, 0xdb, 0x2f, 0xfa, 0x53, 0x95, 0xef, 0x03, 0xc0, 0x75, 0x77,
|
||||
0x73, 0x97, 0x85, 0x4f, 0x08, 0xdf, 0x31, 0x47, 0x77, 0xa1, 0x30, 0x62, 0x08, 0xcd, 0x2a, 0x19,
|
||||
0x31, 0x72, 0x44, 0xb8, 0x22, 0xa1, 0x04, 0xec, 0xa1, 0x9e, 0x80, 0xf4, 0x77, 0x07, 0xad, 0x1c,
|
||||
0x94, 0x36, 0xbc, 0xea, 0x4f, 0x17, 0xd8, 0xf6, 0x45, 0xbf, 0x81, 0x38, 0x7a, 0x1f, 0x03, 0xe4,
|
||||
0x87, 0xc5, 0xb6, 0xc1, 0x90, 0xc4, 0x94, 0x0b, 0xcd, 0x3e, 0xcf, 0x2a, 0x6a, 0xad, 0x27, 0x30,
|
||||
0x84, 0x8a, 0x08, 0xfa, 0x0f, 0x33, 0x1d, 0x96, 0x44, 0x25, 0x3d, 0xfc, 0x9d, 0x83, 0xd0, 0x50,
|
||||
0x2d, 0xf1, 0x39, 0x7f, 0x92, 0xea, 0xb6, 0xcf, 0xfb, 0x93, 0x35, 0xf6, 0x36, 0xe0, 0x7c, 0xcb,
|
||||
0xcc, 0xe8, 0x7d, 0xa8, 0x9a, 0x10, 0x50, 0x35, 0x40, 0x62, 0xbf, 0xb5, 0x94, 0xa5, 0x27, 0x25,
|
||||
0xe6, 0x74, 0xf8, 0xc4, 0x20, 0x32, 0x34, 0xac, 0xb0, 0x50, 0xc9, 0x76, 0x2a, 0xf7, 0x40, 0x98,
|
||||
0xf0, 0x9f, 0xc0, 0xcf, 0x1a, 0xd5, 0xad, 0xf0, 0x73, 0x82, 0x7c, 0x57, 0xf8, 0x39, 0x51, 0xbd,
|
||||
0x1f, 0x03, 0xd8, 0x47, 0xb9, 0x05, 0x9c, 0x5f, 0x88, 0x33, 0xc9, 0xc4, 0x99, 0x6c, 0x33, 0x60,
|
||||
0x28, 0x94, 0x4e, 0xcb, 0xe2, 0xf6, 0xd8, 0x4d, 0xf3, 0x55, 0x43, 0x68, 0x14, 0xc1, 0x47, 0xcf,
|
||||
0x90, 0xbb, 0x2a, 0x61, 0xa1, 0xbd, 0x6d, 0x05, 0x23, 0x7e, 0x19, 0x0e, 0xea, 0x83, 0xe2, 0x5d,
|
||||
0x37, 0xa8, 0xc7, 0xbd, 0x1a, 0xea, 0x06, 0xf5, 0xf8, 0xc7, 0xc0, 0xeb, 0x90, 0xd1, 0xc6, 0x2d,
|
||||
0xad, 0x59, 0x2f, 0xa9, 0x64, 0x94, 0x77, 0x5c, 0x8a, 0x7a, 0xb0, 0xed, 0x73, 0xe0, 0x77, 0xf6,
|
||||
0xfe, 0xc8, 0xcd, 0x84, 0x6e, 0x3c, 0xe5, 0x21, 0xdb, 0xf8, 0x66, 0x0e, 0x2d, 0x17, 0xbb, 0x39,
|
||||
0x4f, 0x7e, 0x72, 0xd0, 0x29, 0xdb, 0xe7, 0xea, 0x53, 0x03, 0xfb, 0xfe, 0x4c, 0xaf, 0x91, 0xf6,
|
||||
0xa2, 0x7f, 0x4f, 0x0e, 0xf0, 0xdf, 0x01, 0x1c, 0x9b, 0xe5, 0x6d, 0xb2, 0x93, 0xca, 0x9e, 0xc1,
|
||||
0xc1, 0xd2, 0xac, 0x15, 0x96, 0x49, 0x44, 0xee, 0x40, 0x76, 0xa1, 0x89, 0x96, 0x71, 0x67, 0x64,
|
||||
0xa6, 0xe0, 0xef, 0x1d, 0xd4, 0xb2, 0xf0, 0xec, 0x1b, 0xa4, 0x42, 0x9e, 0x09, 0xcf, 0x93, 0x2a,
|
||||
0x9c, 0xf7, 0x01, 0xce, 0x7b, 0x0d, 0xe0, 0x58, 0x5e, 0x0f, 0x2e, 0xd6, 0x78, 0x6a, 0x7f, 0x0b,
|
||||
0x97, 0xcd, 0xc2, 0xca, 0x2e, 0x0f, 0xbe, 0xe8, 0x37, 0x78, 0xe5, 0x54, 0x21, 0x6d, 0x01, 0xa4,
|
||||
0x77, 0x1b, 0x43, 0x9a, 0x72, 0xd5, 0xda, 0x3e, 0x44, 0xbb, 0x34, 0xda, 0xf7, 0x3c, 0x86, 0x28,
|
||||
0x1d, 0xa3, 0xfe, 0x78, 0xe6, 0x1e, 0xba, 0x7d, 0xf8, 0x4b, 0xc7, 0xf9, 0x37, 0x00, 0x00, 0xff,
|
||||
0xff, 0xc4, 0x79, 0x5c, 0x8e, 0x85, 0x11, 0x00, 0x00,
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user