Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bad1990173 | ||
|
|
0bc159341d | ||
|
|
45bf1fd63a | ||
|
|
ff0de85817 | ||
|
|
727fa9f929 | ||
|
|
0b9bc18236 | ||
|
|
bad3b83d33 | ||
|
|
00967a98ac | ||
|
|
1d708ab351 | ||
|
|
ba6759010b | ||
|
|
da3868c104 | ||
|
|
0abf4d5d5d | ||
|
|
9b320cd43f | ||
|
|
28783a4146 | ||
|
|
f92927eae5 | ||
|
|
294139ce7a | ||
|
|
45becd2573 | ||
|
|
a3bee01e0a | ||
|
|
1dc93ec4f0 | ||
|
|
3562d4220c | ||
|
|
1532f6e427 | ||
|
|
9327810bbf | ||
|
|
f66d5f1e58 | ||
|
|
cec086994e | ||
|
|
942d8f1ced | ||
|
|
1552dcb143 | ||
|
|
d525f1c9e4 | ||
|
|
921f2dfcdf | ||
|
|
79a006c8de | ||
|
|
ff27746c0c |
3
.fixmie.yml
Normal file
3
.fixmie.yml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
go:
|
||||||
|
comments:
|
||||||
|
disabled: true
|
||||||
@@ -21,14 +21,18 @@ builds:
|
|||||||
ldflags:
|
ldflags:
|
||||||
- -s -w -X main.githash={{.ShortCommit}}
|
- -s -w -X main.githash={{.ShortCommit}}
|
||||||
|
|
||||||
archive:
|
archives:
|
||||||
name_template: "{{ .Binary }}-{{ .Version }}-{{ .Os }}-{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}"
|
-
|
||||||
format: binary
|
id: matterbridge
|
||||||
files:
|
builds:
|
||||||
- none*
|
- matterbridge
|
||||||
replacements:
|
name_template: "{{ .Binary }}-{{ .Version }}-{{ .Os }}-{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}"
|
||||||
386: 32bit
|
format: binary
|
||||||
amd64: 64bit
|
files:
|
||||||
|
- none*
|
||||||
|
replacements:
|
||||||
|
386: 32bit
|
||||||
|
amd64: 64bit
|
||||||
|
|
||||||
checksum:
|
checksum:
|
||||||
name_template: 'checksums.txt'
|
name_template: 'checksums.txt'
|
||||||
|
|||||||
300
README.md
300
README.md
@@ -3,32 +3,35 @@
|
|||||||
# matterbridge
|
# matterbridge
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
**A simple chat bridge**<br />
|
**A simple chat bridge**<br />
|
||||||
Letting people be where they want to be.<br />
|
Letting people be where they want to be.<br />
|
||||||
<sub>Bridges between a growing number of protocols. Click below to demo or join the development chat.</sub>
|
<sub>Bridges between a growing number of protocols. Click below to demo or join the development chat.</sub>
|
||||||
|
|
||||||
<sup>
|
<sup>
|
||||||
|
|
||||||
[Gitter][mb-gitter] |
|
[Gitter][mb-gitter] |
|
||||||
[IRC][mb-irc] |
|
[IRC][mb-irc] |
|
||||||
[Discord][mb-discord] |
|
[Discord][mb-discord] |
|
||||||
[Matrix][mb-matrix] |
|
[Matrix][mb-matrix] |
|
||||||
[Slack][mb-slack] |
|
[Slack][mb-slack] |
|
||||||
[Mattermost][mb-mattermost] |
|
[Mattermost][mb-mattermost] |
|
||||||
[Rocket.Chat][mb-rocketchat] |
|
[Rocket.Chat][mb-rocketchat] |
|
||||||
[XMPP][mb-xmpp] |
|
[XMPP][mb-xmpp] |
|
||||||
[Twitch][mb-twitch] |
|
[Twitch][mb-twitch] |
|
||||||
[WhatsApp][mb-whatsapp] |
|
[WhatsApp][mb-whatsapp] |
|
||||||
[Zulip][mb-zulip] |
|
[Zulip][mb-zulip] |
|
||||||
[Telegram][mb-telegram] |
|
[Telegram][mb-telegram] |
|
||||||
And more...
|
[Keybase][mb-keybase] |
|
||||||
</sup>
|
And more...
|
||||||
|
</sup>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
----
|
|
||||||
[](https://github.com/42wim/matterbridge/releases/latest)
|
[](https://github.com/42wim/matterbridge/releases/latest)
|
||||||
[](https://bintray.com/42wim/nightly/Matterbridge/_latestVersion)
|
[](https://bintray.com/42wim/nightly/Matterbridge/_latestVersion)
|
||||||
[](https://codeclimate.com/github/42wim/matterbridge/maintainability)
|
[](https://codeclimate.com/github/42wim/matterbridge/maintainability)
|
||||||
[](https://codeclimate.com/github/42wim/matterbridge/test_coverage)<br />
|
[](https://codeclimate.com/github/42wim/matterbridge/test_coverage)<br />
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
</div>
|
</div>
|
||||||
<div align="right"><sup>
|
<div align="right"><sup>
|
||||||
@@ -42,108 +45,118 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
### Table of Contents
|
### Table of Contents
|
||||||
* [Features](https://github.com/42wim/matterbridge/wiki/Features)
|
|
||||||
* [Natively supported](#natively-supported)
|
- [Features](https://github.com/42wim/matterbridge/wiki/Features)
|
||||||
* [3rd party via matterbridge api](#3rd-party-via-matterbridge-api)
|
- [Natively supported](#natively-supported)
|
||||||
* [API](#API)
|
- [3rd party via matterbridge api](#3rd-party-via-matterbridge-api)
|
||||||
* [Chat with us](#chat-with-us)
|
- [API](#API)
|
||||||
* [Screenshots](https://github.com/42wim/matterbridge/wiki/)
|
- [Chat with us](#chat-with-us)
|
||||||
* [Installing/upgrading](#installing--upgrading)
|
- [Screenshots](https://github.com/42wim/matterbridge/wiki/)
|
||||||
* [Binaries](#binaries)
|
- [Installing/upgrading](#installing--upgrading)
|
||||||
* [Building](#building)
|
- [Binaries](#binaries)
|
||||||
* [Configuration](#configuration)
|
- [Building](#building)
|
||||||
* [Howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config)
|
- [Configuration](#configuration)
|
||||||
* [Settings](#settings)
|
- [Howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config)
|
||||||
* [Examples](#examples)
|
- [Settings](#settings)
|
||||||
* [Running](#running)
|
- [Examples](#examples)
|
||||||
* [Docker](#docker)
|
- [Running](#running)
|
||||||
* [Changelog](#changelog)
|
- [Docker](#docker)
|
||||||
* [FAQ](#faq)
|
- [Changelog](#changelog)
|
||||||
* [Related projects](#related-projects)
|
- [FAQ](#faq)
|
||||||
* [Articles](#articles)
|
- [Related projects](#related-projects)
|
||||||
* [Thanks](#thanks)
|
- [Articles](#articles)
|
||||||
|
- [Thanks](#thanks)
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
* [Support bridging between any protocols](https://github.com/42wim/matterbridge/wiki/Features#support-bridging-between-any-protocols)
|
|
||||||
* [Support multiple gateways(bridges) for your protocols](https://github.com/42wim/matterbridge/wiki/Features#support-multiple-gatewaysbridges-for-your-protocols)
|
- [Support bridging between any protocols](https://github.com/42wim/matterbridge/wiki/Features#support-bridging-between-any-protocols)
|
||||||
* [Message edits and deletes](https://github.com/42wim/matterbridge/wiki/Features#message-edits-and-deletes)
|
- [Support multiple gateways(bridges) for your protocols](https://github.com/42wim/matterbridge/wiki/Features#support-multiple-gatewaysbridges-for-your-protocols)
|
||||||
* Preserves threading when possible
|
- [Message edits and deletes](https://github.com/42wim/matterbridge/wiki/Features#message-edits-and-deletes)
|
||||||
* [Attachment / files handling](https://github.com/42wim/matterbridge/wiki/Features#attachment--files-handling)
|
- Preserves threading when possible
|
||||||
* [Username and avatar spoofing](https://github.com/42wim/matterbridge/wiki/Features#username-and-avatar-spoofing)
|
- [Attachment / files handling](https://github.com/42wim/matterbridge/wiki/Features#attachment--files-handling)
|
||||||
* [Private groups](https://github.com/42wim/matterbridge/wiki/Features#private-groups)
|
- [Username and avatar spoofing](https://github.com/42wim/matterbridge/wiki/Features#username-and-avatar-spoofing)
|
||||||
* [API](https://github.com/42wim/matterbridge/wiki/Features#api)
|
- [Private groups](https://github.com/42wim/matterbridge/wiki/Features#private-groups)
|
||||||
|
- [API](https://github.com/42wim/matterbridge/wiki/Features#api)
|
||||||
|
|
||||||
### Natively supported
|
### Natively supported
|
||||||
|
|
||||||
* [Mattermost](https://github.com/mattermost/mattermost-server/) 4.x, 5.x
|
- [Mattermost](https://github.com/mattermost/mattermost-server/) 4.x, 5.x
|
||||||
* [IRC](http://www.mirc.com/servers.html)
|
- [IRC](http://www.mirc.com/servers.html)
|
||||||
* [XMPP](https://xmpp.org)
|
- [XMPP](https://xmpp.org)
|
||||||
* [Gitter](https://gitter.im)
|
- [Gitter](https://gitter.im)
|
||||||
* [Slack](https://slack.com)
|
- [Slack](https://slack.com)
|
||||||
* [Discord](https://discordapp.com)
|
- [Discord](https://discordapp.com)
|
||||||
* [Telegram](https://telegram.org)
|
- [Telegram](https://telegram.org)
|
||||||
* [Rocket.chat](https://rocket.chat)
|
- [Rocket.chat](https://rocket.chat)
|
||||||
* [Matrix](https://matrix.org)
|
- [Matrix](https://matrix.org)
|
||||||
* [Steam](https://store.steampowered.com/)
|
- [Steam](https://store.steampowered.com/)
|
||||||
* [Twitch](https://twitch.tv)
|
- [Twitch](https://twitch.tv)
|
||||||
* [Ssh-chat](https://github.com/shazow/ssh-chat)
|
- [Ssh-chat](https://github.com/shazow/ssh-chat)
|
||||||
* [WhatsApp](https://www.whatsapp.com/)
|
- [WhatsApp](https://www.whatsapp.com/)
|
||||||
* [Zulip](https://zulipchat.com)
|
- [Zulip](https://zulipchat.com)
|
||||||
|
- [Keybase](https://keybase.io)
|
||||||
|
|
||||||
### 3rd party via matterbridge api
|
### 3rd party via matterbridge api
|
||||||
* [Minecraft](https://github.com/elytra/MatterLink)
|
|
||||||
* [Reddit](https://github.com/bonehurtingjuice/mattereddit)
|
- [Minecraft](https://github.com/elytra/MatterLink)
|
||||||
* [Facebook messenger](https://github.com/VictorNine/fbridge)
|
- [Reddit](https://github.com/bonehurtingjuice/mattereddit)
|
||||||
* [Discourse](https://github.com/DeclanHoare/matterbabble)
|
- [Facebook messenger](https://github.com/VictorNine/fbridge)
|
||||||
|
- [Discourse](https://github.com/DeclanHoare/matterbabble)
|
||||||
|
|
||||||
### API
|
### API
|
||||||
|
|
||||||
The API is basic at the moment.
|
The API is basic at the moment.
|
||||||
More info and examples on the [wiki](https://github.com/42wim/matterbridge/wiki/Api).
|
More info and examples on the [wiki](https://github.com/42wim/matterbridge/wiki/Api).
|
||||||
|
|
||||||
Used by the projects below. Feel free to make a PR to add your project to this list.
|
Used by the projects below. 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)
|
- [MatterLink](https://github.com/elytra/MatterLink) (Matterbridge link for Minecraft Server chat)
|
||||||
* [pyCord](https://github.com/NikkyAI/pyCord) (crossplatform chatbot)
|
- [pyCord](https://github.com/NikkyAI/pyCord) (crossplatform chatbot)
|
||||||
* [Mattereddit](https://github.com/bonehurtingjuice/mattereddit) (Reddit chat support)
|
- [Mattereddit](https://github.com/bonehurtingjuice/mattereddit) (Reddit chat support)
|
||||||
* [fbridge](https://github.com/VictorNine/fbridge) (Facebook messenger support)
|
- [fbridge](https://github.com/VictorNine/fbridge) (Facebook messenger support)
|
||||||
* [matterbabble](https://github.com/DeclanHoare/matterbabble) (Discourse support)
|
- [matterbabble](https://github.com/DeclanHoare/matterbabble) (Discourse support)
|
||||||
|
|
||||||
## Chat with us
|
## Chat with us
|
||||||
|
|
||||||
Questions or want to test on your favorite platform? Join below:
|
Questions or want to test on your favorite platform? Join below:
|
||||||
|
|
||||||
* [Gitter][mb-gitter]
|
- [Gitter][mb-gitter]
|
||||||
* [IRC][mb-irc]
|
- [IRC][mb-irc]
|
||||||
* [Discord][mb-discord]
|
- [Discord][mb-discord]
|
||||||
* [Matrix][mb-matrix]
|
- [Matrix][mb-matrix]
|
||||||
* [Slack][mb-slack]
|
- [Slack][mb-slack]
|
||||||
* [Mattermost][mb-mattermost]
|
- [Mattermost][mb-mattermost]
|
||||||
* [Rocket.Chat][mb-rocketchat]
|
- [Rocket.Chat][mb-rocketchat]
|
||||||
* [XMPP][mb-xmpp] (matterbridge@conference.jabber.de)
|
- [XMPP][mb-xmpp] (matterbridge@conference.jabber.de)
|
||||||
* [Twitch][mb-twitch]
|
- [Twitch][mb-twitch]
|
||||||
* [Zulip][mb-zulip]
|
- [Zulip][mb-zulip]
|
||||||
* [Telegram][mb-telegram]
|
- [Telegram][mb-telegram]
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||
See https://github.com/42wim/matterbridge/wiki
|
See https://github.com/42wim/matterbridge/wiki
|
||||||
|
|
||||||
## Installing / upgrading
|
## Installing / upgrading
|
||||||
|
|
||||||
### Binaries
|
### Binaries
|
||||||
* Latest stable release [v1.15.1](https://github.com/42wim/matterbridge/releases/latest)
|
|
||||||
* Development releases (follows master) can be downloaded [here](https://dl.bintray.com/42wim/nightly/)
|
- Latest stable release [v1.16.1](https://github.com/42wim/matterbridge/releases/latest)
|
||||||
|
- Development releases (follows master) can be downloaded [here](https://dl.bintray.com/42wim/nightly/)
|
||||||
|
|
||||||
To install or upgrade just download the latest [binary](https://github.com/42wim/matterbridge/releases/latest) and follow the instructions on the [howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config) for a step by step walkthrough for creating your configuration.
|
To install or upgrade just download the latest [binary](https://github.com/42wim/matterbridge/releases/latest) and follow the instructions on the [howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config) for a step by step walkthrough for creating your configuration.
|
||||||
|
|
||||||
### Packages
|
### Packages
|
||||||
* [Overview](https://repology.org/metapackage/matterbridge/versions)
|
|
||||||
|
- [Overview](https://repology.org/metapackage/matterbridge/versions)
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
Most people just want to use binaries, you can find those [here](https://github.com/42wim/matterbridge/releases/latest)
|
Most people just want to use binaries, you can find those [here](https://github.com/42wim/matterbridge/releases/latest)
|
||||||
|
|
||||||
If you really want to build from source, follow these instructions:
|
If you really want to build from source, follow these instructions:
|
||||||
Go 1.9+ 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.9+ 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).
|
||||||
|
|
||||||
After Go is setup, download matterbridge to your $GOPATH directory.
|
After Go is setup, download matterbridge to your \$GOPATH directory.
|
||||||
|
|
||||||
```
|
```
|
||||||
cd $GOPATH
|
cd $GOPATH
|
||||||
@@ -158,17 +171,23 @@ matterbridge
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
### Basic 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.
|
See [howto](https://github.com/42wim/matterbridge/wiki/How-to-create-your-config) for a step by step walkthrough for creating your configuration.
|
||||||
|
|
||||||
### Settings
|
### Settings
|
||||||
|
|
||||||
All possible [settings](https://github.com/42wim/matterbridge/wiki/Settings) for each bridge.
|
All possible [settings](https://github.com/42wim/matterbridge/wiki/Settings) for each bridge.
|
||||||
|
|
||||||
### Advanced configuration
|
### Advanced configuration
|
||||||
* [matterbridge.toml.sample](https://github.com/42wim/matterbridge/blob/master/matterbridge.toml.sample) for documentation and an example.
|
|
||||||
|
- [matterbridge.toml.sample](https://github.com/42wim/matterbridge/blob/master/matterbridge.toml.sample) for documentation and an example.
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
|
|
||||||
#### Bridge mattermost (off-topic) - irc (#testing)
|
#### Bridge mattermost (off-topic) - irc (#testing)
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[irc]
|
[irc]
|
||||||
[irc.freenode]
|
[irc.freenode]
|
||||||
@@ -197,6 +216,7 @@ enable=true
|
|||||||
```
|
```
|
||||||
|
|
||||||
#### Bridge slack (#general) - discord (general)
|
#### Bridge slack (#general) - discord (general)
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[slack]
|
[slack]
|
||||||
[slack.test]
|
[slack.test]
|
||||||
@@ -241,12 +261,15 @@ Usage of ./matterbridge:
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Docker
|
### Docker
|
||||||
|
|
||||||
Create your matterbridge.toml file locally eg in `/tmp/matterbridge.toml`
|
Create your matterbridge.toml file locally eg in `/tmp/matterbridge.toml`
|
||||||
|
|
||||||
```
|
```
|
||||||
docker run -ti -v /tmp/matterbridge.toml:/matterbridge.toml 42wim/matterbridge
|
docker run -ti -v /tmp/matterbridge.toml:/matterbridge.toml 42wim/matterbridge
|
||||||
```
|
```
|
||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
See [changelog.md](https://github.com/42wim/matterbridge/blob/master/changelog.md)
|
See [changelog.md](https://github.com/42wim/matterbridge/blob/master/changelog.md)
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
@@ -254,28 +277,30 @@ See [changelog.md](https://github.com/42wim/matterbridge/blob/master/changelog.m
|
|||||||
See [FAQ](https://github.com/42wim/matterbridge/wiki/FAQ)
|
See [FAQ](https://github.com/42wim/matterbridge/wiki/FAQ)
|
||||||
|
|
||||||
## Related projects
|
## Related projects
|
||||||
* [FOSSRIT/infrastructure - roles/matterbridge](https://github.com/FOSSRIT/infrastructure/tree/master/roles/matterbridge) (Ansible role used to automate deployments of Matterbridge)
|
|
||||||
* [matterbridge autoconfig](https://github.com/patcon/matterbridge-autoconfig)
|
- [FOSSRIT/infrastructure - roles/matterbridge](https://github.com/FOSSRIT/infrastructure/tree/master/roles/matterbridge) (Ansible role used to automate deployments of Matterbridge)
|
||||||
* [matterbridge config viewer](https://github.com/patcon/matterbridge-heroku-viewer)
|
- [matterbridge autoconfig](https://github.com/patcon/matterbridge-autoconfig)
|
||||||
* [matterbridge-heroku](https://github.com/cadecairos/matterbridge-heroku)
|
- [matterbridge config viewer](https://github.com/patcon/matterbridge-heroku-viewer)
|
||||||
* [mattereddit](https://github.com/bonehurtingjuice/mattereddit)
|
- [matterbridge-heroku](https://github.com/cadecairos/matterbridge-heroku)
|
||||||
* [matterlink](https://github.com/elytra/MatterLink)
|
- [mattereddit](https://github.com/bonehurtingjuice/mattereddit)
|
||||||
* [mattermost-plugin](https://github.com/matterbridge/mattermost-plugin) - Run matterbridge as a plugin in mattermost
|
- [matterlink](https://github.com/elytra/MatterLink)
|
||||||
* [pyCord](https://github.com/NikkyAI/pyCord) (crossplatform chatbot)
|
- [mattermost-plugin](https://github.com/matterbridge/mattermost-plugin) - Run matterbridge as a plugin in mattermost
|
||||||
* [fbridge](https://github.com/VictorNine/fbridge) (Facebook messenger support)
|
- [pyCord](https://github.com/NikkyAI/pyCord) (crossplatform chatbot)
|
||||||
* [isla](https://github.com/alphachung/isla) (Bot for Discord-Telegram groups used alongside matterbridge)
|
- [fbridge](https://github.com/VictorNine/fbridge) (Facebook messenger support)
|
||||||
* [matterbabble](https://github.com/DeclanHoare/matterbabble) (Connect Discourse threads to Matterbridge)
|
- [isla](https://github.com/alphachung/isla) (Bot for Discord-Telegram groups used alongside matterbridge)
|
||||||
|
- [matterbabble](https://github.com/DeclanHoare/matterbabble) (Connect Discourse threads to Matterbridge)
|
||||||
|
|
||||||
## Articles
|
## Articles
|
||||||
* [matterbridge on kubernetes](https://medium.freecodecamp.org/using-kubernetes-to-deploy-a-chat-gateway-or-when-technology-works-like-its-supposed-to-a169a8cd69a3)
|
|
||||||
* https://mattermost.com/blog/connect-irc-to-mattermost/
|
- [matterbridge on kubernetes](https://medium.freecodecamp.org/using-kubernetes-to-deploy-a-chat-gateway-or-when-technology-works-like-its-supposed-to-a169a8cd69a3)
|
||||||
* https://blog.valvin.fr/2016/09/17/mattermost-et-un-channel-irc-cest-possible/
|
- https://mattermost.com/blog/connect-irc-to-mattermost/
|
||||||
* https://blog.brightscout.com/top-10-mattermost-integrations/
|
- https://blog.valvin.fr/2016/09/17/mattermost-et-un-channel-irc-cest-possible/
|
||||||
* http://bencey.co.nz/2018/09/17/bridge/
|
- https://blog.brightscout.com/top-10-mattermost-integrations/
|
||||||
* https://www.algoo.fr/blog/2018/01/19/recouvrez-votre-liberte-en-quittant-slack-pour-un-mattermost-auto-heberge/
|
- http://bencey.co.nz/2018/09/17/bridge/
|
||||||
* https://kopano.com/blog/matterbridge-bridging-mattermost-chat/
|
- https://www.algoo.fr/blog/2018/01/19/recouvrez-votre-liberte-en-quittant-slack-pour-un-mattermost-auto-heberge/
|
||||||
* https://www.stitcher.com/s/?eid=52382713
|
- https://kopano.com/blog/matterbridge-bridging-mattermost-chat/
|
||||||
* https://daniele.tech/2019/02/how-to-use-matterbridge-to-connect-2-different-slack-workspaces/
|
- https://www.stitcher.com/s/?eid=52382713
|
||||||
|
- https://daniele.tech/2019/02/how-to-use-matterbridge-to-connect-2-different-slack-workspaces/
|
||||||
|
|
||||||
## Thanks
|
## Thanks
|
||||||
|
|
||||||
@@ -287,34 +312,37 @@ See [FAQ](https://github.com/42wim/matterbridge/wiki/FAQ)
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
Matterbridge wouldn't exist without these libraries:
|
Matterbridge wouldn't exist without these libraries:
|
||||||
* discord - https://github.com/bwmarrin/discordgo
|
|
||||||
* echo - https://github.com/labstack/echo
|
- discord - https://github.com/bwmarrin/discordgo
|
||||||
* gitter - https://github.com/sromku/go-gitter
|
- echo - https://github.com/labstack/echo
|
||||||
* gops - https://github.com/google/gops
|
- gitter - https://github.com/sromku/go-gitter
|
||||||
* gozulipbot - https://github.com/ifo/gozulipbot
|
- gops - https://github.com/google/gops
|
||||||
* irc - https://github.com/lrstanley/girc
|
- gozulipbot - https://github.com/ifo/gozulipbot
|
||||||
* mattermost - https://github.com/mattermost/mattermost-server
|
- irc - https://github.com/lrstanley/girc
|
||||||
* matrix - https://github.com/matrix-org/gomatrix
|
- mattermost - https://github.com/mattermost/mattermost-server
|
||||||
* sshchat - https://github.com/shazow/ssh-chat
|
- matrix - https://github.com/matrix-org/gomatrix
|
||||||
* slack - https://github.com/nlopes/slack
|
- sshchat - https://github.com/shazow/ssh-chat
|
||||||
* steam - https://github.com/Philipp15b/go-steam
|
- slack - https://github.com/nlopes/slack
|
||||||
* telegram - https://github.com/go-telegram-bot-api/telegram-bot-api
|
- steam - https://github.com/Philipp15b/go-steam
|
||||||
* xmpp - https://github.com/mattn/go-xmpp
|
- telegram - https://github.com/go-telegram-bot-api/telegram-bot-api
|
||||||
* whatsapp - https://github.com/Rhymen/go-whatsapp/
|
- xmpp - https://github.com/mattn/go-xmpp
|
||||||
* zulip - https://github.com/ifo/gozulipbot
|
- whatsapp - https://github.com/Rhymen/go-whatsapp/
|
||||||
* tengo - https://github.com/d5/tengo
|
- zulip - https://github.com/ifo/gozulipbot
|
||||||
|
- tengo - https://github.com/d5/tengo
|
||||||
|
- keybase - https://github.com/keybase/go-keybase-chat-bot
|
||||||
|
|
||||||
<!-- Links -->
|
<!-- Links -->
|
||||||
|
|
||||||
[mb-gitter]: https://gitter.im/42wim/matterbridge
|
[mb-gitter]: https://gitter.im/42wim/matterbridge
|
||||||
[mb-irc]: https://webchat.freenode.net/?channels=matterbridgechat
|
[mb-irc]: https://webchat.freenode.net/?channels=matterbridgechat
|
||||||
[mb-discord]: https://discord.gg/AkKPtrQ
|
[mb-discord]: https://discord.gg/AkKPtrQ
|
||||||
[mb-matrix]: https://riot.im/app/#/room/#matterbridge:matrix.org
|
[mb-matrix]: https://riot.im/app/#/room/#matterbridge:matrix.org
|
||||||
[mb-slack]: https://join.slack.com/matterbridgechat/shared_invite/MjEwODMxNjU1NDMwLTE0OTk2MTU3NTMtMzZkZmRiNDZhOA
|
[mb-slack]: https://join.slack.com/matterbridgechat/shared_invite/MjEwODMxNjU1NDMwLTE0OTk2MTU3NTMtMzZkZmRiNDZhOA
|
||||||
[mb-mattermost]: https://framateam.org/signup_user_complete/?id=tfqm33ggop8x3qgu4boeieta6e
|
[mb-mattermost]: https://framateam.org/signup_user_complete/?id=tfqm33ggop8x3qgu4boeieta6e
|
||||||
[mb-rocketchat]: https://open.rocket.chat/channel/matterbridge
|
[mb-rocketchat]: https://open.rocket.chat/channel/matterbridge
|
||||||
[mb-xmpp]: https://inverse.chat/
|
[mb-xmpp]: https://inverse.chat/
|
||||||
[mb-twitch]: https://www.twitch.tv/matterbridge
|
[mb-twitch]: https://www.twitch.tv/matterbridge
|
||||||
[mb-whatsapp]: https://www.whatsapp.com/
|
[mb-whatsapp]: https://www.whatsapp.com/
|
||||||
[mb-zulip]: https://matterbridge.zulipchat.com/register/
|
[mb-keybase]: https://keybase.io
|
||||||
[mb-telegram]: https://t.me/Matterbridge
|
[mb-zulip]: https://matterbridge.zulipchat.com/register/
|
||||||
|
[mb-telegram]: https://t.me/Matterbridge
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ type Protocol struct {
|
|||||||
StripNick bool // all protocols
|
StripNick bool // all protocols
|
||||||
SyncTopic bool // slack
|
SyncTopic bool // slack
|
||||||
TengoModifyMessage string // general
|
TengoModifyMessage string // general
|
||||||
Team string // mattermost
|
Team string // mattermost, keybase
|
||||||
Token string // gitter, slack, discord, api
|
Token string // gitter, slack, discord, api
|
||||||
Topic string // zulip
|
Topic string // zulip
|
||||||
URL string // mattermost, slack // DEPRECATED
|
URL string // mattermost, slack // DEPRECATED
|
||||||
@@ -198,6 +198,7 @@ type BridgeValues struct {
|
|||||||
SSHChat map[string]Protocol
|
SSHChat map[string]Protocol
|
||||||
WhatsApp map[string]Protocol // TODO is this struct used? Search for "SlackLegacy" for example didn't return any results
|
WhatsApp map[string]Protocol // TODO is this struct used? Search for "SlackLegacy" for example didn't return any results
|
||||||
Zulip map[string]Protocol
|
Zulip map[string]Protocol
|
||||||
|
Keybase map[string]Protocol
|
||||||
General Protocol
|
General Protocol
|
||||||
Tengo Tengo
|
Tengo Tengo
|
||||||
Gateway []Gateway
|
Gateway []Gateway
|
||||||
@@ -205,6 +206,7 @@ type BridgeValues struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Config interface {
|
type Config interface {
|
||||||
|
Viper() *viper.Viper
|
||||||
BridgeValues() *BridgeValues
|
BridgeValues() *BridgeValues
|
||||||
GetBool(key string) (bool, bool)
|
GetBool(key string) (bool, bool)
|
||||||
GetInt(key string) (int, bool)
|
GetInt(key string) (int, bool)
|
||||||
@@ -273,6 +275,10 @@ func (c *config) BridgeValues() *BridgeValues {
|
|||||||
return c.cv
|
return c.cv
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *config) Viper() *viper.Viper {
|
||||||
|
return c.v
|
||||||
|
}
|
||||||
|
|
||||||
func (c *config) GetBool(key string) (bool, bool) {
|
func (c *config) GetBool(key string) (bool, bool) {
|
||||||
c.RLock()
|
c.RLock()
|
||||||
defer c.RUnlock()
|
defer c.RUnlock()
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ func (b *Bdiscord) Connect() error {
|
|||||||
}
|
}
|
||||||
b.Log.Info("Connection succeeded")
|
b.Log.Info("Connection succeeded")
|
||||||
b.c.AddHandler(b.messageCreate)
|
b.c.AddHandler(b.messageCreate)
|
||||||
|
b.c.AddHandler(b.messageTyping)
|
||||||
b.c.AddHandler(b.memberUpdate)
|
b.c.AddHandler(b.memberUpdate)
|
||||||
b.c.AddHandler(b.messageUpdate)
|
b.c.AddHandler(b.messageUpdate)
|
||||||
b.c.AddHandler(b.messageDelete)
|
b.c.AddHandler(b.messageDelete)
|
||||||
@@ -188,6 +189,14 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
|||||||
return "", fmt.Errorf("Could not find channelID for %v", msg.Channel)
|
return "", fmt.Errorf("Could not find channelID for %v", msg.Channel)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if msg.Event == config.EventUserTyping {
|
||||||
|
if b.GetBool("ShowUserTyping") {
|
||||||
|
err := b.c.ChannelTyping(channelID)
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
// Make a action /me of the message
|
// Make a action /me of the message
|
||||||
if msg.Event == config.EventUserAction {
|
if msg.Event == config.EventUserAction {
|
||||||
msg.Text = "_" + msg.Text + "_"
|
msg.Text = "_" + msg.Text + "_"
|
||||||
@@ -225,20 +234,10 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
b.Log.Debugf("Broadcasting using Webhook")
|
b.Log.Debugf("Broadcasting using Webhook")
|
||||||
for _, f := range msg.Extra["file"] {
|
|
||||||
fi := f.(config.FileInfo)
|
|
||||||
if fi.Comment != "" {
|
|
||||||
msg.Text += fi.Comment + ": "
|
|
||||||
}
|
|
||||||
if fi.URL != "" {
|
|
||||||
msg.Text = fi.URL
|
|
||||||
if fi.Comment != "" {
|
|
||||||
msg.Text = fi.Comment + ": " + fi.URL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// skip empty messages
|
// skip empty messages
|
||||||
if msg.Text == "" {
|
if msg.Text == "" && (msg.Extra == nil || len(msg.Extra["file"]) == 0) {
|
||||||
|
b.Log.Debugf("Skipping empty message %#v", msg)
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,16 +260,16 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
msg, err := b.webhookExecute(
|
b.Log.Debugf("Processing webhook sending for message %#v", msg)
|
||||||
wID,
|
msg, err := b.webhookSend(&msg, wID, wToken)
|
||||||
wToken,
|
if err != nil {
|
||||||
true,
|
b.Log.Errorf("Could not broadcast via webook for message %#v: %s", msg, err)
|
||||||
&discordgo.WebhookParams{
|
return "", err
|
||||||
Content: msg.Text,
|
}
|
||||||
Username: msg.Username,
|
if msg == nil {
|
||||||
AvatarURL: msg.Avatar,
|
return "", nil
|
||||||
})
|
}
|
||||||
return msg.ID, err
|
return msg.ID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
b.Log.Debugf("Broadcasting using token (API)")
|
b.Log.Debugf("Broadcasting using token (API)")
|
||||||
@@ -312,7 +311,7 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return res.ID, err
|
return res.ID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// useWebhook returns true if we have a webhook defined somewhere
|
// useWebhook returns true if we have a webhook defined somewhere
|
||||||
@@ -376,3 +375,57 @@ func (b *Bdiscord) handleUploadFile(msg *config.Message, channelID string) (stri
|
|||||||
}
|
}
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// webhookSend send one or more message via webhook, taking care of file
|
||||||
|
// uploads (from slack, telegram or mattermost).
|
||||||
|
// Returns messageID and error.
|
||||||
|
func (b *Bdiscord) webhookSend(msg *config.Message, webhookID, token string) (*discordgo.Message, error) {
|
||||||
|
var (
|
||||||
|
res *discordgo.Message
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
// WebhookParams can have either `Content` or `File`.
|
||||||
|
|
||||||
|
// We can't send empty messages.
|
||||||
|
if msg.Text != "" {
|
||||||
|
res, err = b.c.WebhookExecute(
|
||||||
|
webhookID,
|
||||||
|
token,
|
||||||
|
true,
|
||||||
|
&discordgo.WebhookParams{
|
||||||
|
Content: msg.Text,
|
||||||
|
Username: msg.Username,
|
||||||
|
AvatarURL: msg.Avatar,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
b.Log.Errorf("Could not send text (%s) for message %#v: %s", msg.Text, msg, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if msg.Extra != nil {
|
||||||
|
for _, f := range msg.Extra["file"] {
|
||||||
|
fi := f.(config.FileInfo)
|
||||||
|
file := discordgo.File{
|
||||||
|
Name: fi.Name,
|
||||||
|
ContentType: "",
|
||||||
|
Reader: bytes.NewReader(*fi.Data),
|
||||||
|
}
|
||||||
|
_, e2 := b.c.WebhookExecute(
|
||||||
|
webhookID,
|
||||||
|
token,
|
||||||
|
false,
|
||||||
|
&discordgo.WebhookParams{
|
||||||
|
Username: msg.Username,
|
||||||
|
AvatarURL: msg.Avatar,
|
||||||
|
File: &file,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if e2 != nil {
|
||||||
|
b.Log.Errorf("Could not send file %#v for message %#v: %s", file, msg, e2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -37,6 +37,19 @@ func (b *Bdiscord) messageDeleteBulk(s *discordgo.Session, m *discordgo.MessageD
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *Bdiscord) messageTyping(s *discordgo.Session, m *discordgo.TypingStart) {
|
||||||
|
if !b.GetBool("ShowUserTyping") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
rmsg := config.Message{Account: b.Account, Event: config.EventUserTyping}
|
||||||
|
rmsg.Channel = b.getChannelName(m.ChannelID)
|
||||||
|
if b.useChannelID {
|
||||||
|
rmsg.Channel = "ID:" + m.ChannelID
|
||||||
|
}
|
||||||
|
b.Remote <- rmsg
|
||||||
|
}
|
||||||
|
|
||||||
func (b *Bdiscord) messageUpdate(s *discordgo.Session, m *discordgo.MessageUpdate) { //nolint:unparam
|
func (b *Bdiscord) messageUpdate(s *discordgo.Session, m *discordgo.MessageUpdate) { //nolint:unparam
|
||||||
if b.GetBool("EditDisable") {
|
if b.GetBool("EditDisable") {
|
||||||
return
|
return
|
||||||
@@ -45,7 +58,10 @@ func (b *Bdiscord) messageUpdate(s *discordgo.Session, m *discordgo.MessageUpdat
|
|||||||
if m.Message.EditedTimestamp != "" {
|
if m.Message.EditedTimestamp != "" {
|
||||||
b.Log.Debugf("Sending edit message")
|
b.Log.Debugf("Sending edit message")
|
||||||
m.Content += b.GetString("EditSuffix")
|
m.Content += b.GetString("EditSuffix")
|
||||||
b.messageCreate(s, (*discordgo.MessageCreate)(m))
|
msg := &discordgo.MessageCreate{
|
||||||
|
Message: m.Message,
|
||||||
|
}
|
||||||
|
b.messageCreate(s, msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,7 +105,7 @@ func (b *Bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreat
|
|||||||
|
|
||||||
// set username
|
// set username
|
||||||
if !b.GetBool("UseUserName") {
|
if !b.GetBool("UseUserName") {
|
||||||
rmsg.Username = b.getNick(m.Author)
|
rmsg.Username = b.getNick(m.Author, m.GuildID)
|
||||||
} else {
|
} else {
|
||||||
rmsg.Username = m.Author.Username
|
rmsg.Username = m.Author.Username
|
||||||
if b.GetBool("UseDiscriminator") {
|
if b.GetBool("UseDiscriminator") {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package bdiscord
|
package bdiscord
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
"errors"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -10,7 +9,7 @@ import (
|
|||||||
"github.com/bwmarrin/discordgo"
|
"github.com/bwmarrin/discordgo"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (b *Bdiscord) getNick(user *discordgo.User) string {
|
func (b *Bdiscord) getNick(user *discordgo.User, guildID string) string {
|
||||||
b.membersMutex.RLock()
|
b.membersMutex.RLock()
|
||||||
defer b.membersMutex.RUnlock()
|
defer b.membersMutex.RUnlock()
|
||||||
|
|
||||||
@@ -24,9 +23,9 @@ func (b *Bdiscord) getNick(user *discordgo.User) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If we didn't find nick, search for it.
|
// If we didn't find nick, search for it.
|
||||||
member, err := b.c.GuildMember(b.guildID, user.ID)
|
member, err := b.c.GuildMember(guildID, user.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Log.Warnf("Failed to fetch information for member %#v: %s", user, err)
|
b.Log.Warnf("Failed to fetch information for member %#v on guild %#v: %s", user, guildID, err)
|
||||||
return user.Username
|
return user.Username
|
||||||
} else if member == nil {
|
} else if member == nil {
|
||||||
b.Log.Warnf("Got no information for member %#v", user)
|
b.Log.Warnf("Got no information for member %#v", user)
|
||||||
@@ -183,7 +182,7 @@ func (b *Bdiscord) stripCustomoji(text string) string {
|
|||||||
|
|
||||||
func (b *Bdiscord) replaceAction(text string) (string, bool) {
|
func (b *Bdiscord) replaceAction(text string) (string, bool) {
|
||||||
if strings.HasPrefix(text, "_") && strings.HasSuffix(text, "_") {
|
if strings.HasPrefix(text, "_") && strings.HasSuffix(text, "_") {
|
||||||
return text[1:], true
|
return text[1 : len(text)-1], true
|
||||||
}
|
}
|
||||||
return text, false
|
return text, false
|
||||||
}
|
}
|
||||||
@@ -236,26 +235,3 @@ func enumerateUsernames(s string) []string {
|
|||||||
}
|
}
|
||||||
return usernames
|
return usernames
|
||||||
}
|
}
|
||||||
|
|
||||||
// webhookExecute executes a webhook.
|
|
||||||
// webhookID: The ID of a webhook.
|
|
||||||
// token : The auth token for the webhook
|
|
||||||
// wait : Waits for server confirmation of message send and ensures that the return struct is populated (it is nil otherwise)
|
|
||||||
func (b *Bdiscord) webhookExecute(webhookID, token string, wait bool, data *discordgo.WebhookParams) (st *discordgo.Message, err error) {
|
|
||||||
uri := discordgo.EndpointWebhookToken(webhookID, token)
|
|
||||||
|
|
||||||
if wait {
|
|
||||||
uri += "?wait=true"
|
|
||||||
}
|
|
||||||
response, err := b.c.RequestWithBucketID("POST", uri, data, discordgo.EndpointWebhookToken("", ""))
|
|
||||||
if !wait || err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.Unmarshal(response, &st)
|
|
||||||
if err != nil {
|
|
||||||
return nil, discordgo.ErrJSONUnmarshal
|
|
||||||
}
|
|
||||||
|
|
||||||
return st, nil
|
|
||||||
}
|
|
||||||
|
|||||||
59
bridge/keybase/handlers.go
Normal file
59
bridge/keybase/handlers.go
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package bkeybase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/42wim/matterbridge/bridge/config"
|
||||||
|
"github.com/keybase/go-keybase-chat-bot/kbchat"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (b *Bkeybase) handleKeybase() {
|
||||||
|
sub, err := b.kbc.ListenForNewTextMessages()
|
||||||
|
if err != nil {
|
||||||
|
b.Log.Errorf("Error listening: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
msg, err := sub.Read()
|
||||||
|
if err != nil {
|
||||||
|
b.Log.Errorf("failed to read message: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if msg.Message.Content.Type != "text" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if msg.Message.Sender.Username == b.kbc.GetUsername() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
b.handleMessage(msg.Message)
|
||||||
|
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bkeybase) handleMessage(msg kbchat.Message) {
|
||||||
|
b.Log.Debugf("== Receiving event: %#v", msg)
|
||||||
|
if msg.Channel.TopicName != b.channel || msg.Channel.Name != b.team {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if msg.Sender.Username != b.kbc.GetUsername() {
|
||||||
|
|
||||||
|
// TODO download avatar
|
||||||
|
|
||||||
|
// Create our message
|
||||||
|
rmsg := config.Message{Username: msg.Sender.Username, Text: msg.Content.Text.Body, UserID: msg.Sender.Uid, Channel: msg.Channel.TopicName, ID: strconv.Itoa(msg.MsgID), Account: b.Account}
|
||||||
|
|
||||||
|
// Text must be a string
|
||||||
|
if msg.Content.Type != "text" {
|
||||||
|
b.Log.Errorf("message is not text")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
b.Log.Debugf("<= Sending message from %s on %s to gateway", msg.Sender.Username, msg.Channel.Name)
|
||||||
|
b.Remote <- rmsg
|
||||||
|
}
|
||||||
|
}
|
||||||
82
bridge/keybase/keybase.go
Normal file
82
bridge/keybase/keybase.go
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
package bkeybase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/42wim/matterbridge/bridge"
|
||||||
|
"github.com/42wim/matterbridge/bridge/config"
|
||||||
|
"github.com/keybase/go-keybase-chat-bot/kbchat"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Bkeybase bridge structure
|
||||||
|
type Bkeybase struct {
|
||||||
|
kbc *kbchat.API
|
||||||
|
user string
|
||||||
|
channel string
|
||||||
|
team string
|
||||||
|
*bridge.Config
|
||||||
|
}
|
||||||
|
|
||||||
|
// New initializes Bkeybase object and sets team
|
||||||
|
func New(cfg *bridge.Config) bridge.Bridger {
|
||||||
|
b := &Bkeybase{Config: cfg}
|
||||||
|
b.team = b.Config.GetString("Team")
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connect starts keybase API and listener loop
|
||||||
|
func (b *Bkeybase) Connect() error {
|
||||||
|
var err error
|
||||||
|
b.Log.Infof("Connecting %s", b.GetString("Team"))
|
||||||
|
|
||||||
|
// use default keybase location (`keybase`)
|
||||||
|
b.kbc, err = kbchat.Start(kbchat.RunOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
b.user = b.kbc.GetUsername()
|
||||||
|
b.Log.Info("Connection succeeded")
|
||||||
|
go b.handleKeybase()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disconnect doesn't do anything for now
|
||||||
|
func (b *Bkeybase) Disconnect() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// JoinChannel sets channel name in struct
|
||||||
|
func (b *Bkeybase) JoinChannel(channel config.ChannelInfo) error {
|
||||||
|
if _, err := b.kbc.JoinChannel(b.team, channel.Name); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
b.channel = channel.Name
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send receives bridge messages and sends them to Keybase chat room
|
||||||
|
func (b *Bkeybase) Send(msg config.Message) (string, error) {
|
||||||
|
b.Log.Debugf("=> Receiving %#v", msg)
|
||||||
|
|
||||||
|
// Handle /me events
|
||||||
|
if msg.Event == config.EventUserAction {
|
||||||
|
msg.Text = "_" + msg.Text + "_"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete message if we have an ID
|
||||||
|
// Delete message not supported by keybase go library yet
|
||||||
|
|
||||||
|
// Upload a file if it exists
|
||||||
|
// kbchat lib does not support attachments yet
|
||||||
|
|
||||||
|
// Edit message if we have an ID
|
||||||
|
// kbchat lib does not support message editing yet
|
||||||
|
|
||||||
|
// Send regular message
|
||||||
|
resp, err := b.kbc.SendMessageByTeamName(b.team, msg.Username+msg.Text, &b.channel)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return strconv.Itoa(resp.Result.MsgID), err
|
||||||
|
}
|
||||||
@@ -291,7 +291,8 @@ func (b *Bmatrix) handleUploadFile(msg *config.Message, channel string, fi *conf
|
|||||||
content := bytes.NewReader(*fi.Data)
|
content := bytes.NewReader(*fi.Data)
|
||||||
sp := strings.Split(fi.Name, ".")
|
sp := strings.Split(fi.Name, ".")
|
||||||
mtype := mime.TypeByExtension("." + sp[len(sp)-1])
|
mtype := mime.TypeByExtension("." + sp[len(sp)-1])
|
||||||
if !strings.Contains(mtype, "image") && !strings.Contains(mtype, "video") {
|
if !(strings.Contains(mtype, "image") || strings.Contains(mtype, "video") ||
|
||||||
|
strings.Contains(mtype, "application") || strings.Contains(mtype, "audio")) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if fi.Comment != "" {
|
if fi.Comment != "" {
|
||||||
@@ -326,6 +327,18 @@ func (b *Bmatrix) handleUploadFile(msg *config.Message, channel string, fi *conf
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
b.Log.Errorf("sendImage failed: %#v", err)
|
b.Log.Errorf("sendImage failed: %#v", err)
|
||||||
}
|
}
|
||||||
|
case strings.Contains(mtype, "application"):
|
||||||
|
b.Log.Debugf("sendFile %s", res.ContentURI)
|
||||||
|
_, err = b.mc.SendFile(channel, fi.Name, res.ContentURI, mtype, uint(len(*fi.Data)))
|
||||||
|
if err != nil {
|
||||||
|
b.Log.Errorf("sendFile failed: %#v", err)
|
||||||
|
}
|
||||||
|
case strings.Contains(mtype, "audio"):
|
||||||
|
b.Log.Debugf("sendAudio %s", res.ContentURI)
|
||||||
|
_, err = b.mc.SendAudio(channel, fi.Name, res.ContentURI, mtype, uint(len(*fi.Data)))
|
||||||
|
if err != nil {
|
||||||
|
b.Log.Errorf("sendAudio failed: %#v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
b.Log.Debugf("result: %#v", res)
|
b.Log.Debugf("result: %#v", res)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,6 +66,11 @@ func (b *Bmattermost) handleMatter() {
|
|||||||
} else {
|
} else {
|
||||||
b.Log.Debugf("Choosing login/password based receiving")
|
b.Log.Debugf("Choosing login/password based receiving")
|
||||||
}
|
}
|
||||||
|
// if for some reason we only want to sent stuff to mattermost but not receive, return
|
||||||
|
if b.GetString("WebhookBindAddress") == "" && b.GetString("WebhookURL") != "" {
|
||||||
|
b.Log.Debugf("No WebhookBindAddress specified, only WebhookURL. You will not receive messages from mattermost, only sending is possible.")
|
||||||
|
return
|
||||||
|
}
|
||||||
go b.handleMatterClient(messages)
|
go b.handleMatterClient(messages)
|
||||||
}
|
}
|
||||||
var ok bool
|
var ok bool
|
||||||
|
|||||||
@@ -58,6 +58,9 @@ func (b *Brocketchat) doConnectWebhookURL() error {
|
|||||||
func (b *Brocketchat) apiLogin() error {
|
func (b *Brocketchat) apiLogin() error {
|
||||||
b.Log.Debugf("handling apiLogin()")
|
b.Log.Debugf("handling apiLogin()")
|
||||||
credentials := &models.UserCredentials{Email: b.GetString("login"), Password: b.GetString("password")}
|
credentials := &models.UserCredentials{Email: b.GetString("login"), Password: b.GetString("password")}
|
||||||
|
if b.GetString("Token") != "" {
|
||||||
|
credentials = &models.UserCredentials{ID: b.GetString("Login"), Token: b.GetString("Token")}
|
||||||
|
}
|
||||||
myURL, err := url.Parse(b.GetString("server"))
|
myURL, err := url.Parse(b.GetString("server"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ func (b *Bslack) handleSlack() {
|
|||||||
message.Text = b.replaceVariable(message.Text)
|
message.Text = b.replaceVariable(message.Text)
|
||||||
message.Text = b.replaceChannel(message.Text)
|
message.Text = b.replaceChannel(message.Text)
|
||||||
message.Text = b.replaceURL(message.Text)
|
message.Text = b.replaceURL(message.Text)
|
||||||
|
message.Text = b.replaceb0rkedMarkDown(message.Text)
|
||||||
message.Text = html.UnescapeString(message.Text)
|
message.Text = html.UnescapeString(message.Text)
|
||||||
|
|
||||||
// Add the avatar
|
// Add the avatar
|
||||||
@@ -43,7 +44,7 @@ func (b *Bslack) handleSlack() {
|
|||||||
|
|
||||||
func (b *Bslack) handleSlackClient(messages chan *config.Message) {
|
func (b *Bslack) handleSlackClient(messages chan *config.Message) {
|
||||||
for msg := range b.rtm.IncomingEvents {
|
for msg := range b.rtm.IncomingEvents {
|
||||||
if msg.Type != sUserTyping && msg.Type != sLatencyReport {
|
if msg.Type != sUserTyping && msg.Type != sHello && msg.Type != sLatencyReport {
|
||||||
b.Log.Debugf("== Receiving event %#v", msg.Data)
|
b.Log.Debugf("== Receiving event %#v", msg.Data)
|
||||||
}
|
}
|
||||||
switch ev := msg.Data.(type) {
|
switch ev := msg.Data.(type) {
|
||||||
@@ -86,7 +87,7 @@ func (b *Bslack) handleSlackClient(messages chan *config.Message) {
|
|||||||
b.Log.Errorf("Connection failed %#v %#v", ev.Error(), ev.ErrorObj)
|
b.Log.Errorf("Connection failed %#v %#v", ev.Error(), ev.ErrorObj)
|
||||||
case *slack.MemberJoinedChannelEvent:
|
case *slack.MemberJoinedChannelEvent:
|
||||||
b.users.populateUser(ev.User)
|
b.users.populateUser(ev.User)
|
||||||
case *slack.LatencyReport:
|
case *slack.HelloEvent, *slack.LatencyReport:
|
||||||
continue
|
continue
|
||||||
default:
|
default:
|
||||||
b.Log.Debugf("Unhandled incoming event: %T", ev)
|
b.Log.Debugf("Unhandled incoming event: %T", ev)
|
||||||
|
|||||||
@@ -188,6 +188,36 @@ func (b *Bslack) replaceURL(text string) string {
|
|||||||
return text
|
return text
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *Bslack) replaceb0rkedMarkDown(text string) string {
|
||||||
|
// taken from https://github.com/mattermost/mattermost-server/blob/master/app/slackimport.go
|
||||||
|
//
|
||||||
|
regexReplaceAllString := []struct {
|
||||||
|
regex *regexp.Regexp
|
||||||
|
rpl string
|
||||||
|
}{
|
||||||
|
// bold
|
||||||
|
{
|
||||||
|
regexp.MustCompile(`(^|[\s.;,])\*(\S[^*\n]+)\*`),
|
||||||
|
"$1**$2**",
|
||||||
|
},
|
||||||
|
// strikethrough
|
||||||
|
{
|
||||||
|
regexp.MustCompile(`(^|[\s.;,])\~(\S[^~\n]+)\~`),
|
||||||
|
"$1~~$2~~",
|
||||||
|
},
|
||||||
|
// single paragraph blockquote
|
||||||
|
// Slack converts > character to >
|
||||||
|
{
|
||||||
|
regexp.MustCompile(`(?sm)^>`),
|
||||||
|
">",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, rule := range regexReplaceAllString {
|
||||||
|
text = rule.regex.ReplaceAllString(text, rule.rpl)
|
||||||
|
}
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
|
||||||
func (b *Bslack) replaceCodeFence(text string) string {
|
func (b *Bslack) replaceCodeFence(text string) string {
|
||||||
return codeFenceRE.ReplaceAllString(text, "```")
|
return codeFenceRE.ReplaceAllString(text, "```")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
"github.com/42wim/matterbridge/bridge/config"
|
"github.com/42wim/matterbridge/bridge/config"
|
||||||
"github.com/42wim/matterbridge/bridge/helper"
|
"github.com/42wim/matterbridge/bridge/helper"
|
||||||
"github.com/42wim/matterbridge/matterhook"
|
"github.com/42wim/matterbridge/matterhook"
|
||||||
"github.com/hashicorp/golang-lru"
|
lru "github.com/hashicorp/golang-lru"
|
||||||
"github.com/nlopes/slack"
|
"github.com/nlopes/slack"
|
||||||
"github.com/rs/xid"
|
"github.com/rs/xid"
|
||||||
)
|
)
|
||||||
@@ -36,6 +36,7 @@ type Bslack struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
sHello = "hello"
|
||||||
sChannelJoin = "channel_join"
|
sChannelJoin = "channel_join"
|
||||||
sChannelLeave = "channel_leave"
|
sChannelLeave = "channel_leave"
|
||||||
sChannelJoined = "channel_joined"
|
sChannelJoined = "channel_joined"
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ func (b *Bsteam) handleEvents() {
|
|||||||
|
|
||||||
func (b *Bsteam) handleLogOnFailed(e *steam.LogOnFailedEvent, myLoginInfo *steam.LogOnDetails) error {
|
func (b *Bsteam) handleLogOnFailed(e *steam.LogOnFailedEvent, myLoginInfo *steam.LogOnDetails) error {
|
||||||
switch e.Result {
|
switch e.Result {
|
||||||
case steamlang.EResult_AccountLogonDeniedNeedTwoFactorCode:
|
case steamlang.EResult_AccountLoginDeniedNeedTwoFactor:
|
||||||
b.Log.Info("Steam guard isn't letting me in! Enter 2FA code:")
|
b.Log.Info("Steam guard isn't letting me in! Enter 2FA code:")
|
||||||
var code string
|
var code string
|
||||||
fmt.Scanf("%s", &code)
|
fmt.Scanf("%s", &code)
|
||||||
|
|||||||
@@ -107,6 +107,9 @@ func (b *Bxmpp) Send(msg config.Message) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *Bxmpp) createXMPP() error {
|
func (b *Bxmpp) createXMPP() error {
|
||||||
|
if !strings.Contains(b.GetString("Jid"), "@") {
|
||||||
|
return fmt.Errorf("the Jid %s doesn't contain an @", b.GetString("Jid"))
|
||||||
|
}
|
||||||
tc := &tls.Config{
|
tc := &tls.Config{
|
||||||
ServerName: strings.Split(b.GetString("Jid"), "@")[1],
|
ServerName: strings.Split(b.GetString("Jid"), "@")[1],
|
||||||
InsecureSkipVerify: b.GetBool("SkipTLSVerify"), // nolint: gosec
|
InsecureSkipVerify: b.GetBool("SkipTLSVerify"), // nolint: gosec
|
||||||
|
|||||||
76
changelog.md
76
changelog.md
@@ -1,15 +1,69 @@
|
|||||||
# dev
|
# dev
|
||||||
|
|
||||||
# v1.15.1
|
# v1.16.1
|
||||||
|
|
||||||
|
## New features
|
||||||
|
|
||||||
|
* rocketchat: add token support #892
|
||||||
|
* matrix: Add support for uploading application/x and audio/x (matrix). #929
|
||||||
|
|
||||||
## Enhancements
|
## Enhancements
|
||||||
|
|
||||||
|
* general: Do configuration validation on start-up. Fixes #888
|
||||||
|
* general: updated vendored libraries (discord/whatsapp) #932
|
||||||
|
* discord: user typing messages #914
|
||||||
|
* slack: Convert slack bold/strike to correct markdown (slack). Fixes #918
|
||||||
|
|
||||||
|
## Bugfix
|
||||||
|
|
||||||
|
* discord: fix Failed to fetch information for members message. #894
|
||||||
|
* discord: remove obsolete file upload links (discord). #931
|
||||||
|
* slack: suppress unhandled HelloEvent message #913
|
||||||
|
* mattermost: Fix panic on WebhookURL only setting (mattermost). #917
|
||||||
|
* matrix: fix corrupted links between slack and matrix #924
|
||||||
|
|
||||||
|
This release couldn't exist without the following contributors:
|
||||||
|
@qaisjp, @hramrach, @42wim
|
||||||
|
|
||||||
|
# v1.16.0
|
||||||
|
|
||||||
|
## New features
|
||||||
|
|
||||||
|
* keybase: new protocol added. Add initial Keybase Chat support #877 Thanks to @hyperobject
|
||||||
|
* discord: Support webhook files in discord #872
|
||||||
|
|
||||||
|
## Enhancements
|
||||||
|
|
||||||
|
* general: update dependencies
|
||||||
|
|
||||||
|
## Bugfix
|
||||||
|
|
||||||
|
* discord: Underscores from Discord don't arrive correctly #864
|
||||||
|
* xmpp: Fix possible panic at startup of the XMPP bridge #869
|
||||||
|
* mattermost: Make getChannelIdTeam behave like GetChannelId for groups (mattermost) #873
|
||||||
|
|
||||||
|
This release couldn't exist without the following contributors:
|
||||||
|
@hyperobject, @42wim, @bucko909, @MOZGIII
|
||||||
|
|
||||||
|
# v1.15.1
|
||||||
|
|
||||||
|
## New features
|
||||||
|
* discord: Support webhook message deletions (discord) (#853)
|
||||||
|
|
||||||
|
## Enhancements
|
||||||
|
|
||||||
* discord: Support bulk deletions #851
|
* discord: Support bulk deletions #851
|
||||||
* discord: Support channels in categories #863 (use category/channel. See matterbridge.toml.sample for more info)
|
* discord: Support channels in categories #863 (use category/channel. See matterbridge.toml.sample for more info)
|
||||||
* mattermost: Add an option to skip the Mattermost server version check #849
|
* mattermost: Add an option to skip the Mattermost server version check #849
|
||||||
|
|
||||||
## Bugfix
|
## Bugfix
|
||||||
|
|
||||||
* xmpp: fix segfault when disconnected/reconnected #856
|
* xmpp: fix segfault when disconnected/reconnected #856
|
||||||
* telegram: fix panic in handleEntities #858
|
* telegram: fix panic in handleEntities #858
|
||||||
|
|
||||||
|
This release couldn't exist without the following contributors:
|
||||||
|
@42wim, @qaisjp, @joohoi
|
||||||
|
|
||||||
# v1.15.0
|
# v1.15.0
|
||||||
## New features
|
## New features
|
||||||
* Add scripting (tengo) support for every outgoing message (#806)
|
* Add scripting (tengo) support for every outgoing message (#806)
|
||||||
@@ -17,21 +71,21 @@
|
|||||||
https://github.com/42wim/matterbridge/wiki/Settings#outmessage for more information
|
https://github.com/42wim/matterbridge/wiki/Settings#outmessage for more information
|
||||||
* Add tengo support to RemoteNickFormat (#793)
|
* Add tengo support to RemoteNickFormat (#793)
|
||||||
See https://github.com/42wim/matterbridge/wiki/Settings#remotenickformat-2
|
See https://github.com/42wim/matterbridge/wiki/Settings#remotenickformat-2
|
||||||
* Deprecated `Message` under `[tengo]` to `InMessage`
|
* Deprecated `Message` under `[tengo]` to `InMessage`
|
||||||
|
|
||||||
## Enhancements
|
## Enhancements
|
||||||
* general: Forward only user-typing messages if supported by protocol (#832)
|
* general: Forward only user-typing messages if supported by protocol (#832)
|
||||||
* general: updated wiki with all possible settings: https://github.com/42wim/matterbridge/wiki/Settings
|
* general: updated wiki with all possible settings: https://github.com/42wim/matterbridge/wiki/Settings
|
||||||
* tengo: Add msg event to tengo
|
* tengo: Add msg event to tengo
|
||||||
* xmpp: Verify TLS against JID domain, not the host. (xmpp) (#834)
|
* xmpp: Verify TLS against JID domain, not the host. (xmpp) (#834)
|
||||||
* xmpp: Allow messages with timestamp (xmpp). Fixes #835 (#847)
|
* xmpp: Allow messages with timestamp (xmpp). Fixes #835 (#847)
|
||||||
* irc: Add verbose IRC joins/parts (ident@host) (#805)
|
* irc: Add verbose IRC joins/parts (ident@host) (#805)
|
||||||
See https://github.com/42wim/matterbridge/wiki/Settings#verbosejoinpart
|
See https://github.com/42wim/matterbridge/wiki/Settings#verbosejoinpart
|
||||||
* rocketchat: Add useraction support (rocketchat). Closes #772 (#794)
|
* rocketchat: Add useraction support (rocketchat). Closes #772 (#794)
|
||||||
|
|
||||||
## Bugfix
|
## Bugfix
|
||||||
* slack: Fix regression in autojoining with legacy tokens (slack). Fixes #651 (#848)
|
* slack: Fix regression in autojoining with legacy tokens (slack). Fixes #651 (#848)
|
||||||
* xmpp: Revert xmpp to orig behaviour. Closes #844
|
* xmpp: Revert xmpp to orig behaviour. Closes #844
|
||||||
* whatsapp: Update github.com/Rhymen/go-whatsapp vendor. Fixes #843
|
* whatsapp: Update github.com/Rhymen/go-whatsapp vendor. Fixes #843
|
||||||
* mattermost: Update channels of all teams (mattermost)
|
* mattermost: Update channels of all teams (mattermost)
|
||||||
|
|
||||||
|
|||||||
12
ci/lint.sh
12
ci/lint.sh
@@ -9,9 +9,9 @@ fi
|
|||||||
# Run the linter.
|
# Run the linter.
|
||||||
golangci-lint run
|
golangci-lint run
|
||||||
|
|
||||||
if [[ "${GO111MODULE-off}" == "on" ]]; then
|
# if [[ "${GO111MODULE-off}" == "on" ]]; then
|
||||||
# If Go modules are active then check that dependencies are correctly maintained.
|
# # If Go modules are active then check that dependencies are correctly maintained.
|
||||||
go mod tidy
|
# go mod tidy
|
||||||
go mod vendor
|
# go mod vendor
|
||||||
git diff --exit-code --quiet || (echo "Please run 'go mod tidy' to clean up the 'go.mod' and 'go.sum' files."; false)
|
# git diff --exit-code --quiet || (echo "Please run 'go mod tidy' to clean up the 'go.mod' and 'go.sum' files."; false)
|
||||||
fi
|
# fi
|
||||||
|
|||||||
14
contrib/outmessage-irccolornick.tengo
Normal file
14
contrib/outmessage-irccolornick.tengo
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
// See https://github.com/42wim/matterbridge/issues/881
|
||||||
|
// Generates a colored nick for each msgUsername, with example to filter specific codes
|
||||||
|
|
||||||
|
text := import("text")
|
||||||
|
fmt := import("fmt")
|
||||||
|
if outProtocol == "irc" {
|
||||||
|
// generate a color for a nick, make sure it isn't 0 or 15
|
||||||
|
colorCode := len(msgUsername)+bytes(msgUsername)[0]%14 + 2
|
||||||
|
// example if we want to use colorCode 3 when we have calculated colorcode 14
|
||||||
|
if colorCode == 14 {
|
||||||
|
colorCode = 3
|
||||||
|
}
|
||||||
|
msgUsername=fmt.sprintf("\x03%02d%s\x0F", colorCode, msgUsername)
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
bdiscord "github.com/42wim/matterbridge/bridge/discord"
|
bdiscord "github.com/42wim/matterbridge/bridge/discord"
|
||||||
bgitter "github.com/42wim/matterbridge/bridge/gitter"
|
bgitter "github.com/42wim/matterbridge/bridge/gitter"
|
||||||
birc "github.com/42wim/matterbridge/bridge/irc"
|
birc "github.com/42wim/matterbridge/bridge/irc"
|
||||||
|
bkeybase "github.com/42wim/matterbridge/bridge/keybase"
|
||||||
bmatrix "github.com/42wim/matterbridge/bridge/matrix"
|
bmatrix "github.com/42wim/matterbridge/bridge/matrix"
|
||||||
bmattermost "github.com/42wim/matterbridge/bridge/mattermost"
|
bmattermost "github.com/42wim/matterbridge/bridge/mattermost"
|
||||||
brocketchat "github.com/42wim/matterbridge/bridge/rocketchat"
|
brocketchat "github.com/42wim/matterbridge/bridge/rocketchat"
|
||||||
@@ -35,9 +36,11 @@ var (
|
|||||||
"whatsapp": bwhatsapp.New,
|
"whatsapp": bwhatsapp.New,
|
||||||
"xmpp": bxmpp.New,
|
"xmpp": bxmpp.New,
|
||||||
"zulip": bzulip.New,
|
"zulip": bzulip.New,
|
||||||
|
"keybase": bkeybase.New,
|
||||||
}
|
}
|
||||||
|
|
||||||
UserTypingSupport = map[string]struct{}{
|
UserTypingSupport = map[string]struct{}{
|
||||||
"slack": {},
|
"slack": {},
|
||||||
|
"discord": {},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ func (gw *Gateway) FindCanonicalMsgID(protocol string, mID string) string {
|
|||||||
func (gw *Gateway) AddBridge(cfg *config.Bridge) error {
|
func (gw *Gateway) AddBridge(cfg *config.Bridge) error {
|
||||||
br := gw.Router.getBridge(cfg.Account)
|
br := gw.Router.getBridge(cfg.Account)
|
||||||
if br == nil {
|
if br == nil {
|
||||||
|
gw.checkConfig(cfg)
|
||||||
br = bridge.New(cfg)
|
br = bridge.New(cfg)
|
||||||
br.Config = gw.Router.Config
|
br.Config = gw.Router.Config
|
||||||
br.General = &gw.BridgeValues().General
|
br.General = &gw.BridgeValues().General
|
||||||
@@ -104,6 +105,19 @@ func (gw *Gateway) AddBridge(cfg *config.Bridge) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gw *Gateway) checkConfig(cfg *config.Bridge) {
|
||||||
|
match := false
|
||||||
|
for _, key := range gw.Router.Config.Viper().AllKeys() {
|
||||||
|
if strings.HasPrefix(key, cfg.Account) {
|
||||||
|
match = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !match {
|
||||||
|
gw.logger.Fatalf("Account %s defined in gateway %s but no configuration found, exiting.", cfg.Account, gw.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// AddConfig associates a new configuration with the gateway object.
|
// AddConfig associates a new configuration with the gateway object.
|
||||||
func (gw *Gateway) AddConfig(cfg *config.Gateway) error {
|
func (gw *Gateway) AddConfig(cfg *config.Gateway) error {
|
||||||
gw.Name = cfg.Name
|
gw.Name = cfg.Name
|
||||||
|
|||||||
@@ -15,10 +15,15 @@ import (
|
|||||||
|
|
||||||
var testconfig = []byte(`
|
var testconfig = []byte(`
|
||||||
[irc.freenode]
|
[irc.freenode]
|
||||||
|
server=""
|
||||||
[mattermost.test]
|
[mattermost.test]
|
||||||
|
server=""
|
||||||
[gitter.42wim]
|
[gitter.42wim]
|
||||||
|
server=""
|
||||||
[discord.test]
|
[discord.test]
|
||||||
|
server=""
|
||||||
[slack.test]
|
[slack.test]
|
||||||
|
server=""
|
||||||
|
|
||||||
[[gateway]]
|
[[gateway]]
|
||||||
name = "bridge1"
|
name = "bridge1"
|
||||||
@@ -44,10 +49,15 @@ var testconfig = []byte(`
|
|||||||
|
|
||||||
var testconfig2 = []byte(`
|
var testconfig2 = []byte(`
|
||||||
[irc.freenode]
|
[irc.freenode]
|
||||||
|
server=""
|
||||||
[mattermost.test]
|
[mattermost.test]
|
||||||
|
server=""
|
||||||
[gitter.42wim]
|
[gitter.42wim]
|
||||||
|
server=""
|
||||||
[discord.test]
|
[discord.test]
|
||||||
|
server=""
|
||||||
[slack.test]
|
[slack.test]
|
||||||
|
server=""
|
||||||
|
|
||||||
[[gateway]]
|
[[gateway]]
|
||||||
name = "bridge1"
|
name = "bridge1"
|
||||||
@@ -87,8 +97,11 @@ var testconfig2 = []byte(`
|
|||||||
|
|
||||||
var testconfig3 = []byte(`
|
var testconfig3 = []byte(`
|
||||||
[irc.zzz]
|
[irc.zzz]
|
||||||
|
server=""
|
||||||
[telegram.zzz]
|
[telegram.zzz]
|
||||||
|
server=""
|
||||||
[slack.zzz]
|
[slack.zzz]
|
||||||
|
server=""
|
||||||
[[gateway]]
|
[[gateway]]
|
||||||
name="bridge"
|
name="bridge"
|
||||||
enable=true
|
enable=true
|
||||||
@@ -176,7 +189,6 @@ func TestNewRouter(t *testing.T) {
|
|||||||
assert.Equal(t, 1, len(r.Gateways))
|
assert.Equal(t, 1, len(r.Gateways))
|
||||||
assert.Equal(t, 4, len(r.Gateways["bridge1"].Bridges))
|
assert.Equal(t, 4, len(r.Gateways["bridge1"].Bridges))
|
||||||
assert.Equal(t, 4, len(r.Gateways["bridge1"].Channels))
|
assert.Equal(t, 4, len(r.Gateways["bridge1"].Channels))
|
||||||
|
|
||||||
r = maketestRouter(testconfig2)
|
r = maketestRouter(testconfig2)
|
||||||
assert.Equal(t, 2, len(r.Gateways))
|
assert.Equal(t, 2, len(r.Gateways))
|
||||||
assert.Equal(t, 4, len(r.Gateways["bridge1"].Bridges))
|
assert.Equal(t, 4, len(r.Gateways["bridge1"].Bridges))
|
||||||
|
|||||||
@@ -59,8 +59,14 @@ func NewRouter(rootLogger *logrus.Logger, cfg config.Config, bridgeMap map[strin
|
|||||||
// between them.
|
// between them.
|
||||||
func (r *Router) Start() error {
|
func (r *Router) Start() error {
|
||||||
m := make(map[string]*bridge.Bridge)
|
m := make(map[string]*bridge.Bridge)
|
||||||
|
if len(r.Gateways) == 0 {
|
||||||
|
return fmt.Errorf("no [[gateway]] configured. See https://github.com/42wim/matterbridge/wiki/How-to-create-your-config for more info")
|
||||||
|
}
|
||||||
for _, gw := range r.Gateways {
|
for _, gw := range r.Gateways {
|
||||||
r.logger.Infof("Parsing gateway %s", gw.Name)
|
r.logger.Infof("Parsing gateway %s", gw.Name)
|
||||||
|
if len(gw.Bridges) == 0 {
|
||||||
|
return fmt.Errorf("no bridges configured for gateway %s. See https://github.com/42wim/matterbridge/wiki/How-to-create-your-config for more info", gw.Name)
|
||||||
|
}
|
||||||
for _, br := range gw.Bridges {
|
for _, br := range gw.Bridges {
|
||||||
m[br.Account] = br
|
m[br.Account] = br
|
||||||
}
|
}
|
||||||
|
|||||||
37
go.mod
37
go.mod
@@ -4,10 +4,11 @@ require (
|
|||||||
github.com/42wim/go-gitter v0.0.0-20170828205020-017310c2d557
|
github.com/42wim/go-gitter v0.0.0-20170828205020-017310c2d557
|
||||||
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f
|
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f
|
||||||
github.com/Jeffail/gabs v1.1.1 // indirect
|
github.com/Jeffail/gabs v1.1.1 // indirect
|
||||||
github.com/Philipp15b/go-steam v1.0.1-0.20180818081528-681bd9573329
|
github.com/Philipp15b/go-steam v1.0.1-0.20190816133340-b04c5a83c1c0
|
||||||
github.com/Rhymen/go-whatsapp v0.0.2
|
github.com/Rhymen/go-whatsapp v0.0.3-0.20191003184814-fc3f792c814c
|
||||||
github.com/bwmarrin/discordgo v0.19.0
|
github.com/bwmarrin/discordgo v0.19.0
|
||||||
github.com/d5/tengo v1.24.1
|
// github.com/bwmarrin/discordgo v0.19.0
|
||||||
|
github.com/d5/tengo v1.24.8
|
||||||
github.com/dfordsoft/golib v0.0.0-20180902042739-76ee6ab99bec
|
github.com/dfordsoft/golib v0.0.0-20180902042739-76ee6ab99bec
|
||||||
github.com/fsnotify/fsnotify v1.4.7
|
github.com/fsnotify/fsnotify v1.4.7
|
||||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.5-0.20181225215658-ec221ba9ea45+incompatible
|
github.com/go-telegram-bot-api/telegram-bot-api v4.6.5-0.20181225215658-ec221ba9ea45+incompatible
|
||||||
@@ -15,18 +16,17 @@ require (
|
|||||||
github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4 // indirect
|
github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4 // indirect
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f // indirect
|
github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f // indirect
|
||||||
github.com/gorilla/schema v1.1.0
|
github.com/gorilla/schema v1.1.0
|
||||||
github.com/gorilla/websocket v1.4.0
|
github.com/gorilla/websocket v1.4.1
|
||||||
github.com/hashicorp/golang-lru v0.5.1
|
github.com/hashicorp/golang-lru v0.5.3
|
||||||
github.com/hpcloud/tail v1.0.0 // indirect
|
github.com/hpcloud/tail v1.0.0 // indirect
|
||||||
github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7
|
github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7
|
||||||
github.com/jtolds/gls v4.2.1+incompatible // indirect
|
github.com/jtolds/gls v4.2.1+incompatible // indirect
|
||||||
github.com/labstack/echo/v4 v4.1.6
|
github.com/keybase/go-keybase-chat-bot v0.0.0-20190816161829-561f10822eb2
|
||||||
github.com/lrstanley/girc v0.0.0-20190210212025-51b8e096d398
|
github.com/labstack/echo/v4 v4.1.10
|
||||||
github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5 // indirect
|
github.com/lrstanley/girc v0.0.0-20190801035559-4fc93959e1a7
|
||||||
github.com/lusis/slack-test v0.0.0-20180109053238-3c758769bfa6 // indirect
|
|
||||||
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20190210153444-cc9d05784d5d
|
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20190210153444-cc9d05784d5d
|
||||||
github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91
|
github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91
|
||||||
github.com/matterbridge/gomatrix v0.0.0-20190102230110-6f9631ca6dea
|
github.com/matterbridge/gomatrix v0.0.0-20191026211822-6fc7accd00ca
|
||||||
github.com/matterbridge/gozulipbot v0.0.0-20190212232658-7aa251978a18
|
github.com/matterbridge/gozulipbot v0.0.0-20190212232658-7aa251978a18
|
||||||
github.com/matterbridge/logrus-prefixed-formatter v0.0.0-20180806162718-01618749af61
|
github.com/matterbridge/logrus-prefixed-formatter v0.0.0-20180806162718-01618749af61
|
||||||
github.com/mattermost/mattermost-server v5.5.0+incompatible
|
github.com/mattermost/mattermost-server v5.5.0+incompatible
|
||||||
@@ -35,7 +35,7 @@ require (
|
|||||||
github.com/mrexodia/wray v0.0.0-20160318003008-78a2c1f284ff // indirect
|
github.com/mrexodia/wray v0.0.0-20160318003008-78a2c1f284ff // indirect
|
||||||
github.com/nelsonken/gomf v0.0.0-20180504123937-a9dd2f9deae9
|
github.com/nelsonken/gomf v0.0.0-20180504123937-a9dd2f9deae9
|
||||||
github.com/nicksnyder/go-i18n v1.4.0 // indirect
|
github.com/nicksnyder/go-i18n v1.4.0 // indirect
|
||||||
github.com/nlopes/slack v0.5.0
|
github.com/nlopes/slack v0.6.0
|
||||||
github.com/onsi/ginkgo v1.6.0 // indirect
|
github.com/onsi/ginkgo v1.6.0 // indirect
|
||||||
github.com/onsi/gomega v1.4.1 // indirect
|
github.com/onsi/gomega v1.4.1 // indirect
|
||||||
github.com/paulrosania/go-charset v0.0.0-20190326053356-55c9d7a5834c
|
github.com/paulrosania/go-charset v0.0.0-20190326053356-55c9d7a5834c
|
||||||
@@ -45,22 +45,31 @@ require (
|
|||||||
github.com/russross/blackfriday v1.5.2
|
github.com/russross/blackfriday v1.5.2
|
||||||
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca
|
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca
|
||||||
github.com/shazow/ssh-chat v0.0.0-20190125184227-81d7e1686296
|
github.com/shazow/ssh-chat v0.0.0-20190125184227-81d7e1686296
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
|
||||||
github.com/sirupsen/logrus v1.4.2
|
github.com/sirupsen/logrus v1.4.2
|
||||||
github.com/smartystreets/assertions v0.0.0-20180803164922-886ec427f6b9 // indirect
|
github.com/smartystreets/assertions v0.0.0-20180803164922-886ec427f6b9 // indirect
|
||||||
github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a // indirect
|
github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a // indirect
|
||||||
github.com/spf13/viper v1.4.0
|
github.com/spf13/viper v1.4.0
|
||||||
github.com/stretchr/testify v1.3.0
|
github.com/stretchr/testify v1.4.0
|
||||||
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
|
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
|
||||||
github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect
|
github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect
|
||||||
github.com/zfjagann/golang-ring v0.0.0-20190304061218-d34796e0a6c2
|
github.com/zfjagann/golang-ring v0.0.0-20190304061218-d34796e0a6c2
|
||||||
gitlab.com/golang-commonmark/html v0.0.0-20180917080848-cfaf75183c4a // indirect
|
gitlab.com/golang-commonmark/html v0.0.0-20180917080848-cfaf75183c4a // indirect
|
||||||
gitlab.com/golang-commonmark/linkify v0.0.0-20180917065525-c22b7bdb1179 // indirect
|
gitlab.com/golang-commonmark/linkify v0.0.0-20191026162114-a0c2df6c8f82 // indirect
|
||||||
gitlab.com/golang-commonmark/markdown v0.0.0-20181102083822-772775880e1f
|
gitlab.com/golang-commonmark/markdown v0.0.0-20181102083822-772775880e1f
|
||||||
gitlab.com/golang-commonmark/mdurl v0.0.0-20180912090424-e5bce34c34f2 // indirect
|
gitlab.com/golang-commonmark/mdurl v0.0.0-20180912090424-e5bce34c34f2 // indirect
|
||||||
gitlab.com/golang-commonmark/puny v0.0.0-20180912090636-2cd490539afe // indirect
|
gitlab.com/golang-commonmark/puny v0.0.0-20180912090636-2cd490539afe // indirect
|
||||||
gitlab.com/opennota/wd v0.0.0-20180912061657-c5d65f63c638 // indirect
|
gitlab.com/opennota/wd v0.0.0-20180912061657-c5d65f63c638 // indirect
|
||||||
golang.org/x/image v0.0.0-20190616094056-33659d3de4f5
|
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 // indirect
|
||||||
|
golang.org/x/image v0.0.0-20190902063713-cb417be4ba39
|
||||||
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 // indirect
|
||||||
|
golang.org/x/text v0.3.2 // indirect
|
||||||
gopkg.in/fsnotify.v1 v1.4.7 // indirect
|
gopkg.in/fsnotify.v1 v1.4.7 // indirect
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
|
||||||
|
gopkg.in/russross/blackfriday.v2 v2.0.0 // indirect
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
|
replace github.com/bwmarrin/discordgo v0.19.0 => github.com/matterbridge/discordgo v0.0.0-20191026232317-01823f4ebba4
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|||||||
89
go.sum
89
go.sum
@@ -8,15 +8,16 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
|
|||||||
github.com/Jeffail/gabs v1.1.1 h1:V0uzR08Hj22EX8+8QMhyI9sX2hwRu+/RJhJUmnwda/E=
|
github.com/Jeffail/gabs v1.1.1 h1:V0uzR08Hj22EX8+8QMhyI9sX2hwRu+/RJhJUmnwda/E=
|
||||||
github.com/Jeffail/gabs v1.1.1/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc=
|
github.com/Jeffail/gabs v1.1.1/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc=
|
||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||||
github.com/Philipp15b/go-steam v1.0.1-0.20180818081528-681bd9573329 h1:xZBoq249G9MSt+XuY7sVQzcfONJ6IQuwpCK+KAaOpnY=
|
github.com/Philipp15b/go-steam v1.0.1-0.20190816133340-b04c5a83c1c0 h1:TO7d4rocnNFng6ZQrPe7U6WqHtK5eHEMrgrnnM/72IQ=
|
||||||
github.com/Philipp15b/go-steam v1.0.1-0.20180818081528-681bd9573329/go.mod h1:HuVM+sZFzumUdKPWiz+IlCMb4RdsKdT3T+nQBKL+sYg=
|
github.com/Philipp15b/go-steam v1.0.1-0.20190816133340-b04c5a83c1c0/go.mod h1:HuVM+sZFzumUdKPWiz+IlCMb4RdsKdT3T+nQBKL+sYg=
|
||||||
github.com/Rhymen/go-whatsapp v0.0.0/go.mod h1:rdQr95g2C1xcOfM7QGOhza58HeI3I+tZ/bbluv7VazA=
|
github.com/Rhymen/go-whatsapp v0.0.0/go.mod h1:rdQr95g2C1xcOfM7QGOhza58HeI3I+tZ/bbluv7VazA=
|
||||||
github.com/Rhymen/go-whatsapp v0.0.2 h1:MelwdquHuuNObBGV7CpXbky2aVdilx/CwiXMwZvS74U=
|
github.com/Rhymen/go-whatsapp v0.0.3-0.20191003184814-fc3f792c814c h1:+yAllLxP+WjpuVVE1WNm0/Oigbeob9+liYEyk/v4nj8=
|
||||||
github.com/Rhymen/go-whatsapp v0.0.2/go.mod h1:qf/2PQi82Okxw/igghu/oMGzTeUYuKBq1JNo3tdQyNg=
|
github.com/Rhymen/go-whatsapp v0.0.3-0.20191003184814-fc3f792c814c/go.mod h1:qf/2PQi82Okxw/igghu/oMGzTeUYuKBq1JNo3tdQyNg=
|
||||||
github.com/Rhymen/go-whatsapp/examples/echo v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:zgCiQtBtZ4P4gFWvwl9aashsdwOcbb/EHOGRmSzM8ME=
|
github.com/Rhymen/go-whatsapp/examples/echo v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:zgCiQtBtZ4P4gFWvwl9aashsdwOcbb/EHOGRmSzM8ME=
|
||||||
github.com/Rhymen/go-whatsapp/examples/restoreSession v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:5sCUSpG616ZoSJhlt9iBNI/KXBqrVLcNUJqg7J9+8pU=
|
github.com/Rhymen/go-whatsapp/examples/restoreSession v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:5sCUSpG616ZoSJhlt9iBNI/KXBqrVLcNUJqg7J9+8pU=
|
||||||
github.com/Rhymen/go-whatsapp/examples/sendImage v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:RdiyhanVEGXTam+mZ3k6Y3VDCCvXYCwReOoxGozqhHw=
|
github.com/Rhymen/go-whatsapp/examples/sendImage v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:RdiyhanVEGXTam+mZ3k6Y3VDCCvXYCwReOoxGozqhHw=
|
||||||
github.com/Rhymen/go-whatsapp/examples/sendTextMessages v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:suwzklatySS3Q0+NCxCDh5hYfgXdQUWU1DNcxwAxStM=
|
github.com/Rhymen/go-whatsapp/examples/sendTextMessages v0.0.0-20190325075644-cc2581bbf24d/go.mod h1:suwzklatySS3Q0+NCxCDh5hYfgXdQUWU1DNcxwAxStM=
|
||||||
|
github.com/StackExchange/wmi v0.0.0-20170410192909-ea383cf3ba6e h1:IHXQQIpxASe3m0Jtcd3XongL+lxHNd5nUmvHxJARUmg=
|
||||||
github.com/StackExchange/wmi v0.0.0-20170410192909-ea383cf3ba6e/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
github.com/StackExchange/wmi v0.0.0-20170410192909-ea383cf3ba6e/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
@@ -24,8 +25,6 @@ github.com/alexcesaro/log v0.0.0-20150915221235-61e686294e58/go.mod h1:YNfsMyWSs
|
|||||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
github.com/bwmarrin/discordgo v0.19.0 h1:kMED/DB0NR1QhRcalb85w0Cu3Ep2OrGAqZH1R5awQiY=
|
|
||||||
github.com/bwmarrin/discordgo v0.19.0/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q=
|
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||||
@@ -33,8 +32,8 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc
|
|||||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||||
github.com/d5/tengo v1.24.1 h1:b+epGF5Qi0XUkYUUl8y6hVzLxg/eu9FYUAdb4H/KieY=
|
github.com/d5/tengo v1.24.8 h1:PRJ+NWt7ae/9sSbIfThOBTkPSvNV+dwYoBAvwfNgNJY=
|
||||||
github.com/d5/tengo v1.24.1/go.mod h1:gsbjo7lBXzBIWBd6NQp1lRKqqiDDANqBOyhW8rTlFsY=
|
github.com/d5/tengo v1.24.8/go.mod h1:VhLq8Q2QFhCIJO3NhvM934qOThykMqJi9y9Siqd1ocQ=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
@@ -49,6 +48,7 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME
|
|||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
|
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
|
||||||
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
|
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.5-0.20181225215658-ec221ba9ea45+incompatible h1:i64CCJcSqkRIkm5OSdZQjZq84/gJsk2zNwHWIRYWlKE=
|
github.com/go-telegram-bot-api/telegram-bot-api v4.6.5-0.20181225215658-ec221ba9ea45+incompatible h1:i64CCJcSqkRIkm5OSdZQjZq84/gJsk2zNwHWIRYWlKE=
|
||||||
@@ -73,13 +73,16 @@ github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f h1:FDM3EtwZLyhW4
|
|||||||
github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/gorilla/schema v1.1.0 h1:CamqUDOFUBqzrvxuz2vEwo8+SUdwsluFh7IlzJh30LY=
|
github.com/gorilla/schema v1.1.0 h1:CamqUDOFUBqzrvxuz2vEwo8+SUdwsluFh7IlzJh30LY=
|
||||||
github.com/gorilla/schema v1.1.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU=
|
github.com/gorilla/schema v1.1.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU=
|
||||||
|
github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||||
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
|
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
|
||||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||||
|
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
|
||||||
|
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||||
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
|
github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk=
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs=
|
github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs=
|
||||||
@@ -94,6 +97,8 @@ github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVY
|
|||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1 h1:PJPDf8OUfOK1bb/NeTKd4f1QXZItOX389VN3B6qC8ro=
|
github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1 h1:PJPDf8OUfOK1bb/NeTKd4f1QXZItOX389VN3B6qC8ro=
|
||||||
github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
|
github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
|
||||||
|
github.com/keybase/go-keybase-chat-bot v0.0.0-20190816161829-561f10822eb2 h1:zacJswvfPqUSGdcBXJzKvLN/dB1UjDGDvDesMBBzoA4=
|
||||||
|
github.com/keybase/go-keybase-chat-bot v0.0.0-20190816161829-561f10822eb2/go.mod h1:vNc28YFzigVJod0j5EbuTtRIe7swx8vodh2yA4jZ2s8=
|
||||||
github.com/keybase/go-ps v0.0.0-20161005175911-668c8856d999 h1:2d+FLQbz4xRTi36DO1qYNUwfORax9XcQ0jhbO81Vago=
|
github.com/keybase/go-ps v0.0.0-20161005175911-668c8856d999 h1:2d+FLQbz4xRTi36DO1qYNUwfORax9XcQ0jhbO81Vago=
|
||||||
github.com/keybase/go-ps v0.0.0-20161005175911-668c8856d999/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ=
|
github.com/keybase/go-ps v0.0.0-20161005175911-668c8856d999/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ=
|
||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||||
@@ -106,24 +111,22 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
|
|||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/labstack/echo/v4 v4.1.6 h1:WOvLa4T1KzWCRpANwz0HGgWDelXSSGwIKtKBbFdHTv4=
|
github.com/labstack/echo/v4 v4.1.10 h1:/yhIpO50CBInUbE/nHJtGIyhBv0dJe2cDAYxc3V3uMo=
|
||||||
github.com/labstack/echo/v4 v4.1.6/go.mod h1:kU/7PwzgNxZH4das4XNsSpBSOD09XIF5YEPzjpkGnGE=
|
github.com/labstack/echo/v4 v4.1.10/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g=
|
||||||
github.com/labstack/gommon v0.2.9 h1:heVeuAYtevIQVYkGj6A41dtfT91LrvFG220lavpWhrU=
|
github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0=
|
||||||
github.com/labstack/gommon v0.2.9/go.mod h1:E8ZTmW9vw5az5/ZyHWCp0Lw4OH2ecsaBP1C/NKavGG4=
|
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
|
||||||
github.com/lrstanley/girc v0.0.0-20190210212025-51b8e096d398 h1:a40kRmhA1p2XFJ6gqXfCExSyuDDCp/U9LA8ZY27u2Lk=
|
github.com/lrstanley/girc v0.0.0-20190801035559-4fc93959e1a7 h1:BS9tqL0OCiOGuy/CYYk2gc33fxqaqh5/rhqMKu4tcYA=
|
||||||
github.com/lrstanley/girc v0.0.0-20190210212025-51b8e096d398/go.mod h1:7cRs1SIBfKQ7e3Tam6GKTILSNHzR862JD0JpINaZoJk=
|
github.com/lrstanley/girc v0.0.0-20190801035559-4fc93959e1a7/go.mod h1:liX5MxHPrwgHaKowoLkYGwbXfYABh1jbZ6FpElbGF1I=
|
||||||
github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5 h1:AsEBgzv3DhuYHI/GiQh2HxvTP71HCCE9E/tzGUzGdtU=
|
|
||||||
github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5/go.mod h1:c2mYKRyMb1BPkO5St0c/ps62L4S0W2NAkaTXj9qEI+0=
|
|
||||||
github.com/lusis/slack-test v0.0.0-20180109053238-3c758769bfa6 h1:iOAVXzZyXtW408TMYejlUPo6BIn92HmOacWtIfNyYns=
|
|
||||||
github.com/lusis/slack-test v0.0.0-20180109053238-3c758769bfa6/go.mod h1:sFlOUpQL1YcjhFVXhg1CG8ZASEs/Mf1oVb6H75JL/zg=
|
|
||||||
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
|
github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
|
||||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20190210153444-cc9d05784d5d h1:F+Sr+C0ojSlYQ37BLylQtSFmyQULe3jbAygcyXQ9mVs=
|
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20190210153444-cc9d05784d5d h1:F+Sr+C0ojSlYQ37BLylQtSFmyQULe3jbAygcyXQ9mVs=
|
||||||
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20190210153444-cc9d05784d5d/go.mod h1:c6MxwqHD+0HvtAJjsHMIdPCiAwGiQwPRPTp69ACMg8A=
|
github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20190210153444-cc9d05784d5d/go.mod h1:c6MxwqHD+0HvtAJjsHMIdPCiAwGiQwPRPTp69ACMg8A=
|
||||||
|
github.com/matterbridge/discordgo v0.0.0-20191026232317-01823f4ebba4 h1:RvH3lC4bEp+bieca+Yh5xPU8tLJgnk7ridiSwMFHrrw=
|
||||||
|
github.com/matterbridge/discordgo v0.0.0-20191026232317-01823f4ebba4/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q=
|
||||||
github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91 h1:KzDEcy8eDbTx881giW8a6llsAck3e2bJvMyKvh1IK+k=
|
github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91 h1:KzDEcy8eDbTx881giW8a6llsAck3e2bJvMyKvh1IK+k=
|
||||||
github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91/go.mod h1:ECDRehsR9TYTKCAsRS8/wLeOk6UUqDydw47ln7wG41Q=
|
github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91/go.mod h1:ECDRehsR9TYTKCAsRS8/wLeOk6UUqDydw47ln7wG41Q=
|
||||||
github.com/matterbridge/gomatrix v0.0.0-20190102230110-6f9631ca6dea h1:kaADGqpK4gGO2BpzEyJrBxq2Jc57Rsar4i2EUxcACUc=
|
github.com/matterbridge/gomatrix v0.0.0-20191026211822-6fc7accd00ca h1:3ypqEpFpt6vg5Sv2xxA8/v4WiSOnWMXW7DqxTxpM4XI=
|
||||||
github.com/matterbridge/gomatrix v0.0.0-20190102230110-6f9631ca6dea/go.mod h1:+jWeaaUtXQbBRdKYWfjW6JDDYiI2XXE+3NnTjW5kg8g=
|
github.com/matterbridge/gomatrix v0.0.0-20191026211822-6fc7accd00ca/go.mod h1:+jWeaaUtXQbBRdKYWfjW6JDDYiI2XXE+3NnTjW5kg8g=
|
||||||
github.com/matterbridge/gozulipbot v0.0.0-20190212232658-7aa251978a18 h1:fLhwXtWGtfTgZVxHG1lcKjv+re7dRwyyuYFNu69xdho=
|
github.com/matterbridge/gozulipbot v0.0.0-20190212232658-7aa251978a18 h1:fLhwXtWGtfTgZVxHG1lcKjv+re7dRwyyuYFNu69xdho=
|
||||||
github.com/matterbridge/gozulipbot v0.0.0-20190212232658-7aa251978a18/go.mod h1:yAjnZ34DuDyPHMPHHjOsTk/FefW4JJjoMMCGt/8uuQA=
|
github.com/matterbridge/gozulipbot v0.0.0-20190212232658-7aa251978a18/go.mod h1:yAjnZ34DuDyPHMPHHjOsTk/FefW4JJjoMMCGt/8uuQA=
|
||||||
github.com/matterbridge/logrus-prefixed-formatter v0.0.0-20180806162718-01618749af61 h1:R/MgM/eUyRBQx2FiH6JVmXck8PaAuKfe2M1tWIzW7nE=
|
github.com/matterbridge/logrus-prefixed-formatter v0.0.0-20180806162718-01618749af61 h1:R/MgM/eUyRBQx2FiH6JVmXck8PaAuKfe2M1tWIzW7nE=
|
||||||
@@ -138,6 +141,8 @@ github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw
|
|||||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
|
github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
|
||||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
|
github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg=
|
||||||
|
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
|
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
|
||||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
|
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
|
||||||
@@ -152,8 +157,8 @@ github.com/nelsonken/gomf v0.0.0-20180504123937-a9dd2f9deae9 h1:mp6tU1r0xLostUGL
|
|||||||
github.com/nelsonken/gomf v0.0.0-20180504123937-a9dd2f9deae9/go.mod h1:A5SRAcpTemjGgIuBq6Kic2yHcoeUFWUinOAlMP/i9xo=
|
github.com/nelsonken/gomf v0.0.0-20180504123937-a9dd2f9deae9/go.mod h1:A5SRAcpTemjGgIuBq6Kic2yHcoeUFWUinOAlMP/i9xo=
|
||||||
github.com/nicksnyder/go-i18n v1.4.0 h1:AgLl+Yq7kg5OYlzCgu9cKTZOyI4tD/NgukKqLqC8E+I=
|
github.com/nicksnyder/go-i18n v1.4.0 h1:AgLl+Yq7kg5OYlzCgu9cKTZOyI4tD/NgukKqLqC8E+I=
|
||||||
github.com/nicksnyder/go-i18n v1.4.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q=
|
github.com/nicksnyder/go-i18n v1.4.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q=
|
||||||
github.com/nlopes/slack v0.5.0 h1:NbIae8Kd0NpqaEI3iUrsuS0KbcEDhzhc939jLW5fNm0=
|
github.com/nlopes/slack v0.6.0 h1:jt0jxVQGhssx1Ib7naAOZEZcGdtIhTzkP0nopK0AsRA=
|
||||||
github.com/nlopes/slack v0.5.0/go.mod h1:jVI4BBK3lSktibKahxBF74txcK2vyvkza1z/+rRnVAM=
|
github.com/nlopes/slack v0.6.0/go.mod h1:JzQ9m3PMAqcpeCam7UaHSuBuupz7CmpjehYMayT6YOk=
|
||||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||||
github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
|
github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
@@ -194,7 +199,10 @@ github.com/shazow/ssh-chat v0.0.0-20190125184227-81d7e1686296 h1:8RLq547MSVc6vhO
|
|||||||
github.com/shazow/ssh-chat v0.0.0-20190125184227-81d7e1686296/go.mod h1:1GLXsL4esywkpNId3v4QWuMf3THtWGitWvtQ/L3aSA4=
|
github.com/shazow/ssh-chat v0.0.0-20190125184227-81d7e1686296/go.mod h1:1GLXsL4esywkpNId3v4QWuMf3THtWGitWvtQ/L3aSA4=
|
||||||
github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7 h1:80VN+vGkqM773Br/uNNTSheo3KatTgV8IpjIKjvVLng=
|
github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7 h1:80VN+vGkqM773Br/uNNTSheo3KatTgV8IpjIKjvVLng=
|
||||||
github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
||||||
|
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 h1:udFKJ0aHUL60LboW/A+DfgoHVedieIzIXE8uylPue0U=
|
||||||
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
|
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
@@ -218,11 +226,9 @@ github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=
|
|||||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
|
|
||||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
|
github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
|
||||||
github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
|
github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
@@ -241,8 +247,8 @@ github.com/zfjagann/golang-ring v0.0.0-20190304061218-d34796e0a6c2 h1:UQwvu7FjUE
|
|||||||
github.com/zfjagann/golang-ring v0.0.0-20190304061218-d34796e0a6c2/go.mod h1:0MsIttMJIF/8Y7x0XjonJP7K99t3sR6bjj4m5S4JmqU=
|
github.com/zfjagann/golang-ring v0.0.0-20190304061218-d34796e0a6c2/go.mod h1:0MsIttMJIF/8Y7x0XjonJP7K99t3sR6bjj4m5S4JmqU=
|
||||||
gitlab.com/golang-commonmark/html v0.0.0-20180917080848-cfaf75183c4a h1:Ax7kdHNICZiIeFpmevmaEWb0Ae3BUj3zCTKhZHZ+zd0=
|
gitlab.com/golang-commonmark/html v0.0.0-20180917080848-cfaf75183c4a h1:Ax7kdHNICZiIeFpmevmaEWb0Ae3BUj3zCTKhZHZ+zd0=
|
||||||
gitlab.com/golang-commonmark/html v0.0.0-20180917080848-cfaf75183c4a/go.mod h1:JT4uoTz0tfPoyVH88GZoWDNm5NHJI2VbUW+eyPClueI=
|
gitlab.com/golang-commonmark/html v0.0.0-20180917080848-cfaf75183c4a/go.mod h1:JT4uoTz0tfPoyVH88GZoWDNm5NHJI2VbUW+eyPClueI=
|
||||||
gitlab.com/golang-commonmark/linkify v0.0.0-20180917065525-c22b7bdb1179 h1:rbON2KwBnWuFMlSHM8LELLlwroDRZw6xv0e6il6e5dk=
|
gitlab.com/golang-commonmark/linkify v0.0.0-20191026162114-a0c2df6c8f82 h1:oYrL81N608MLZhma3ruL8qTM4xcpYECGut8KSxRY59g=
|
||||||
gitlab.com/golang-commonmark/linkify v0.0.0-20180917065525-c22b7bdb1179/go.mod h1:Gn+LZmCrhPECMD3SOKlE+BOHwhOYD9j7WT9NUtkCrC8=
|
gitlab.com/golang-commonmark/linkify v0.0.0-20191026162114-a0c2df6c8f82/go.mod h1:Gn+LZmCrhPECMD3SOKlE+BOHwhOYD9j7WT9NUtkCrC8=
|
||||||
gitlab.com/golang-commonmark/markdown v0.0.0-20181102083822-772775880e1f h1:jwXy/CsM4xS2aoiF2fHAlukmInWhd2TlWB+HDCyvzKc=
|
gitlab.com/golang-commonmark/markdown v0.0.0-20181102083822-772775880e1f h1:jwXy/CsM4xS2aoiF2fHAlukmInWhd2TlWB+HDCyvzKc=
|
||||||
gitlab.com/golang-commonmark/markdown v0.0.0-20181102083822-772775880e1f/go.mod h1:SIHlEr9462fpIfTrVWf3GqQDxnA65Vm3BMMsUtuA6W0=
|
gitlab.com/golang-commonmark/markdown v0.0.0-20181102083822-772775880e1f/go.mod h1:SIHlEr9462fpIfTrVWf3GqQDxnA65Vm3BMMsUtuA6W0=
|
||||||
gitlab.com/golang-commonmark/mdurl v0.0.0-20180912090424-e5bce34c34f2 h1:wD/sPUgx2QJFPTyXZpJnLaROolfeKuruh06U4pRV0WY=
|
gitlab.com/golang-commonmark/mdurl v0.0.0-20180912090424-e5bce34c34f2 h1:wD/sPUgx2QJFPTyXZpJnLaROolfeKuruh06U4pRV0WY=
|
||||||
@@ -263,10 +269,11 @@ golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnf
|
|||||||
golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 h1:58fnuSXlxZmFdJyvtTFVmVhcMLU6v5fEb/ok4wyqtNU=
|
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0=
|
||||||
golang.org/x/image v0.0.0-20190616094056-33659d3de4f5 h1:ngW7cqsJcNIFizl289rKwy+nVvw7TQS8z3ejrra6syo=
|
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/image v0.0.0-20190616094056-33659d3de4f5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
golang.org/x/image v0.0.0-20190902063713-cb417be4ba39 h1:4dQcAORh9oYBwVSBVIkP489LUPC+f1HBkTYXgmqfR+o=
|
||||||
|
golang.org/x/image v0.0.0-20190902063713-cb417be4ba39/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@@ -276,15 +283,13 @@ golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73r
|
|||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
golang.org/x/net v0.0.0-20190607181551-461777fb6f67 h1:rJJxsykSlULwd2P2+pg/rtnwN2FrWp4IuCxOSyS0V00=
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA=
|
||||||
golang.org/x/net v0.0.0-20190607181551-461777fb6f67/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
|
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sys v0.0.0-20171017063910-8dbc5d05d6ed/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20171017063910-8dbc5d05d6ed/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@@ -294,9 +299,8 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ=
|
||||||
golang.org/x/sys v0.0.0-20190609082536-301114b31cce h1:CQakrGkKbydnUmt7cFIlmQ4lNQiqdTPt6xzXij4nYCc=
|
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190609082536-301114b31cce/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
@@ -306,7 +310,6 @@ golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGm
|
|||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190608022120-eacb66d2a7c3/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
@@ -321,6 +324,8 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy
|
|||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||||
|
gopkg.in/russross/blackfriday.v2 v2.0.0 h1:+FlnIV8DSQnT7NZ43hcVKcdJdzZoeCmJj4Ql8gq5keA=
|
||||||
|
gopkg.in/russross/blackfriday.v2 v2.0.0/go.mod h1:6sSBNz/GtOm/pJTuh5UmBK2ZHfmnxGbl2NZg1UliSOI=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
version = "1.15.1"
|
version = "1.16.1"
|
||||||
githash string
|
githash string
|
||||||
|
|
||||||
flagConfig = flag.String("conf", "matterbridge.toml", "config file")
|
flagConfig = flag.String("conf", "matterbridge.toml", "config file")
|
||||||
|
|||||||
@@ -522,6 +522,29 @@ StripNick=false
|
|||||||
#OPTIONAL (default false)
|
#OPTIONAL (default false)
|
||||||
ShowTopicChange=false
|
ShowTopicChange=false
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
#
|
||||||
|
# Keybase
|
||||||
|
# You should have a separate bridge account on Keybase
|
||||||
|
# (it also needs to be logged in on the system you're running the bridge on)
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
[keybase.myteam]
|
||||||
|
|
||||||
|
# RemoteNickFormat defines how remote users appear on this bridge
|
||||||
|
# See [general] config section for default options
|
||||||
|
RemoteNickFormat="{NICK} ({PROTOCOL}): "
|
||||||
|
|
||||||
|
# extra label that can be used in the RemoteNickFormat
|
||||||
|
# optional (default empty)
|
||||||
|
Label=""
|
||||||
|
|
||||||
|
# Your team on Keybase.
|
||||||
|
# The bot user MUST be a member of this team
|
||||||
|
# REQUIRED
|
||||||
|
Team="myteam"
|
||||||
|
|
||||||
###################################################################
|
###################################################################
|
||||||
#slack section
|
#slack section
|
||||||
###################################################################
|
###################################################################
|
||||||
@@ -933,6 +956,11 @@ Server="https://yourrocketchatserver.domain.com:443"
|
|||||||
#REQUIRED (when not using webhooks)
|
#REQUIRED (when not using webhooks)
|
||||||
Login="yourlogin@domain.com"
|
Login="yourlogin@domain.com"
|
||||||
Password="yourpass"
|
Password="yourpass"
|
||||||
|
# When using access token set Login to the User ID associated with your token and Token to your token.
|
||||||
|
# When Token is set Password is ignored.
|
||||||
|
# Login="yOurUSerID"
|
||||||
|
# Token="YoUrUsER_toKEN"
|
||||||
|
|
||||||
|
|
||||||
#### Settings for webhook matterbridge.
|
#### Settings for webhook matterbridge.
|
||||||
#USE DEDICATED BOT USER WHEN POSSIBLE! This allows you to use advanced features like message editing/deleting and uploads
|
#USE DEDICATED BOT USER WHEN POSSIBLE! This allows you to use advanced features like message editing/deleting and uploads
|
||||||
|
|||||||
@@ -36,6 +36,16 @@ func (m *MMClient) GetChannelHeader(channelId string) string { //nolint:golint
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getNormalisedName(channel *model.Channel) string {
|
||||||
|
if channel.Type == model.CHANNEL_GROUP {
|
||||||
|
// (deprecated in favor of ReplaceAll in go 1.12)
|
||||||
|
res := strings.Replace(channel.DisplayName, ", ", "-", -1) //nolint: gocritic
|
||||||
|
res = strings.Replace(res, " ", "_", -1) //nolint: gocritic
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
return channel.Name
|
||||||
|
}
|
||||||
|
|
||||||
func (m *MMClient) GetChannelId(name string, teamId string) string { //nolint:golint
|
func (m *MMClient) GetChannelId(name string, teamId string) string { //nolint:golint
|
||||||
m.RLock()
|
m.RLock()
|
||||||
defer m.RUnlock()
|
defer m.RUnlock()
|
||||||
@@ -45,13 +55,7 @@ func (m *MMClient) GetChannelId(name string, teamId string) string { //nolint:go
|
|||||||
|
|
||||||
for _, t := range m.OtherTeams {
|
for _, t := range m.OtherTeams {
|
||||||
for _, channel := range append(t.Channels, t.MoreChannels...) {
|
for _, channel := range append(t.Channels, t.MoreChannels...) {
|
||||||
if channel.Type == model.CHANNEL_GROUP {
|
if getNormalisedName(channel) == name {
|
||||||
res := strings.Replace(channel.DisplayName, ", ", "-", -1)
|
|
||||||
res = strings.Replace(res, " ", "_", -1)
|
|
||||||
if res == name {
|
|
||||||
return channel.Id
|
|
||||||
}
|
|
||||||
} else if channel.Name == name {
|
|
||||||
return channel.Id
|
return channel.Id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -63,7 +67,7 @@ func (m *MMClient) getChannelIdTeam(name string, teamId string) string { //nolin
|
|||||||
for _, t := range m.OtherTeams {
|
for _, t := range m.OtherTeams {
|
||||||
if t.Id == teamId {
|
if t.Id == teamId {
|
||||||
for _, channel := range append(t.Channels, t.MoreChannels...) {
|
for _, channel := range append(t.Channels, t.MoreChannels...) {
|
||||||
if channel.Name == name {
|
if getNormalisedName(channel) == name {
|
||||||
return channel.Id
|
return channel.Id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -81,12 +85,7 @@ func (m *MMClient) GetChannelName(channelId string) string { //nolint:golint
|
|||||||
}
|
}
|
||||||
for _, channel := range append(t.Channels, t.MoreChannels...) {
|
for _, channel := range append(t.Channels, t.MoreChannels...) {
|
||||||
if channel.Id == channelId {
|
if channel.Id == channelId {
|
||||||
if channel.Type == model.CHANNEL_GROUP {
|
return getNormalisedName(channel)
|
||||||
res := strings.Replace(channel.DisplayName, ", ", "-", -1)
|
|
||||||
res = strings.Replace(res, " ", "_", -1)
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
return channel.Name
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
17
vendor/github.com/Philipp15b/go-steam/README.md
generated
vendored
17
vendor/github.com/Philipp15b/go-steam/README.md
generated
vendored
@@ -45,20 +45,11 @@ Whether you want to develop your own Steam bot or directly work on go-steam itse
|
|||||||
|
|
||||||
## Updating go-steam to a new SteamKit version
|
## Updating go-steam to a new SteamKit version
|
||||||
|
|
||||||
To update go-steam to a new version of SteamKit, do the following:
|
Go source code is generated with code in the `generator` directory.
|
||||||
|
Look at `generator/README.md` for more information on how to use the generator.
|
||||||
|
|
||||||
go get github.com/golang/protobuf/protoc-gen-go/
|
Then, after generating new Go source files, update `go-steam` as necessary.
|
||||||
git submodule init && git submodule update
|
|
||||||
cd generator
|
|
||||||
go run generator.go clean proto steamlang
|
|
||||||
|
|
||||||
Make sure that `$GOPATH/bin` / `protoc-gen-go` is in your `$PATH`. You'll also need [`protoc`](https://developers.google.com/protocol-buffers/docs/downloads), the protocol buffer compiler. At the moment, we use Protocol Buffers 2.6.1 with `proco-gen-go`-[2402d76](https://github.com/golang/protobuf/tree/2402d76f3d41f928c7902a765dfc872356dd3aad).
|
|
||||||
|
|
||||||
To compile the Steam Language files, you also need the [.NET Framework](https://www.microsoft.com/net/downloads)
|
|
||||||
on Windows or [mono](http://www.go-mono.com/mono-downloads/download.html) on other operating systems.
|
|
||||||
|
|
||||||
Apply the protocol changes where necessary.
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Steam for Go is licensed under the New BSD License. More information can be found in LICENSE.txt.
|
Steam for Go is licensed under the New BSD License. More information can be found in LICENSE.txt.
|
||||||
|
|||||||
3
vendor/github.com/Philipp15b/go-steam/auth.go
generated
vendored
3
vendor/github.com/Philipp15b/go-steam/auth.go
generated
vendored
@@ -94,9 +94,6 @@ func (a *Auth) HandlePacket(packet *Packet) {
|
|||||||
a.handleUpdateMachineAuth(packet)
|
a.handleUpdateMachineAuth(packet)
|
||||||
case EMsg_ClientAccountInfo:
|
case EMsg_ClientAccountInfo:
|
||||||
a.handleAccountInfo(packet)
|
a.handleAccountInfo(packet)
|
||||||
case EMsg_ClientWalletInfoUpdate:
|
|
||||||
case EMsg_ClientRequestWebAPIAuthenticateUserNonceResponse:
|
|
||||||
case EMsg_ClientMarketingMessageUpdate:
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
6
vendor/github.com/Philipp15b/go-steam/client.go
generated
vendored
6
vendor/github.com/Philipp15b/go-steam/client.go
generated
vendored
@@ -133,11 +133,17 @@ func (c *Client) Connected() bool {
|
|||||||
// If you want to connect to a specific server, use `ConnectTo`.
|
// If you want to connect to a specific server, use `ConnectTo`.
|
||||||
func (c *Client) Connect() *netutil.PortAddr {
|
func (c *Client) Connect() *netutil.PortAddr {
|
||||||
var server *netutil.PortAddr
|
var server *netutil.PortAddr
|
||||||
|
|
||||||
|
// try to initialize the directory cache
|
||||||
|
if !steamDirectoryCache.IsInitialized() {
|
||||||
|
_ = steamDirectoryCache.Initialize()
|
||||||
|
}
|
||||||
if steamDirectoryCache.IsInitialized() {
|
if steamDirectoryCache.IsInitialized() {
|
||||||
server = steamDirectoryCache.GetRandomCM()
|
server = steamDirectoryCache.GetRandomCM()
|
||||||
} else {
|
} else {
|
||||||
server = GetRandomCM()
|
server = GetRandomCM()
|
||||||
}
|
}
|
||||||
|
|
||||||
c.ConnectTo(server)
|
c.ConnectTo(server)
|
||||||
return server
|
return server
|
||||||
}
|
}
|
||||||
|
|||||||
6
vendor/github.com/Philipp15b/go-steam/protocol/internal.go
generated
vendored
6
vendor/github.com/Philipp15b/go-steam/protocol/internal.go
generated
vendored
@@ -1,6 +1,7 @@
|
|||||||
package protocol
|
package protocol
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/hex"
|
||||||
"io"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -42,6 +43,7 @@ const EClientPersonaStateFlag_DefaultInfoRequest = EClientPersonaStateFlag_Playe
|
|||||||
|
|
||||||
const DefaultAvatar = "fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb"
|
const DefaultAvatar = "fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb"
|
||||||
|
|
||||||
func ValidAvatar(avatar string) bool {
|
func ValidAvatar(avatar []byte) bool {
|
||||||
return !(avatar == "0000000000000000000000000000000000000000" || len(avatar) != 40)
|
str := hex.EncodeToString(avatar)
|
||||||
|
return !(str == "0000000000000000000000000000000000000000" || len(str) != 40)
|
||||||
}
|
}
|
||||||
|
|||||||
75
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/app_ticket.pb.go
generated
vendored
75
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/app_ticket.pb.go
generated
vendored
@@ -1,31 +1,60 @@
|
|||||||
// Code generated by protoc-gen-go.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// source: encrypted_app_ticket.proto
|
// source: encrypted_app_ticket.proto
|
||||||
// DO NOT EDIT!
|
|
||||||
|
|
||||||
package protobuf
|
package protobuf
|
||||||
|
|
||||||
import proto "github.com/golang/protobuf/proto"
|
import (
|
||||||
import fmt "fmt"
|
fmt "fmt"
|
||||||
import math "math"
|
proto "github.com/golang/protobuf/proto"
|
||||||
|
math "math"
|
||||||
|
)
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
var _ = proto.Marshal
|
var _ = proto.Marshal
|
||||||
var _ = fmt.Errorf
|
var _ = fmt.Errorf
|
||||||
var _ = math.Inf
|
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.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package protobuf to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||||
|
|
||||||
type EncryptedAppTicket struct {
|
type EncryptedAppTicket struct {
|
||||||
TicketVersionNo *uint32 `protobuf:"varint,1,opt,name=ticket_version_no" json:"ticket_version_no,omitempty"`
|
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"`
|
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"`
|
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"`
|
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"`
|
EncryptedTicket []byte `protobuf:"bytes,5,opt,name=encrypted_ticket" json:"encrypted_ticket,omitempty"`
|
||||||
XXX_unrecognized []byte `json:"-"`
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *EncryptedAppTicket) Reset() { *m = EncryptedAppTicket{} }
|
func (m *EncryptedAppTicket) Reset() { *m = EncryptedAppTicket{} }
|
||||||
func (m *EncryptedAppTicket) String() string { return proto.CompactTextString(m) }
|
func (m *EncryptedAppTicket) String() string { return proto.CompactTextString(m) }
|
||||||
func (*EncryptedAppTicket) ProtoMessage() {}
|
func (*EncryptedAppTicket) ProtoMessage() {}
|
||||||
func (*EncryptedAppTicket) Descriptor() ([]byte, []int) { return app_ticket_fileDescriptor0, []int{0} }
|
func (*EncryptedAppTicket) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_c6d69fd1cac4e8d5, []int{0}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *EncryptedAppTicket) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_EncryptedAppTicket.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *EncryptedAppTicket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_EncryptedAppTicket.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *EncryptedAppTicket) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_EncryptedAppTicket.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *EncryptedAppTicket) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_EncryptedAppTicket.Size(m)
|
||||||
|
}
|
||||||
|
func (m *EncryptedAppTicket) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_EncryptedAppTicket.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_EncryptedAppTicket proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *EncryptedAppTicket) GetTicketVersionNo() uint32 {
|
func (m *EncryptedAppTicket) GetTicketVersionNo() uint32 {
|
||||||
if m != nil && m.TicketVersionNo != nil {
|
if m != nil && m.TicketVersionNo != nil {
|
||||||
@@ -66,17 +95,19 @@ func init() {
|
|||||||
proto.RegisterType((*EncryptedAppTicket)(nil), "EncryptedAppTicket")
|
proto.RegisterType((*EncryptedAppTicket)(nil), "EncryptedAppTicket")
|
||||||
}
|
}
|
||||||
|
|
||||||
var app_ticket_fileDescriptor0 = []byte{
|
func init() { proto.RegisterFile("encrypted_app_ticket.proto", fileDescriptor_c6d69fd1cac4e8d5) }
|
||||||
// 162 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x92, 0x4a, 0xcd, 0x4b, 0x2e,
|
var fileDescriptor_c6d69fd1cac4e8d5 = []byte{
|
||||||
|
// 164 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4a, 0xcd, 0x4b, 0x2e,
|
||||||
0xaa, 0x2c, 0x28, 0x49, 0x4d, 0x89, 0x4f, 0x2c, 0x28, 0x88, 0x2f, 0xc9, 0x4c, 0xce, 0x4e, 0x2d,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
0xf2, 0xc8, 0xb2, 0x20, 0xd7, 0xe4, 0x97, 0xe7, 0xa5, 0x16, 0x15, 0x67, 0x64, 0x16, 0x40, 0x8d,
|
||||||
0x02, 0x56, 0x28, 0xc1, 0x25, 0x80, 0x50, 0x05, 0x95, 0x61, 0x05, 0xca, 0xf0, 0x38, 0xb1, 0x7a,
|
0x61, 0x01, 0x2b, 0x94, 0xe0, 0x12, 0x40, 0xa8, 0x82, 0xca, 0xb0, 0x2a, 0x30, 0x6a, 0xf0, 0x38,
|
||||||
0x30, 0x36, 0x30, 0x32, 0x00, 0x02, 0x00, 0x00, 0xff, 0xff, 0x03, 0x8c, 0xdb, 0x92, 0xd3, 0x00,
|
0xb1, 0x7a, 0x30, 0x36, 0x30, 0x32, 0x00, 0x02, 0x00, 0x00, 0xff, 0xff, 0x03, 0x8c, 0xdb, 0x92,
|
||||||
0x00, 0x00,
|
0xd3, 0x00, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
|||||||
1036
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/base.pb.go
generated
vendored
1036
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/base.pb.go
generated
vendored
File diff suppressed because it is too large
Load Diff
9031
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_server.pb.go
generated
vendored
9031
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_server.pb.go
generated
vendored
File diff suppressed because it is too large
Load Diff
7738
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_server_2.pb.go
generated
vendored
7738
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_server_2.pb.go
generated
vendored
File diff suppressed because it is too large
Load Diff
2321
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_server_friends.pb.go
generated
vendored
Normal file
2321
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_server_friends.pb.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1294
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_server_login.pb.go
generated
vendored
Normal file
1294
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_server_login.pb.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
397
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_site_license.pb.go
generated
vendored
Normal file
397
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/client_site_license.pb.go
generated
vendored
Normal file
@@ -0,0 +1,397 @@
|
|||||||
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
|
// source: steammessages_sitelicenseclient.proto
|
||||||
|
|
||||||
|
package protobuf
|
||||||
|
|
||||||
|
import (
|
||||||
|
fmt "fmt"
|
||||||
|
proto "github.com/golang/protobuf/proto"
|
||||||
|
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.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package protobuf to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||||
|
|
||||||
|
type CMsgClientSiteInfo struct {
|
||||||
|
SiteId *uint64 `protobuf:"varint,1,opt,name=site_id" json:"site_id,omitempty"`
|
||||||
|
SiteName *string `protobuf:"bytes,2,opt,name=site_name" json:"site_name,omitempty"`
|
||||||
|
AllowCachedCredentials *bool `protobuf:"varint,3,opt,name=allow_cached_credentials" json:"allow_cached_credentials,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteInfo) Reset() { *m = CMsgClientSiteInfo{} }
|
||||||
|
func (m *CMsgClientSiteInfo) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*CMsgClientSiteInfo) ProtoMessage() {}
|
||||||
|
func (*CMsgClientSiteInfo) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_0a32817a56a37a6e, []int{0}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteInfo) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteInfo.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteInfo.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteInfo) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_CMsgClientSiteInfo.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteInfo) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteInfo.Size(m)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteInfo) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_CMsgClientSiteInfo.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_CMsgClientSiteInfo proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteInfo) GetSiteId() uint64 {
|
||||||
|
if m != nil && m.SiteId != nil {
|
||||||
|
return *m.SiteId
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteInfo) GetSiteName() string {
|
||||||
|
if m != nil && m.SiteName != nil {
|
||||||
|
return *m.SiteName
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteInfo) GetAllowCachedCredentials() bool {
|
||||||
|
if m != nil && m.AllowCachedCredentials != nil {
|
||||||
|
return *m.AllowCachedCredentials
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
type CMsgClientSiteLicenseCheckout struct {
|
||||||
|
Appid *uint32 `protobuf:"varint,1,opt,name=appid" json:"appid,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseCheckout) Reset() { *m = CMsgClientSiteLicenseCheckout{} }
|
||||||
|
func (m *CMsgClientSiteLicenseCheckout) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*CMsgClientSiteLicenseCheckout) ProtoMessage() {}
|
||||||
|
func (*CMsgClientSiteLicenseCheckout) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_0a32817a56a37a6e, []int{1}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseCheckout) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseCheckout.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseCheckout) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseCheckout.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseCheckout) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_CMsgClientSiteLicenseCheckout.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseCheckout) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseCheckout.Size(m)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseCheckout) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_CMsgClientSiteLicenseCheckout.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_CMsgClientSiteLicenseCheckout proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseCheckout) GetAppid() uint32 {
|
||||||
|
if m != nil && m.Appid != nil {
|
||||||
|
return *m.Appid
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
type CMsgClientSiteLicenseCheckoutResponse struct {
|
||||||
|
Eresult *int32 `protobuf:"varint,1,opt,name=eresult,def=2" json:"eresult,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseCheckoutResponse) Reset() { *m = CMsgClientSiteLicenseCheckoutResponse{} }
|
||||||
|
func (m *CMsgClientSiteLicenseCheckoutResponse) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*CMsgClientSiteLicenseCheckoutResponse) ProtoMessage() {}
|
||||||
|
func (*CMsgClientSiteLicenseCheckoutResponse) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_0a32817a56a37a6e, []int{2}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseCheckoutResponse) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseCheckoutResponse.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseCheckoutResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseCheckoutResponse.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseCheckoutResponse) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_CMsgClientSiteLicenseCheckoutResponse.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseCheckoutResponse) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseCheckoutResponse.Size(m)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseCheckoutResponse) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_CMsgClientSiteLicenseCheckoutResponse.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_CMsgClientSiteLicenseCheckoutResponse proto.InternalMessageInfo
|
||||||
|
|
||||||
|
const Default_CMsgClientSiteLicenseCheckoutResponse_Eresult int32 = 2
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseCheckoutResponse) GetEresult() int32 {
|
||||||
|
if m != nil && m.Eresult != nil {
|
||||||
|
return *m.Eresult
|
||||||
|
}
|
||||||
|
return Default_CMsgClientSiteLicenseCheckoutResponse_Eresult
|
||||||
|
}
|
||||||
|
|
||||||
|
type CMsgClientSiteLicenseGetAvailableSeats struct {
|
||||||
|
Appid *uint32 `protobuf:"varint,1,opt,name=appid" json:"appid,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeats) Reset() {
|
||||||
|
*m = CMsgClientSiteLicenseGetAvailableSeats{}
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeats) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*CMsgClientSiteLicenseGetAvailableSeats) ProtoMessage() {}
|
||||||
|
func (*CMsgClientSiteLicenseGetAvailableSeats) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_0a32817a56a37a6e, []int{3}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeats) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseGetAvailableSeats.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseGetAvailableSeats.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeats) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_CMsgClientSiteLicenseGetAvailableSeats.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeats) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseGetAvailableSeats.Size(m)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeats) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_CMsgClientSiteLicenseGetAvailableSeats.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_CMsgClientSiteLicenseGetAvailableSeats proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeats) GetAppid() uint32 {
|
||||||
|
if m != nil && m.Appid != nil {
|
||||||
|
return *m.Appid
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
type CMsgClientSiteLicenseGetAvailableSeatsResponse struct {
|
||||||
|
Eresult *int32 `protobuf:"varint,1,opt,name=eresult,def=2" json:"eresult,omitempty"`
|
||||||
|
Seats *uint32 `protobuf:"varint,2,opt,name=seats" json:"seats,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeatsResponse) Reset() {
|
||||||
|
*m = CMsgClientSiteLicenseGetAvailableSeatsResponse{}
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeatsResponse) String() string {
|
||||||
|
return proto.CompactTextString(m)
|
||||||
|
}
|
||||||
|
func (*CMsgClientSiteLicenseGetAvailableSeatsResponse) ProtoMessage() {}
|
||||||
|
func (*CMsgClientSiteLicenseGetAvailableSeatsResponse) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_0a32817a56a37a6e, []int{4}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeatsResponse) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseGetAvailableSeatsResponse.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeatsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseGetAvailableSeatsResponse.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeatsResponse) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_CMsgClientSiteLicenseGetAvailableSeatsResponse.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeatsResponse) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseGetAvailableSeatsResponse.Size(m)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeatsResponse) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_CMsgClientSiteLicenseGetAvailableSeatsResponse.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_CMsgClientSiteLicenseGetAvailableSeatsResponse proto.InternalMessageInfo
|
||||||
|
|
||||||
|
const Default_CMsgClientSiteLicenseGetAvailableSeatsResponse_Eresult int32 = 2
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeatsResponse) GetEresult() int32 {
|
||||||
|
if m != nil && m.Eresult != nil {
|
||||||
|
return *m.Eresult
|
||||||
|
}
|
||||||
|
return Default_CMsgClientSiteLicenseGetAvailableSeatsResponse_Eresult
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetAvailableSeatsResponse) GetSeats() uint32 {
|
||||||
|
if m != nil && m.Seats != nil {
|
||||||
|
return *m.Seats
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
type CMsgClientSiteLicenseGetContentCacheInfo struct {
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfo) Reset() {
|
||||||
|
*m = CMsgClientSiteLicenseGetContentCacheInfo{}
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfo) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*CMsgClientSiteLicenseGetContentCacheInfo) ProtoMessage() {}
|
||||||
|
func (*CMsgClientSiteLicenseGetContentCacheInfo) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_0a32817a56a37a6e, []int{5}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfo) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseGetContentCacheInfo.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseGetContentCacheInfo.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfo) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_CMsgClientSiteLicenseGetContentCacheInfo.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfo) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseGetContentCacheInfo.Size(m)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfo) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_CMsgClientSiteLicenseGetContentCacheInfo.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_CMsgClientSiteLicenseGetContentCacheInfo proto.InternalMessageInfo
|
||||||
|
|
||||||
|
type CMsgClientSiteLicenseGetContentCacheInfoResponse struct {
|
||||||
|
UseCache *bool `protobuf:"varint,1,opt,name=use_cache" json:"use_cache,omitempty"`
|
||||||
|
Ipv4Address *uint32 `protobuf:"varint,2,opt,name=ipv4_address" json:"ipv4_address,omitempty"`
|
||||||
|
PortNumber *uint32 `protobuf:"varint,3,opt,name=port_number" json:"port_number,omitempty"`
|
||||||
|
P2PGroup *uint32 `protobuf:"varint,4,opt,name=p2p_group" json:"p2p_group,omitempty"`
|
||||||
|
IpAddress *string `protobuf:"bytes,5,opt,name=ip_address" json:"ip_address,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfoResponse) Reset() {
|
||||||
|
*m = CMsgClientSiteLicenseGetContentCacheInfoResponse{}
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfoResponse) String() string {
|
||||||
|
return proto.CompactTextString(m)
|
||||||
|
}
|
||||||
|
func (*CMsgClientSiteLicenseGetContentCacheInfoResponse) ProtoMessage() {}
|
||||||
|
func (*CMsgClientSiteLicenseGetContentCacheInfoResponse) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_0a32817a56a37a6e, []int{6}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfoResponse) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseGetContentCacheInfoResponse.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseGetContentCacheInfoResponse.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfoResponse) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_CMsgClientSiteLicenseGetContentCacheInfoResponse.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfoResponse) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_CMsgClientSiteLicenseGetContentCacheInfoResponse.Size(m)
|
||||||
|
}
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfoResponse) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_CMsgClientSiteLicenseGetContentCacheInfoResponse.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_CMsgClientSiteLicenseGetContentCacheInfoResponse proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfoResponse) GetUseCache() bool {
|
||||||
|
if m != nil && m.UseCache != nil {
|
||||||
|
return *m.UseCache
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfoResponse) GetIpv4Address() uint32 {
|
||||||
|
if m != nil && m.Ipv4Address != nil {
|
||||||
|
return *m.Ipv4Address
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfoResponse) GetPortNumber() uint32 {
|
||||||
|
if m != nil && m.PortNumber != nil {
|
||||||
|
return *m.PortNumber
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfoResponse) GetP2PGroup() uint32 {
|
||||||
|
if m != nil && m.P2PGroup != nil {
|
||||||
|
return *m.P2PGroup
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CMsgClientSiteLicenseGetContentCacheInfoResponse) GetIpAddress() string {
|
||||||
|
if m != nil && m.IpAddress != nil {
|
||||||
|
return *m.IpAddress
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*CMsgClientSiteInfo)(nil), "CMsgClientSiteInfo")
|
||||||
|
proto.RegisterType((*CMsgClientSiteLicenseCheckout)(nil), "CMsgClientSiteLicenseCheckout")
|
||||||
|
proto.RegisterType((*CMsgClientSiteLicenseCheckoutResponse)(nil), "CMsgClientSiteLicenseCheckoutResponse")
|
||||||
|
proto.RegisterType((*CMsgClientSiteLicenseGetAvailableSeats)(nil), "CMsgClientSiteLicenseGetAvailableSeats")
|
||||||
|
proto.RegisterType((*CMsgClientSiteLicenseGetAvailableSeatsResponse)(nil), "CMsgClientSiteLicenseGetAvailableSeatsResponse")
|
||||||
|
proto.RegisterType((*CMsgClientSiteLicenseGetContentCacheInfo)(nil), "CMsgClientSiteLicenseGetContentCacheInfo")
|
||||||
|
proto.RegisterType((*CMsgClientSiteLicenseGetContentCacheInfoResponse)(nil), "CMsgClientSiteLicenseGetContentCacheInfoResponse")
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterFile("steammessages_sitelicenseclient.proto", fileDescriptor_0a32817a56a37a6e)
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileDescriptor_0a32817a56a37a6e = []byte{
|
||||||
|
// 335 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0x41, 0x4b, 0xfb, 0x40,
|
||||||
|
0x14, 0xc4, 0xff, 0xfb, 0xb7, 0xa1, 0xed, 0xd3, 0x20, 0x5d, 0x3d, 0x04, 0x41, 0x08, 0x81, 0x4a,
|
||||||
|
0xf0, 0x50, 0xa4, 0x08, 0x82, 0x9e, 0x34, 0x07, 0x15, 0xf4, 0x62, 0x6f, 0x5e, 0xc2, 0x36, 0x79,
|
||||||
|
0xb6, 0x8b, 0x9b, 0xdd, 0x25, 0x6f, 0x53, 0xaf, 0x7e, 0x0b, 0xbf, 0xae, 0x64, 0x5b, 0x0a, 0x15,
|
||||||
|
0x2d, 0xbd, 0xee, 0xce, 0x6f, 0x66, 0x98, 0x07, 0x43, 0x72, 0x28, 0xaa, 0x0a, 0x89, 0xc4, 0x0c,
|
||||||
|
0x29, 0x27, 0xe9, 0x50, 0xc9, 0x02, 0x35, 0x61, 0xa1, 0x24, 0x6a, 0x37, 0xb2, 0xb5, 0x71, 0xe6,
|
||||||
|
0x24, 0xda, 0x94, 0x4d, 0x05, 0xe1, 0xf2, 0x27, 0x79, 0x05, 0x9e, 0x3d, 0xd3, 0x2c, 0xf3, 0xea,
|
||||||
|
0x89, 0x74, 0xf8, 0xa8, 0xdf, 0x0c, 0x3f, 0x84, 0x6e, 0x6b, 0x95, 0xcb, 0x32, 0x62, 0x31, 0x4b,
|
||||||
|
0x3b, 0x7c, 0x00, 0x7d, 0xff, 0xa0, 0x45, 0x85, 0xd1, 0xff, 0x98, 0xa5, 0x7d, 0x1e, 0x43, 0x24,
|
||||||
|
0x94, 0x32, 0x1f, 0x79, 0x21, 0x8a, 0x39, 0x96, 0x79, 0x51, 0x63, 0x89, 0xda, 0x49, 0xa1, 0x28,
|
||||||
|
0xda, 0x8b, 0x59, 0xda, 0x4b, 0x46, 0x70, 0xba, 0xe9, 0xfd, 0xb4, 0xac, 0x96, 0xcd, 0xb1, 0x78,
|
||||||
|
0x37, 0x8d, 0xe3, 0x21, 0x04, 0xc2, 0xda, 0x55, 0x48, 0x98, 0xdc, 0xc0, 0x70, 0xab, 0xfe, 0x05,
|
||||||
|
0xc9, 0x1a, 0x4d, 0xc8, 0x39, 0x74, 0xb1, 0x46, 0x6a, 0x94, 0xf3, 0x64, 0x70, 0xcd, 0xc6, 0xc9,
|
||||||
|
0x15, 0x9c, 0xfd, 0x0a, 0xdf, 0xa3, 0xbb, 0x5d, 0x08, 0xa9, 0xc4, 0x54, 0xe1, 0x04, 0x85, 0xa3,
|
||||||
|
0x9f, 0xa9, 0x13, 0x18, 0xed, 0x06, 0x6e, 0x8b, 0x6f, 0x4d, 0xa9, 0x15, 0xf9, 0x71, 0xc2, 0xe4,
|
||||||
|
0x1c, 0xd2, 0xbf, 0x4c, 0x33, 0xa3, 0x1d, 0x6a, 0x97, 0xb5, 0xab, 0xb5, 0x63, 0x27, 0x5f, 0x0c,
|
||||||
|
0x2e, 0x76, 0x15, 0xaf, 0x3b, 0x0c, 0xa0, 0xdf, 0x10, 0x2e, 0xb7, 0xf7, 0x2d, 0x7a, 0xfc, 0x18,
|
||||||
|
0x0e, 0xa4, 0x5d, 0x5c, 0xe6, 0xa2, 0x2c, 0x6b, 0xa4, 0x55, 0x13, 0x7e, 0x04, 0xfb, 0xd6, 0xd4,
|
||||||
|
0x2e, 0xd7, 0x4d, 0x35, 0xc5, 0xda, 0x5f, 0x26, 0x6c, 0x69, 0x3b, 0xb6, 0xf9, 0xac, 0x36, 0x8d,
|
||||||
|
0x8d, 0x3a, 0xfe, 0x89, 0x03, 0x48, 0xbb, 0x66, 0x83, 0xf6, 0xc4, 0x77, 0xc1, 0x03, 0xfb, 0x64,
|
||||||
|
0xff, 0xbe, 0x03, 0x00, 0x00, 0xff, 0xff, 0x09, 0x2f, 0x9f, 0xe9, 0x65, 0x02, 0x00, 0x00,
|
||||||
|
}
|
||||||
407
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/content_manifest.pb.go
generated
vendored
407
vendor/github.com/Philipp15b/go-steam/protocol/protobuf/content_manifest.pb.go
generated
vendored
@@ -1,27 +1,56 @@
|
|||||||
// Code generated by protoc-gen-go.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// source: content_manifest.proto
|
// source: content_manifest.proto
|
||||||
// DO NOT EDIT!
|
|
||||||
|
|
||||||
package protobuf
|
package protobuf
|
||||||
|
|
||||||
import proto "github.com/golang/protobuf/proto"
|
import (
|
||||||
import fmt "fmt"
|
fmt "fmt"
|
||||||
import math "math"
|
proto "github.com/golang/protobuf/proto"
|
||||||
|
math "math"
|
||||||
|
)
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
var _ = proto.Marshal
|
var _ = proto.Marshal
|
||||||
var _ = fmt.Errorf
|
var _ = fmt.Errorf
|
||||||
var _ = math.Inf
|
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.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package protobuf to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||||
|
|
||||||
type ContentManifestPayload struct {
|
type ContentManifestPayload struct {
|
||||||
Mappings []*ContentManifestPayload_FileMapping `protobuf:"bytes,1,rep,name=mappings" json:"mappings,omitempty"`
|
Mappings []*ContentManifestPayload_FileMapping `protobuf:"bytes,1,rep,name=mappings" json:"mappings,omitempty"`
|
||||||
XXX_unrecognized []byte `json:"-"`
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ContentManifestPayload) Reset() { *m = ContentManifestPayload{} }
|
func (m *ContentManifestPayload) Reset() { *m = ContentManifestPayload{} }
|
||||||
func (m *ContentManifestPayload) String() string { return proto.CompactTextString(m) }
|
func (m *ContentManifestPayload) String() string { return proto.CompactTextString(m) }
|
||||||
func (*ContentManifestPayload) ProtoMessage() {}
|
func (*ContentManifestPayload) ProtoMessage() {}
|
||||||
func (*ContentManifestPayload) Descriptor() ([]byte, []int) { return content_manifest_fileDescriptor0, []int{0} }
|
func (*ContentManifestPayload) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_e3cda137a29253ba, []int{0}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentManifestPayload) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_ContentManifestPayload.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestPayload) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_ContentManifestPayload.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestPayload) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_ContentManifestPayload.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestPayload) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_ContentManifestPayload.Size(m)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestPayload) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_ContentManifestPayload.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_ContentManifestPayload proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *ContentManifestPayload) GetMappings() []*ContentManifestPayload_FileMapping {
|
func (m *ContentManifestPayload) GetMappings() []*ContentManifestPayload_FileMapping {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
@@ -31,23 +60,43 @@ func (m *ContentManifestPayload) GetMappings() []*ContentManifestPayload_FileMap
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ContentManifestPayload_FileMapping struct {
|
type ContentManifestPayload_FileMapping struct {
|
||||||
Filename *string `protobuf:"bytes,1,opt,name=filename" json:"filename,omitempty"`
|
Filename *string `protobuf:"bytes,1,opt,name=filename" json:"filename,omitempty"`
|
||||||
Size *uint64 `protobuf:"varint,2,opt,name=size" json:"size,omitempty"`
|
Size *uint64 `protobuf:"varint,2,opt,name=size" json:"size,omitempty"`
|
||||||
Flags *uint32 `protobuf:"varint,3,opt,name=flags" json:"flags,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"`
|
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"`
|
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"`
|
Chunks []*ContentManifestPayload_FileMapping_ChunkData `protobuf:"bytes,6,rep,name=chunks" json:"chunks,omitempty"`
|
||||||
Linktarget *string `protobuf:"bytes,7,opt,name=linktarget" json:"linktarget,omitempty"`
|
Linktarget *string `protobuf:"bytes,7,opt,name=linktarget" json:"linktarget,omitempty"`
|
||||||
XXX_unrecognized []byte `json:"-"`
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ContentManifestPayload_FileMapping) Reset() { *m = ContentManifestPayload_FileMapping{} }
|
func (m *ContentManifestPayload_FileMapping) Reset() { *m = ContentManifestPayload_FileMapping{} }
|
||||||
func (m *ContentManifestPayload_FileMapping) String() string { return proto.CompactTextString(m) }
|
func (m *ContentManifestPayload_FileMapping) String() string { return proto.CompactTextString(m) }
|
||||||
func (*ContentManifestPayload_FileMapping) ProtoMessage() {}
|
func (*ContentManifestPayload_FileMapping) ProtoMessage() {}
|
||||||
func (*ContentManifestPayload_FileMapping) Descriptor() ([]byte, []int) {
|
func (*ContentManifestPayload_FileMapping) Descriptor() ([]byte, []int) {
|
||||||
return content_manifest_fileDescriptor0, []int{0, 0}
|
return fileDescriptor_e3cda137a29253ba, []int{0, 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *ContentManifestPayload_FileMapping) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_ContentManifestPayload_FileMapping.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestPayload_FileMapping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_ContentManifestPayload_FileMapping.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestPayload_FileMapping) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_ContentManifestPayload_FileMapping.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestPayload_FileMapping) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_ContentManifestPayload_FileMapping.Size(m)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestPayload_FileMapping) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_ContentManifestPayload_FileMapping.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_ContentManifestPayload_FileMapping proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *ContentManifestPayload_FileMapping) GetFilename() string {
|
func (m *ContentManifestPayload_FileMapping) GetFilename() string {
|
||||||
if m != nil && m.Filename != nil {
|
if m != nil && m.Filename != nil {
|
||||||
return *m.Filename
|
return *m.Filename
|
||||||
@@ -98,12 +147,14 @@ func (m *ContentManifestPayload_FileMapping) GetLinktarget() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ContentManifestPayload_FileMapping_ChunkData struct {
|
type ContentManifestPayload_FileMapping_ChunkData struct {
|
||||||
Sha []byte `protobuf:"bytes,1,opt,name=sha" json:"sha,omitempty"`
|
Sha []byte `protobuf:"bytes,1,opt,name=sha" json:"sha,omitempty"`
|
||||||
Crc *uint32 `protobuf:"fixed32,2,opt,name=crc" json:"crc,omitempty"`
|
Crc *uint32 `protobuf:"fixed32,2,opt,name=crc" json:"crc,omitempty"`
|
||||||
Offset *uint64 `protobuf:"varint,3,opt,name=offset" json:"offset,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"`
|
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"`
|
CbCompressed *uint32 `protobuf:"varint,5,opt,name=cb_compressed" json:"cb_compressed,omitempty"`
|
||||||
XXX_unrecognized []byte `json:"-"`
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ContentManifestPayload_FileMapping_ChunkData) Reset() {
|
func (m *ContentManifestPayload_FileMapping_ChunkData) Reset() {
|
||||||
@@ -114,9 +165,27 @@ func (m *ContentManifestPayload_FileMapping_ChunkData) String() string {
|
|||||||
}
|
}
|
||||||
func (*ContentManifestPayload_FileMapping_ChunkData) ProtoMessage() {}
|
func (*ContentManifestPayload_FileMapping_ChunkData) ProtoMessage() {}
|
||||||
func (*ContentManifestPayload_FileMapping_ChunkData) Descriptor() ([]byte, []int) {
|
func (*ContentManifestPayload_FileMapping_ChunkData) Descriptor() ([]byte, []int) {
|
||||||
return content_manifest_fileDescriptor0, []int{0, 0, 0}
|
return fileDescriptor_e3cda137a29253ba, []int{0, 0, 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *ContentManifestPayload_FileMapping_ChunkData) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_ContentManifestPayload_FileMapping_ChunkData.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestPayload_FileMapping_ChunkData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_ContentManifestPayload_FileMapping_ChunkData.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestPayload_FileMapping_ChunkData) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_ContentManifestPayload_FileMapping_ChunkData.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestPayload_FileMapping_ChunkData) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_ContentManifestPayload_FileMapping_ChunkData.Size(m)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestPayload_FileMapping_ChunkData) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_ContentManifestPayload_FileMapping_ChunkData.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_ContentManifestPayload_FileMapping_ChunkData proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *ContentManifestPayload_FileMapping_ChunkData) GetSha() []byte {
|
func (m *ContentManifestPayload_FileMapping_ChunkData) GetSha() []byte {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.Sha
|
return m.Sha
|
||||||
@@ -153,22 +222,44 @@ func (m *ContentManifestPayload_FileMapping_ChunkData) GetCbCompressed() uint32
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ContentManifestMetadata struct {
|
type ContentManifestMetadata struct {
|
||||||
DepotId *uint32 `protobuf:"varint,1,opt,name=depot_id" json:"depot_id,omitempty"`
|
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"`
|
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"`
|
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"`
|
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"`
|
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"`
|
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"`
|
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"`
|
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"`
|
CrcClear *uint32 `protobuf:"varint,9,opt,name=crc_clear" json:"crc_clear,omitempty"`
|
||||||
XXX_unrecognized []byte `json:"-"`
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ContentManifestMetadata) Reset() { *m = ContentManifestMetadata{} }
|
func (m *ContentManifestMetadata) Reset() { *m = ContentManifestMetadata{} }
|
||||||
func (m *ContentManifestMetadata) String() string { return proto.CompactTextString(m) }
|
func (m *ContentManifestMetadata) String() string { return proto.CompactTextString(m) }
|
||||||
func (*ContentManifestMetadata) ProtoMessage() {}
|
func (*ContentManifestMetadata) ProtoMessage() {}
|
||||||
func (*ContentManifestMetadata) Descriptor() ([]byte, []int) { return content_manifest_fileDescriptor0, []int{1} }
|
func (*ContentManifestMetadata) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_e3cda137a29253ba, []int{1}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentManifestMetadata) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_ContentManifestMetadata.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_ContentManifestMetadata.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestMetadata) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_ContentManifestMetadata.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestMetadata) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_ContentManifestMetadata.Size(m)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestMetadata) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_ContentManifestMetadata.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_ContentManifestMetadata proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *ContentManifestMetadata) GetDepotId() uint32 {
|
func (m *ContentManifestMetadata) GetDepotId() uint32 {
|
||||||
if m != nil && m.DepotId != nil {
|
if m != nil && m.DepotId != nil {
|
||||||
@@ -234,14 +325,36 @@ func (m *ContentManifestMetadata) GetCrcClear() uint32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ContentManifestSignature struct {
|
type ContentManifestSignature struct {
|
||||||
Signature []byte `protobuf:"bytes,1,opt,name=signature" json:"signature,omitempty"`
|
Signature []byte `protobuf:"bytes,1,opt,name=signature" json:"signature,omitempty"`
|
||||||
XXX_unrecognized []byte `json:"-"`
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ContentManifestSignature) Reset() { *m = ContentManifestSignature{} }
|
func (m *ContentManifestSignature) Reset() { *m = ContentManifestSignature{} }
|
||||||
func (m *ContentManifestSignature) String() string { return proto.CompactTextString(m) }
|
func (m *ContentManifestSignature) String() string { return proto.CompactTextString(m) }
|
||||||
func (*ContentManifestSignature) ProtoMessage() {}
|
func (*ContentManifestSignature) ProtoMessage() {}
|
||||||
func (*ContentManifestSignature) Descriptor() ([]byte, []int) { return content_manifest_fileDescriptor0, []int{2} }
|
func (*ContentManifestSignature) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_e3cda137a29253ba, []int{2}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentManifestSignature) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_ContentManifestSignature.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestSignature) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_ContentManifestSignature.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestSignature) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_ContentManifestSignature.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestSignature) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_ContentManifestSignature.Size(m)
|
||||||
|
}
|
||||||
|
func (m *ContentManifestSignature) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_ContentManifestSignature.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_ContentManifestSignature proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *ContentManifestSignature) GetSignature() []byte {
|
func (m *ContentManifestSignature) GetSignature() []byte {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
@@ -250,40 +363,184 @@ func (m *ContentManifestSignature) GetSignature() []byte {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ContentDeltaChunks struct {
|
||||||
|
DepotId *uint32 `protobuf:"varint,1,opt,name=depot_id" json:"depot_id,omitempty"`
|
||||||
|
ManifestIdSource *uint64 `protobuf:"varint,2,opt,name=manifest_id_source" json:"manifest_id_source,omitempty"`
|
||||||
|
ManifestIdTarget *uint64 `protobuf:"varint,3,opt,name=manifest_id_target" json:"manifest_id_target,omitempty"`
|
||||||
|
DeltaChunks []*ContentDeltaChunks_DeltaChunk `protobuf:"bytes,4,rep,name=deltaChunks" json:"deltaChunks,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentDeltaChunks) Reset() { *m = ContentDeltaChunks{} }
|
||||||
|
func (m *ContentDeltaChunks) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*ContentDeltaChunks) ProtoMessage() {}
|
||||||
|
func (*ContentDeltaChunks) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_e3cda137a29253ba, []int{3}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentDeltaChunks) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_ContentDeltaChunks.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *ContentDeltaChunks) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_ContentDeltaChunks.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *ContentDeltaChunks) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_ContentDeltaChunks.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *ContentDeltaChunks) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_ContentDeltaChunks.Size(m)
|
||||||
|
}
|
||||||
|
func (m *ContentDeltaChunks) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_ContentDeltaChunks.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_ContentDeltaChunks proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *ContentDeltaChunks) GetDepotId() uint32 {
|
||||||
|
if m != nil && m.DepotId != nil {
|
||||||
|
return *m.DepotId
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentDeltaChunks) GetManifestIdSource() uint64 {
|
||||||
|
if m != nil && m.ManifestIdSource != nil {
|
||||||
|
return *m.ManifestIdSource
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentDeltaChunks) GetManifestIdTarget() uint64 {
|
||||||
|
if m != nil && m.ManifestIdTarget != nil {
|
||||||
|
return *m.ManifestIdTarget
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentDeltaChunks) GetDeltaChunks() []*ContentDeltaChunks_DeltaChunk {
|
||||||
|
if m != nil {
|
||||||
|
return m.DeltaChunks
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type ContentDeltaChunks_DeltaChunk struct {
|
||||||
|
ShaSource []byte `protobuf:"bytes,1,opt,name=sha_source" json:"sha_source,omitempty"`
|
||||||
|
ShaTarget []byte `protobuf:"bytes,2,opt,name=sha_target" json:"sha_target,omitempty"`
|
||||||
|
SizeOriginal *uint32 `protobuf:"varint,3,opt,name=size_original" json:"size_original,omitempty"`
|
||||||
|
PatchMethod *uint32 `protobuf:"varint,4,opt,name=patch_method" json:"patch_method,omitempty"`
|
||||||
|
Chunk []byte `protobuf:"bytes,5,opt,name=chunk" json:"chunk,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentDeltaChunks_DeltaChunk) Reset() { *m = ContentDeltaChunks_DeltaChunk{} }
|
||||||
|
func (m *ContentDeltaChunks_DeltaChunk) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*ContentDeltaChunks_DeltaChunk) ProtoMessage() {}
|
||||||
|
func (*ContentDeltaChunks_DeltaChunk) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_e3cda137a29253ba, []int{3, 0}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentDeltaChunks_DeltaChunk) XXX_Unmarshal(b []byte) error {
|
||||||
|
return xxx_messageInfo_ContentDeltaChunks_DeltaChunk.Unmarshal(m, b)
|
||||||
|
}
|
||||||
|
func (m *ContentDeltaChunks_DeltaChunk) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
return xxx_messageInfo_ContentDeltaChunks_DeltaChunk.Marshal(b, m, deterministic)
|
||||||
|
}
|
||||||
|
func (m *ContentDeltaChunks_DeltaChunk) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_ContentDeltaChunks_DeltaChunk.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *ContentDeltaChunks_DeltaChunk) XXX_Size() int {
|
||||||
|
return xxx_messageInfo_ContentDeltaChunks_DeltaChunk.Size(m)
|
||||||
|
}
|
||||||
|
func (m *ContentDeltaChunks_DeltaChunk) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_ContentDeltaChunks_DeltaChunk.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_ContentDeltaChunks_DeltaChunk proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *ContentDeltaChunks_DeltaChunk) GetShaSource() []byte {
|
||||||
|
if m != nil {
|
||||||
|
return m.ShaSource
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentDeltaChunks_DeltaChunk) GetShaTarget() []byte {
|
||||||
|
if m != nil {
|
||||||
|
return m.ShaTarget
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentDeltaChunks_DeltaChunk) GetSizeOriginal() uint32 {
|
||||||
|
if m != nil && m.SizeOriginal != nil {
|
||||||
|
return *m.SizeOriginal
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentDeltaChunks_DeltaChunk) GetPatchMethod() uint32 {
|
||||||
|
if m != nil && m.PatchMethod != nil {
|
||||||
|
return *m.PatchMethod
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *ContentDeltaChunks_DeltaChunk) GetChunk() []byte {
|
||||||
|
if m != nil {
|
||||||
|
return m.Chunk
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
proto.RegisterType((*ContentManifestPayload)(nil), "ContentManifestPayload")
|
proto.RegisterType((*ContentManifestPayload)(nil), "ContentManifestPayload")
|
||||||
proto.RegisterType((*ContentManifestPayload_FileMapping)(nil), "ContentManifestPayload.FileMapping")
|
proto.RegisterType((*ContentManifestPayload_FileMapping)(nil), "ContentManifestPayload.FileMapping")
|
||||||
proto.RegisterType((*ContentManifestPayload_FileMapping_ChunkData)(nil), "ContentManifestPayload.FileMapping.ChunkData")
|
proto.RegisterType((*ContentManifestPayload_FileMapping_ChunkData)(nil), "ContentManifestPayload.FileMapping.ChunkData")
|
||||||
proto.RegisterType((*ContentManifestMetadata)(nil), "ContentManifestMetadata")
|
proto.RegisterType((*ContentManifestMetadata)(nil), "ContentManifestMetadata")
|
||||||
proto.RegisterType((*ContentManifestSignature)(nil), "ContentManifestSignature")
|
proto.RegisterType((*ContentManifestSignature)(nil), "ContentManifestSignature")
|
||||||
|
proto.RegisterType((*ContentDeltaChunks)(nil), "ContentDeltaChunks")
|
||||||
|
proto.RegisterType((*ContentDeltaChunks_DeltaChunk)(nil), "ContentDeltaChunks.DeltaChunk")
|
||||||
}
|
}
|
||||||
|
|
||||||
var content_manifest_fileDescriptor0 = []byte{
|
func init() { proto.RegisterFile("content_manifest.proto", fileDescriptor_e3cda137a29253ba) }
|
||||||
// 409 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x91, 0xbd, 0x8e, 0xd4, 0x30,
|
var fileDescriptor_e3cda137a29253ba = []byte{
|
||||||
0x14, 0x85, 0xc9, 0xfc, 0x26, 0x37, 0x09, 0x5a, 0xbc, 0xb0, 0x58, 0x43, 0x83, 0x96, 0x66, 0x9b,
|
// 508 bytes of a gzipped FileDescriptorProto
|
||||||
0x4d, 0x81, 0x44, 0x49, 0xc3, 0x22, 0x44, 0x33, 0x12, 0x12, 0x0f, 0x10, 0x5d, 0x1c, 0x27, 0x6b,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xcd, 0x8e, 0xd3, 0x30,
|
||||||
0x4d, 0x62, 0x07, 0xdb, 0x29, 0x96, 0x8a, 0x17, 0xe1, 0x0d, 0x91, 0x78, 0x05, 0x6c, 0x27, 0x99,
|
0x10, 0xc7, 0x49, 0xbf, 0x3b, 0x6d, 0x50, 0xf1, 0xb2, 0x8b, 0x55, 0x24, 0x54, 0x95, 0x4b, 0x2f,
|
||||||
0x1d, 0x8d, 0x28, 0x28, 0xcf, 0xf1, 0xb5, 0xcf, 0x77, 0x8f, 0xe1, 0x8a, 0x29, 0x69, 0xb9, 0xb4,
|
0x9b, 0x03, 0x88, 0x23, 0x17, 0x76, 0x85, 0xb8, 0x54, 0x42, 0xe2, 0x01, 0x2c, 0xd7, 0x76, 0x53,
|
||||||
0x65, 0x87, 0x52, 0xd4, 0xdc, 0xd8, 0xa2, 0xd7, 0xca, 0xaa, 0xeb, 0x3f, 0x0b, 0xb8, 0xba, 0x1b,
|
0xab, 0x89, 0x1d, 0x6c, 0xe7, 0xb0, 0x9c, 0xb8, 0xf0, 0x18, 0xbc, 0x21, 0x12, 0xaf, 0x80, 0xec,
|
||||||
0x8f, 0xf6, 0xd3, 0xc9, 0x17, 0x7c, 0x68, 0x15, 0x56, 0xe4, 0x1d, 0xc4, 0x1d, 0xf6, 0xbd, 0x90,
|
0x38, 0x4d, 0x55, 0xf6, 0xb0, 0xb7, 0xcc, 0x47, 0x3c, 0xbf, 0xf9, 0xcf, 0x1f, 0x6e, 0x98, 0x56,
|
||||||
0x8d, 0xa1, 0xd1, 0xeb, 0xe5, 0x4d, 0xfa, 0xf6, 0x4d, 0xf1, 0xef, 0xd1, 0xe2, 0x93, 0x68, 0xf9,
|
0x4e, 0x28, 0x47, 0x4a, 0xaa, 0xe4, 0x5e, 0x58, 0x97, 0x55, 0x46, 0x3b, 0xbd, 0xfe, 0xdb, 0x83,
|
||||||
0x7e, 0x9c, 0xdd, 0xfd, 0x5a, 0x40, 0x7a, 0xa2, 0xc9, 0x05, 0xc4, 0xb5, 0x93, 0x12, 0x3b, 0xee,
|
0x9b, 0xbb, 0xa6, 0xb4, 0x8d, 0x95, 0xaf, 0xf4, 0xa1, 0xd0, 0x94, 0xa3, 0x0f, 0x30, 0x29, 0x69,
|
||||||
0x9e, 0x89, 0x6e, 0x12, 0x92, 0xc1, 0xca, 0x88, 0x1f, 0x9c, 0x2e, 0x9c, 0x5a, 0x91, 0x1c, 0xd6,
|
0x55, 0x49, 0x95, 0x5b, 0x9c, 0xac, 0xfa, 0x9b, 0xd9, 0xbb, 0xb7, 0xd9, 0xe3, 0xad, 0xd9, 0x67,
|
||||||
0x75, 0x8b, 0x2e, 0x63, 0xe9, 0x64, 0x4e, 0x9e, 0x43, 0x66, 0xee, 0xb1, 0x3c, 0x5e, 0x59, 0x39,
|
0x59, 0x88, 0x6d, 0xd3, 0xbb, 0xfc, 0xdd, 0x83, 0xd9, 0x59, 0x8c, 0x16, 0x30, 0xd9, 0xcb, 0x42,
|
||||||
0x37, 0x23, 0x97, 0x90, 0x7a, 0x77, 0x5a, 0x82, 0xae, 0x83, 0xf9, 0x1e, 0x36, 0xec, 0x7e, 0x90,
|
0x28, 0x5a, 0x0a, 0x9c, 0xac, 0x92, 0xcd, 0x14, 0xcd, 0x61, 0x60, 0xe5, 0x0f, 0x81, 0x7b, 0xab,
|
||||||
0x07, 0x43, 0x37, 0x01, 0xef, 0xf6, 0x3f, 0xf0, 0x8a, 0x3b, 0x7f, 0xe3, 0x23, 0x5a, 0x24, 0x04,
|
0x64, 0x33, 0x40, 0x29, 0x0c, 0xf7, 0x05, 0xcd, 0x2d, 0xee, 0xaf, 0x92, 0x4d, 0x8a, 0x5e, 0xc2,
|
||||||
0xa0, 0x15, 0xf2, 0x60, 0x51, 0x37, 0xdc, 0xd2, 0xad, 0x47, 0xdb, 0x21, 0x24, 0x8f, 0x03, 0x29,
|
0xdc, 0x1e, 0x28, 0x39, 0xfd, 0x32, 0x58, 0x25, 0x9b, 0x39, 0xba, 0x82, 0x99, 0xcf, 0xc6, 0x25,
|
||||||
0x2c, 0x5d, 0x68, 0x80, 0xce, 0xbc, 0x60, 0x9a, 0x05, 0xe6, 0x2d, 0x79, 0x0a, 0x1b, 0x55, 0xd7,
|
0xf0, 0x30, 0x24, 0x3f, 0xc2, 0x88, 0x1d, 0x6a, 0x75, 0xb4, 0x78, 0x14, 0xf0, 0x6e, 0x9f, 0x80,
|
||||||
0xc6, 0x5d, 0x5b, 0x86, 0x1d, 0x1c, 0x1e, 0xfb, 0x56, 0x2a, 0x2d, 0x1a, 0x21, 0xb1, 0x0d, 0xcc,
|
0x97, 0xdd, 0xf9, 0x3f, 0xee, 0xa9, 0xa3, 0x08, 0x01, 0x14, 0x52, 0x1d, 0x1d, 0x35, 0xb9, 0x70,
|
||||||
0x39, 0x79, 0x01, 0xb9, 0x33, 0x99, 0xea, 0x7a, 0xcd, 0x8d, 0xe1, 0x55, 0xa0, 0xce, 0xaf, 0x7f,
|
0x78, 0xec, 0xd1, 0x96, 0x14, 0xa6, 0x5d, 0xc3, 0x0c, 0xfa, 0xf6, 0x40, 0x03, 0xf4, 0xdc, 0x07,
|
||||||
0x47, 0xf0, 0xf2, 0x8c, 0x73, 0xcf, 0x2d, 0x56, 0x3e, 0xd1, 0x75, 0x55, 0xf1, 0x5e, 0xd9, 0x52,
|
0xcc, 0xb0, 0xc0, 0x3c, 0x46, 0xcf, 0x61, 0xa4, 0xf7, 0x7b, 0x2b, 0x5c, 0x80, 0x1e, 0x78, 0x3c,
|
||||||
0x54, 0x21, 0x36, 0xd4, 0xd1, 0x88, 0xea, 0xf8, 0x6b, 0x53, 0x67, 0xfe, 0x69, 0xcd, 0xd1, 0x0a,
|
0xb6, 0x23, 0xda, 0xc8, 0x5c, 0x2a, 0x5a, 0x04, 0xe6, 0x14, 0x5d, 0x43, 0xca, 0x76, 0x84, 0xe9,
|
||||||
0x25, 0x4b, 0x2b, 0x5c, 0x4b, 0x63, 0x77, 0xaf, 0xe0, 0x72, 0xee, 0xcd, 0x94, 0x5c, 0x32, 0xfd,
|
0xb2, 0x32, 0xc2, 0x5a, 0xc1, 0x03, 0x75, 0xba, 0xfe, 0x93, 0xc0, 0xab, 0x0b, 0xce, 0xad, 0x70,
|
||||||
0xd0, 0x5b, 0x97, 0xeb, 0x71, 0x62, 0x42, 0xe1, 0xc2, 0xe1, 0x54, 0xc2, 0x1c, 0x1e, 0x41, 0xd7,
|
0x94, 0xfb, 0x89, 0x0b, 0x98, 0x70, 0x51, 0x69, 0x47, 0x24, 0x0f, 0x63, 0x83, 0x1c, 0xb9, 0xe4,
|
||||||
0xe1, 0xb5, 0x1d, 0x90, 0xf9, 0xe4, 0x84, 0x76, 0x33, 0x27, 0x0d, 0x52, 0x7c, 0x1f, 0x78, 0x39,
|
0xa7, 0xab, 0x45, 0xcd, 0xfc, 0xd3, 0x46, 0x50, 0x27, 0xb5, 0x22, 0x4e, 0x96, 0x22, 0x6a, 0xf7,
|
||||||
0x55, 0xbd, 0x3d, 0xee, 0xa6, 0xd9, 0x49, 0x46, 0x1c, 0xec, 0x67, 0x90, 0x78, 0x9b, 0xb5, 0x1c,
|
0x1a, 0xae, 0x5a, 0xdd, 0x2c, 0x11, 0x8a, 0x99, 0x87, 0xca, 0x09, 0x1e, 0x70, 0x26, 0x08, 0xc3,
|
||||||
0x35, 0x4d, 0xc2, 0xba, 0xb7, 0x40, 0xcf, 0xb6, 0xfd, 0x2a, 0x1a, 0x89, 0x76, 0xd0, 0xdc, 0x8f,
|
0x82, 0xed, 0x08, 0x97, 0xf6, 0xd8, 0x81, 0x0e, 0xc3, 0x6b, 0x4b, 0x40, 0x6d, 0xe5, 0x8c, 0x76,
|
||||||
0x9b, 0x59, 0x8c, 0x35, 0x7f, 0x58, 0x7f, 0x8e, 0x7e, 0x46, 0x4f, 0xfe, 0x06, 0x00, 0x00, 0xff,
|
0xd4, 0x4e, 0xaa, 0x95, 0xfc, 0x5e, 0x0b, 0x12, 0xa5, 0x1e, 0x9f, 0x76, 0x33, 0xec, 0x6c, 0xc6,
|
||||||
0xff, 0xc6, 0x87, 0xdb, 0xe6, 0xaf, 0x02, 0x00, 0x00,
|
0x24, 0xa4, 0x5f, 0xc0, 0xd4, 0xa7, 0x59, 0x21, 0xa8, 0xc1, 0xd3, 0xb0, 0xee, 0x2d, 0xe0, 0x8b,
|
||||||
|
0x6d, 0xbf, 0xc9, 0x5c, 0x51, 0x57, 0x1b, 0xe1, 0xdb, 0x6d, 0x1b, 0x34, 0x32, 0xaf, 0x7f, 0xf5,
|
||||||
|
0x00, 0xc5, 0xfe, 0x7b, 0x51, 0x38, 0x1a, 0xae, 0x61, 0x1f, 0x11, 0x66, 0x09, 0xa8, 0x15, 0x85,
|
||||||
|
0x48, 0x4e, 0xac, 0xae, 0x0d, 0x6b, 0x2d, 0x75, 0x51, 0x8b, 0x17, 0x6e, 0x4e, 0xf5, 0x1e, 0x66,
|
||||||
|
0xbc, 0x7b, 0x18, 0x0f, 0x82, 0x73, 0xde, 0x64, 0xff, 0xcf, 0xcc, 0xba, 0xef, 0x65, 0x05, 0xd0,
|
||||||
|
0x45, 0xde, 0x38, 0xde, 0x8c, 0x71, 0x64, 0x63, 0x8f, 0x98, 0x8b, 0xa3, 0x7a, 0x21, 0x77, 0x0d,
|
||||||
|
0xa9, 0xf7, 0x79, 0x27, 0xf7, 0xc9, 0xe1, 0x15, 0x75, 0xec, 0x40, 0x4a, 0xe1, 0x0e, 0x9a, 0x47,
|
||||||
|
0xb7, 0xa4, 0x30, 0x0c, 0x0a, 0x37, 0xde, 0xfe, 0x34, 0xfc, 0x92, 0xfc, 0x4c, 0x9e, 0xfd, 0x0b,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x92, 0x22, 0xd7, 0xb7, 0x03, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
|||||||
6106
vendor/github.com/Philipp15b/go-steam/protocol/steamlang/enums.go
generated
vendored
6106
vendor/github.com/Philipp15b/go-steam/protocol/steamlang/enums.go
generated
vendored
File diff suppressed because it is too large
Load Diff
144
vendor/github.com/Philipp15b/go-steam/protocol/steamlang/messages.go
generated
vendored
144
vendor/github.com/Philipp15b/go-steam/protocol/steamlang/messages.go
generated
vendored
@@ -723,7 +723,7 @@ func (d *MsgClientNewLoginKeyAccepted) Deserialize(r io.Reader) error {
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
MsgClientLogon_ObfuscationMask uint32 = 0xBAADF00D
|
MsgClientLogon_ObfuscationMask uint32 = 0xBAADF00D
|
||||||
MsgClientLogon_CurrentProtocol uint32 = 65579
|
MsgClientLogon_CurrentProtocol uint32 = 65580
|
||||||
MsgClientLogon_ProtocolVerMajorMask uint32 = 0xFFFF0000
|
MsgClientLogon_ProtocolVerMajorMask uint32 = 0xFFFF0000
|
||||||
MsgClientLogon_ProtocolVerMinorMask uint32 = 0xFFFF
|
MsgClientLogon_ProtocolVerMinorMask uint32 = 0xFFFF
|
||||||
MsgClientLogon_ProtocolVerMinorMinGameServers uint16 = 4
|
MsgClientLogon_ProtocolVerMinorMinGameServers uint16 = 4
|
||||||
@@ -744,7 +744,11 @@ const (
|
|||||||
MsgClientLogon_ProtocolVerMinorMinForMachineAuth uint16 = 33
|
MsgClientLogon_ProtocolVerMinorMinForMachineAuth uint16 = 33
|
||||||
MsgClientLogon_ProtocolVerMinorMinForSessionIDLastAnon uint16 = 36
|
MsgClientLogon_ProtocolVerMinorMinForSessionIDLastAnon uint16 = 36
|
||||||
MsgClientLogon_ProtocolVerMinorMinForEnhancedAppList uint16 = 40
|
MsgClientLogon_ProtocolVerMinorMinForEnhancedAppList uint16 = 40
|
||||||
|
MsgClientLogon_ProtocolVerMinorMinForSteamGuardNotificationUI uint16 = 41
|
||||||
|
MsgClientLogon_ProtocolVerMinorMinForProtoBufServiceModuleCalls uint16 = 42
|
||||||
MsgClientLogon_ProtocolVerMinorMinForGzipMultiMessages uint16 = 43
|
MsgClientLogon_ProtocolVerMinorMinForGzipMultiMessages uint16 = 43
|
||||||
|
MsgClientLogon_ProtocolVerMinorMinForNewVoiceCallAuthorize uint16 = 44
|
||||||
|
MsgClientLogon_ProtocolVerMinorMinForClientInstanceIDs uint16 = 44
|
||||||
)
|
)
|
||||||
|
|
||||||
type MsgClientLogon struct {
|
type MsgClientLogon struct {
|
||||||
@@ -1976,64 +1980,6 @@ func (d *MsgClientChatRoomInfo) Deserialize(r io.Reader) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
type MsgClientGetNumberOfCurrentPlayers struct {
|
|
||||||
GameID uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewMsgClientGetNumberOfCurrentPlayers() *MsgClientGetNumberOfCurrentPlayers {
|
|
||||||
return &MsgClientGetNumberOfCurrentPlayers{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *MsgClientGetNumberOfCurrentPlayers) GetEMsg() EMsg {
|
|
||||||
return EMsg_ClientGetNumberOfCurrentPlayers
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *MsgClientGetNumberOfCurrentPlayers) Serialize(w io.Writer) error {
|
|
||||||
var err error
|
|
||||||
err = binary.Write(w, binary.LittleEndian, d.GameID)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *MsgClientGetNumberOfCurrentPlayers) Deserialize(r io.Reader) error {
|
|
||||||
var err error
|
|
||||||
d.GameID, err = rwu.ReadUint64(r)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
type MsgClientGetNumberOfCurrentPlayersResponse struct {
|
|
||||||
Result EResult
|
|
||||||
NumPlayers uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewMsgClientGetNumberOfCurrentPlayersResponse() *MsgClientGetNumberOfCurrentPlayersResponse {
|
|
||||||
return &MsgClientGetNumberOfCurrentPlayersResponse{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *MsgClientGetNumberOfCurrentPlayersResponse) GetEMsg() EMsg {
|
|
||||||
return EMsg_ClientGetNumberOfCurrentPlayersResponse
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *MsgClientGetNumberOfCurrentPlayersResponse) Serialize(w io.Writer) error {
|
|
||||||
var err error
|
|
||||||
err = binary.Write(w, binary.LittleEndian, d.Result)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = binary.Write(w, binary.LittleEndian, d.NumPlayers)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *MsgClientGetNumberOfCurrentPlayersResponse) Deserialize(r io.Reader) error {
|
|
||||||
var err error
|
|
||||||
t0, err := rwu.ReadInt32(r)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.Result = EResult(t0)
|
|
||||||
d.NumPlayers, err = rwu.ReadUint32(r)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
type MsgClientSetIgnoreFriend struct {
|
type MsgClientSetIgnoreFriend struct {
|
||||||
MySteamId steamid.SteamId
|
MySteamId steamid.SteamId
|
||||||
SteamIdFriend steamid.SteamId
|
SteamIdFriend steamid.SteamId
|
||||||
@@ -2079,8 +2025,8 @@ func (d *MsgClientSetIgnoreFriend) Deserialize(r io.Reader) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type MsgClientSetIgnoreFriendResponse struct {
|
type MsgClientSetIgnoreFriendResponse struct {
|
||||||
Unknown uint64
|
FriendId steamid.SteamId
|
||||||
Result EResult
|
Result EResult
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMsgClientSetIgnoreFriendResponse() *MsgClientSetIgnoreFriendResponse {
|
func NewMsgClientSetIgnoreFriendResponse() *MsgClientSetIgnoreFriendResponse {
|
||||||
@@ -2093,7 +2039,7 @@ func (d *MsgClientSetIgnoreFriendResponse) GetEMsg() EMsg {
|
|||||||
|
|
||||||
func (d *MsgClientSetIgnoreFriendResponse) Serialize(w io.Writer) error {
|
func (d *MsgClientSetIgnoreFriendResponse) Serialize(w io.Writer) error {
|
||||||
var err error
|
var err error
|
||||||
err = binary.Write(w, binary.LittleEndian, d.Unknown)
|
err = binary.Write(w, binary.LittleEndian, d.FriendId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -2103,12 +2049,13 @@ func (d *MsgClientSetIgnoreFriendResponse) Serialize(w io.Writer) error {
|
|||||||
|
|
||||||
func (d *MsgClientSetIgnoreFriendResponse) Deserialize(r io.Reader) error {
|
func (d *MsgClientSetIgnoreFriendResponse) Deserialize(r io.Reader) error {
|
||||||
var err error
|
var err error
|
||||||
d.Unknown, err = rwu.ReadUint64(r)
|
t0, err := rwu.ReadUint64(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
t0, err := rwu.ReadInt32(r)
|
d.FriendId = steamid.SteamId(t0)
|
||||||
d.Result = EResult(t0)
|
t1, err := rwu.ReadInt32(r)
|
||||||
|
d.Result = EResult(t1)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2226,73 +2173,6 @@ func (d *MsgClientLogOnResponse) Deserialize(r io.Reader) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
type MsgClientSendGuestPass struct {
|
|
||||||
GiftId uint64
|
|
||||||
GiftType uint8
|
|
||||||
AccountId uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewMsgClientSendGuestPass() *MsgClientSendGuestPass {
|
|
||||||
return &MsgClientSendGuestPass{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *MsgClientSendGuestPass) GetEMsg() EMsg {
|
|
||||||
return EMsg_ClientSendGuestPass
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *MsgClientSendGuestPass) Serialize(w io.Writer) error {
|
|
||||||
var err error
|
|
||||||
err = binary.Write(w, binary.LittleEndian, d.GiftId)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = binary.Write(w, binary.LittleEndian, d.GiftType)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = binary.Write(w, binary.LittleEndian, d.AccountId)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *MsgClientSendGuestPass) Deserialize(r io.Reader) error {
|
|
||||||
var err error
|
|
||||||
d.GiftId, err = rwu.ReadUint64(r)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.GiftType, err = rwu.ReadUint8(r)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
d.AccountId, err = rwu.ReadUint32(r)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
type MsgClientSendGuestPassResponse struct {
|
|
||||||
Result EResult
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewMsgClientSendGuestPassResponse() *MsgClientSendGuestPassResponse {
|
|
||||||
return &MsgClientSendGuestPassResponse{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *MsgClientSendGuestPassResponse) GetEMsg() EMsg {
|
|
||||||
return EMsg_ClientSendGuestPassResponse
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *MsgClientSendGuestPassResponse) Serialize(w io.Writer) error {
|
|
||||||
var err error
|
|
||||||
err = binary.Write(w, binary.LittleEndian, d.Result)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *MsgClientSendGuestPassResponse) Deserialize(r io.Reader) error {
|
|
||||||
var err error
|
|
||||||
t0, err := rwu.ReadInt32(r)
|
|
||||||
d.Result = EResult(t0)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
type MsgClientServerUnavailable struct {
|
type MsgClientServerUnavailable struct {
|
||||||
JobidSent uint64
|
JobidSent uint64
|
||||||
EMsgSent uint32
|
EMsgSent uint32
|
||||||
|
|||||||
231
vendor/github.com/Philipp15b/go-steam/servers.go
generated
vendored
231
vendor/github.com/Philipp15b/go-steam/servers.go
generated
vendored
@@ -8,135 +8,116 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// CMServers contains a list of worlwide servers
|
// CMServers contains a list of worlwide servers
|
||||||
var CMServers = [][]string{
|
var CMServers = []string{
|
||||||
{ // North American Servers
|
"155.133.248.52:27018",
|
||||||
// Chicago
|
"162.254.197.40:27018",
|
||||||
"162.254.193.44:27018",
|
"162.254.197.180:27019",
|
||||||
"162.254.193.44:27019",
|
"155.133.248.50:27019",
|
||||||
"162.254.193.44:27020",
|
"162.254.197.181:27017",
|
||||||
"162.254.193.44:27021",
|
"162.254.197.42:27019",
|
||||||
"162.254.193.45:27017",
|
"162.254.197.180:27017",
|
||||||
"162.254.193.45:27018",
|
"162.254.197.181:27018",
|
||||||
"162.254.193.45:27019",
|
"162.254.197.42:27018",
|
||||||
"162.254.193.45:27021",
|
"155.133.248.50:27017",
|
||||||
"162.254.193.46:27017",
|
"155.133.248.52:27019",
|
||||||
"162.254.193.46:27018",
|
"155.133.248.51:27019",
|
||||||
"162.254.193.46:27019",
|
"155.133.248.53:27019",
|
||||||
"162.254.193.46:27020",
|
"155.133.248.51:27017",
|
||||||
"162.254.193.46:27021",
|
"155.133.248.53:27017",
|
||||||
"162.254.193.47:27019",
|
"155.133.248.52:27017",
|
||||||
"162.254.193.47:27020",
|
"155.133.248.50:27018",
|
||||||
|
"162.254.197.180:27018",
|
||||||
// Ashburn
|
"162.254.197.40:27017",
|
||||||
"208.78.164.9:27017",
|
"162.254.197.40:27019",
|
||||||
"208.78.164.9:27018",
|
"162.254.197.42:27017",
|
||||||
"208.78.164.9:27019",
|
"162.254.197.181:27019",
|
||||||
"208.78.164.10:27017",
|
"155.133.248.53:27018",
|
||||||
"208.78.164.10:27018",
|
"155.133.248.51:27018",
|
||||||
"208.78.164.10:27019",
|
"146.66.152.11:27017",
|
||||||
"208.78.164.11:27017",
|
"146.66.152.10:27019",
|
||||||
"208.78.164.11:27018",
|
"146.66.152.10:27017",
|
||||||
"208.78.164.11:27019",
|
"146.66.152.10:27018",
|
||||||
"208.78.164.12:27017",
|
"146.66.152.11:27019",
|
||||||
"208.78.164.12:27018",
|
"162.254.198.133:27017",
|
||||||
"208.78.164.12:27019",
|
"162.254.198.133:27018",
|
||||||
"208.78.164.13:27017",
|
"162.254.198.130:27019",
|
||||||
"208.78.164.13:27018",
|
"162.254.198.130:27017",
|
||||||
"208.78.164.13:27019",
|
"162.254.198.132:27018",
|
||||||
"208.78.164.14:27017",
|
"162.254.198.130:27018",
|
||||||
"208.78.164.14:27018",
|
"162.254.198.132:27017",
|
||||||
"208.78.164.14:27019",
|
"162.254.198.132:27019",
|
||||||
},
|
"162.254.198.131:27019",
|
||||||
{ // Europe Servers
|
"162.254.198.131:27017",
|
||||||
// Luxembourg
|
"146.66.152.11:27018",
|
||||||
"146.66.152.10:27017",
|
"162.254.198.131:27018",
|
||||||
"146.66.152.10:27018",
|
"162.254.198.133:27019",
|
||||||
"146.66.152.10:27019",
|
"185.25.182.77:27017",
|
||||||
"146.66.152.10:27020",
|
"185.25.182.76:27018",
|
||||||
"146.66.152.11:27017",
|
"185.25.182.76:27019",
|
||||||
"146.66.152.11:27018",
|
"185.25.182.77:27018",
|
||||||
"146.66.152.11:27019",
|
"185.25.182.76:27017",
|
||||||
"146.66.152.11:27020",
|
"185.25.182.77:27019",
|
||||||
|
"162.254.196.67:27019",
|
||||||
// Poland
|
"162.254.196.67:27018",
|
||||||
"155.133.242.8:27017",
|
"162.254.196.83:27018",
|
||||||
"155.133.242.8:27018",
|
"162.254.196.84:27018",
|
||||||
"155.133.242.8:27019",
|
"162.254.196.83:27017",
|
||||||
"155.133.242.8:27020",
|
"162.254.196.84:27017",
|
||||||
"155.133.242.9:27017",
|
"162.254.196.68:27019",
|
||||||
"155.133.242.9:27018",
|
"162.254.196.68:27017",
|
||||||
"155.133.242.9:27019",
|
"162.254.196.84:27019",
|
||||||
"155.133.242.9:27020",
|
"162.254.196.67:27017",
|
||||||
|
"162.254.196.83:27019",
|
||||||
// Vienna
|
"162.254.196.68:27018",
|
||||||
"146.66.155.8:27017",
|
"146.66.155.101:27017",
|
||||||
"146.66.155.8:27018",
|
"146.66.155.101:27018",
|
||||||
"146.66.155.8:27019",
|
"146.66.155.100:27017",
|
||||||
"146.66.155.8:27020",
|
"146.66.155.100:27018",
|
||||||
"185.25.182.10:27017",
|
"146.66.155.101:27019",
|
||||||
"185.25.182.10:27018",
|
"146.66.155.100:27019",
|
||||||
"185.25.182.10:27019",
|
"155.133.230.50:27017",
|
||||||
"185.25.182.10:27020",
|
"155.133.230.34:27018",
|
||||||
|
"155.133.230.34:27017",
|
||||||
// London
|
"155.133.230.50:27019",
|
||||||
"162.254.196.40:27017",
|
"155.133.230.34:27019",
|
||||||
"162.254.196.40:27018",
|
"155.133.230.50:27018",
|
||||||
"162.254.196.40:27019",
|
"162.254.192.100:27017",
|
||||||
"162.254.196.40:27020",
|
"162.254.192.108:27017",
|
||||||
"162.254.196.40:27021",
|
"155.133.246.68:27017",
|
||||||
"162.254.196.41:27017",
|
"155.133.246.68:27018",
|
||||||
"162.254.196.41:27018",
|
"155.133.246.68:27019",
|
||||||
"162.254.196.41:27019",
|
"155.133.246.69:27019",
|
||||||
"162.254.196.41:27020",
|
"155.133.246.69:27017",
|
||||||
"162.254.196.41:27021",
|
"155.133.246.69:27018",
|
||||||
"162.254.196.42:27017",
|
"162.254.192.108:27018",
|
||||||
"162.254.196.42:27018",
|
"162.254.192.101:27018",
|
||||||
"162.254.196.42:27019",
|
"162.254.192.101:27019",
|
||||||
"162.254.196.42:27020",
|
"162.254.192.109:27018",
|
||||||
"162.254.196.42:27021",
|
"162.254.192.100:27018",
|
||||||
"162.254.196.43:27017",
|
"162.254.192.109:27017",
|
||||||
"162.254.196.43:27018",
|
"162.254.192.109:27019",
|
||||||
"162.254.196.43:27019",
|
"162.254.192.108:27019",
|
||||||
"162.254.196.43:27020",
|
"162.254.192.101:27017",
|
||||||
"162.254.196.43:27021",
|
"162.254.192.100:27019",
|
||||||
|
"162.254.193.46:27019",
|
||||||
// Stockholm
|
"162.254.193.6:27018",
|
||||||
"185.25.180.14:27017",
|
"162.254.193.47:27018",
|
||||||
"185.25.180.14:27018",
|
"162.254.193.6:27019",
|
||||||
"185.25.180.14:27019",
|
"162.254.193.7:27018",
|
||||||
"185.25.180.14:27020",
|
"162.254.193.7:27017",
|
||||||
"185.25.180.15:27017",
|
"162.254.193.7:27019",
|
||||||
"185.25.180.15:27018",
|
"162.254.193.47:27017",
|
||||||
"185.25.180.15:27019",
|
"162.254.193.47:27019",
|
||||||
"185.25.180.15:27020",
|
"162.254.193.46:27018",
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRandomCM returns back a random server anywhere
|
// GetRandomCM returns a random server from a built-in IP list.
|
||||||
|
//
|
||||||
|
// Prefer Client.Connect(), which uses IPs from the Steam Directory,
|
||||||
|
// which is always more up-to-date.
|
||||||
func GetRandomCM() *netutil.PortAddr {
|
func GetRandomCM() *netutil.PortAddr {
|
||||||
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
|
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
servers := append(CMServers[0], CMServers[1]...)
|
addr := netutil.ParsePortAddr(CMServers[rng.Int31n(int32(len(CMServers)))])
|
||||||
addr := netutil.ParsePortAddr(servers[rng.Int31n(int32(len(servers)))])
|
|
||||||
if addr == nil {
|
|
||||||
panic("invalid address in CMServers slice")
|
|
||||||
}
|
|
||||||
return addr
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRandomNorthAmericaCM returns back a random server in north america
|
|
||||||
func GetRandomNorthAmericaCM() *netutil.PortAddr {
|
|
||||||
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
||||||
addr := netutil.ParsePortAddr(CMServers[0][rng.Int31n(int32(len(CMServers[0])))])
|
|
||||||
if addr == nil {
|
|
||||||
panic("invalid address in CMServers slice")
|
|
||||||
}
|
|
||||||
return addr
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRandomEuropeCM returns back a random server in europe
|
|
||||||
func GetRandomEuropeCM() *netutil.PortAddr {
|
|
||||||
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
||||||
addr := netutil.ParsePortAddr(CMServers[1][rng.Int31n(int32(len(CMServers[1])))])
|
|
||||||
if addr == nil {
|
if addr == nil {
|
||||||
panic("invalid address in CMServers slice")
|
panic("invalid address in CMServers slice")
|
||||||
}
|
}
|
||||||
|
|||||||
48
vendor/github.com/Philipp15b/go-steam/social.go
generated
vendored
48
vendor/github.com/Philipp15b/go-steam/social.go
generated
vendored
@@ -3,7 +3,10 @@ package steam
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/hex"
|
"io"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
. "github.com/Philipp15b/go-steam/protocol"
|
. "github.com/Philipp15b/go-steam/protocol"
|
||||||
. "github.com/Philipp15b/go-steam/protocol/protobuf"
|
. "github.com/Philipp15b/go-steam/protocol/protobuf"
|
||||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||||
@@ -11,9 +14,6 @@ import (
|
|||||||
"github.com/Philipp15b/go-steam/socialcache"
|
"github.com/Philipp15b/go-steam/socialcache"
|
||||||
. "github.com/Philipp15b/go-steam/steamid"
|
. "github.com/Philipp15b/go-steam/steamid"
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
"io"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Provides access to social aspects of Steam.
|
// Provides access to social aspects of Steam.
|
||||||
@@ -21,7 +21,7 @@ type Social struct {
|
|||||||
mutex sync.RWMutex
|
mutex sync.RWMutex
|
||||||
|
|
||||||
name string
|
name string
|
||||||
avatar string
|
avatar []byte
|
||||||
personaState EPersonaState
|
personaState EPersonaState
|
||||||
|
|
||||||
Friends *socialcache.FriendsList
|
Friends *socialcache.FriendsList
|
||||||
@@ -41,7 +41,7 @@ func newSocial(client *Client) *Social {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Gets the local user's avatar
|
// Gets the local user's avatar
|
||||||
func (s *Social) GetAvatar() string {
|
func (s *Social) GetAvatar() []byte {
|
||||||
s.mutex.RLock()
|
s.mutex.RLock()
|
||||||
defer s.mutex.RUnlock()
|
defer s.mutex.RUnlock()
|
||||||
return s.avatar
|
return s.avatar
|
||||||
@@ -156,7 +156,7 @@ func (s *Social) RequestProfileInfo(id SteamId) {
|
|||||||
|
|
||||||
// Requests all offline messages and marks them as read
|
// Requests all offline messages and marks them as read
|
||||||
func (s *Social) RequestOfflineMessages() {
|
func (s *Social) RequestOfflineMessages() {
|
||||||
s.client.Write(NewClientMsgProtobuf(EMsg_ClientFSGetFriendMessageHistoryForOfflineMessages, &CMsgClientFSGetFriendMessageHistoryForOfflineMessages{}))
|
s.client.Write(NewClientMsgProtobuf(EMsg_ClientChatGetFriendMessageHistoryForOfflineMessages, &CMsgClientChatGetFriendMessageHistoryForOfflineMessages{}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attempts to join a chat room
|
// Attempts to join a chat room
|
||||||
@@ -307,7 +307,7 @@ func (s *Social) handlePersonaState(packet *Packet) {
|
|||||||
if friend.GetPlayerName() != "" {
|
if friend.GetPlayerName() != "" {
|
||||||
s.name = friend.GetPlayerName()
|
s.name = friend.GetPlayerName()
|
||||||
}
|
}
|
||||||
avatar := hex.EncodeToString(friend.GetAvatarHash())
|
avatar := friend.GetAvatarHash()
|
||||||
if ValidAvatar(avatar) {
|
if ValidAvatar(avatar) {
|
||||||
s.avatar = avatar
|
s.avatar = avatar
|
||||||
}
|
}
|
||||||
@@ -319,7 +319,7 @@ func (s *Social) handlePersonaState(packet *Packet) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (flags & EClientPersonaStateFlag_Presence) == EClientPersonaStateFlag_Presence {
|
if (flags & EClientPersonaStateFlag_Presence) == EClientPersonaStateFlag_Presence {
|
||||||
avatar := hex.EncodeToString(friend.GetAvatarHash())
|
avatar := friend.GetAvatarHash()
|
||||||
if ValidAvatar(avatar) {
|
if ValidAvatar(avatar) {
|
||||||
s.Friends.SetAvatar(id, avatar)
|
s.Friends.SetAvatar(id, avatar)
|
||||||
}
|
}
|
||||||
@@ -338,7 +338,7 @@ func (s *Social) handlePersonaState(packet *Packet) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (flags & EClientPersonaStateFlag_Presence) == EClientPersonaStateFlag_Presence {
|
if (flags & EClientPersonaStateFlag_Presence) == EClientPersonaStateFlag_Presence {
|
||||||
avatar := hex.EncodeToString(friend.GetAvatarHash())
|
avatar := friend.GetAvatarHash()
|
||||||
if ValidAvatar(avatar) {
|
if ValidAvatar(avatar) {
|
||||||
s.Groups.SetAvatar(id, avatar)
|
s.Groups.SetAvatar(id, avatar)
|
||||||
}
|
}
|
||||||
@@ -358,7 +358,7 @@ func (s *Social) handlePersonaState(packet *Packet) {
|
|||||||
SourceSteamId: SteamId(friend.GetSteamidSource()),
|
SourceSteamId: SteamId(friend.GetSteamidSource()),
|
||||||
GameDataBlob: friend.GetGameDataBlob(),
|
GameDataBlob: friend.GetGameDataBlob(),
|
||||||
Name: friend.GetPlayerName(),
|
Name: friend.GetPlayerName(),
|
||||||
Avatar: hex.EncodeToString(friend.GetAvatarHash()),
|
Avatar: friend.GetAvatarHash(),
|
||||||
LastLogOff: friend.GetLastLogoff(),
|
LastLogOff: friend.GetLastLogoff(),
|
||||||
LastLogOn: friend.GetLastLogon(),
|
LastLogOn: friend.GetLastLogon(),
|
||||||
ClanRank: friend.GetClanRank(),
|
ClanRank: friend.GetClanRank(),
|
||||||
@@ -366,8 +366,6 @@ func (s *Social) handlePersonaState(packet *Packet) {
|
|||||||
OnlineSessionInstances: friend.GetOnlineSessionInstances(),
|
OnlineSessionInstances: friend.GetOnlineSessionInstances(),
|
||||||
PublishedSessionId: friend.GetPublishedInstanceId(),
|
PublishedSessionId: friend.GetPublishedInstanceId(),
|
||||||
PersonaSetByUser: friend.GetPersonaSetByUser(),
|
PersonaSetByUser: friend.GetPersonaSetByUser(),
|
||||||
FacebookName: friend.GetFacebookName(),
|
|
||||||
FacebookId: friend.GetFacebookId(),
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -376,10 +374,10 @@ func (s *Social) handleClanState(packet *Packet) {
|
|||||||
body := new(CMsgClientClanState)
|
body := new(CMsgClientClanState)
|
||||||
packet.ReadProtoMsg(body)
|
packet.ReadProtoMsg(body)
|
||||||
var name string
|
var name string
|
||||||
var avatar string
|
var avatar []byte
|
||||||
if body.GetNameInfo() != nil {
|
if body.GetNameInfo() != nil {
|
||||||
name = body.GetNameInfo().GetClanName()
|
name = body.GetNameInfo().GetClanName()
|
||||||
avatar = hex.EncodeToString(body.GetNameInfo().GetShaAvatar())
|
avatar = body.GetNameInfo().GetShaAvatar()
|
||||||
}
|
}
|
||||||
var totalCount, onlineCount, chattingCount, ingameCount uint32
|
var totalCount, onlineCount, chattingCount, ingameCount uint32
|
||||||
if body.GetUserCounts() != nil {
|
if body.GetUserCounts() != nil {
|
||||||
@@ -408,18 +406,13 @@ func (s *Social) handleClanState(packet *Packet) {
|
|||||||
JustPosted: announce.GetJustPosted(),
|
JustPosted: announce.GetJustPosted(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
flags := EClientPersonaStateFlag(body.GetMUnStatusFlags())
|
|
||||||
//Add stuff to group
|
//Add stuff to group
|
||||||
clanid := SteamId(body.GetSteamidClan())
|
clanid := SteamId(body.GetSteamidClan())
|
||||||
if (flags & EClientPersonaStateFlag_PlayerName) == EClientPersonaStateFlag_PlayerName {
|
if body.NameInfo != nil {
|
||||||
if name != "" {
|
info := body.NameInfo
|
||||||
s.Groups.SetName(clanid, name)
|
s.Groups.SetName(clanid, info.GetClanName())
|
||||||
}
|
s.Groups.SetAvatar(clanid, info.GetShaAvatar())
|
||||||
}
|
|
||||||
if (flags & EClientPersonaStateFlag_Presence) == EClientPersonaStateFlag_Presence {
|
|
||||||
if ValidAvatar(avatar) {
|
|
||||||
s.Groups.SetAvatar(clanid, avatar)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if body.GetUserCounts() != nil {
|
if body.GetUserCounts() != nil {
|
||||||
s.Groups.SetMemberTotalCount(clanid, totalCount)
|
s.Groups.SetMemberTotalCount(clanid, totalCount)
|
||||||
@@ -428,8 +421,7 @@ func (s *Social) handleClanState(packet *Packet) {
|
|||||||
s.Groups.SetMemberInGameCount(clanid, ingameCount)
|
s.Groups.SetMemberInGameCount(clanid, ingameCount)
|
||||||
}
|
}
|
||||||
s.client.Emit(&ClanStateEvent{
|
s.client.Emit(&ClanStateEvent{
|
||||||
ClandId: clanid,
|
ClanId: clanid,
|
||||||
StateFlags: EClientPersonaStateFlag(body.GetMUnStatusFlags()),
|
|
||||||
AccountFlags: EAccountFlags(body.GetClanAccountFlags()),
|
AccountFlags: EAccountFlags(body.GetClanAccountFlags()),
|
||||||
ClanName: name,
|
ClanName: name,
|
||||||
Avatar: avatar,
|
Avatar: avatar,
|
||||||
@@ -606,7 +598,7 @@ func (s *Social) handleProfileInfoResponse(packet *Packet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Social) handleFriendMessageHistoryResponse(packet *Packet) {
|
func (s *Social) handleFriendMessageHistoryResponse(packet *Packet) {
|
||||||
body := new(CMsgClientFSGetFriendMessageHistoryResponse)
|
body := new(CMsgClientChatGetFriendMessageHistoryResponse)
|
||||||
packet.ReadProtoMsg(body)
|
packet.ReadProtoMsg(body)
|
||||||
steamid := SteamId(body.GetSteamid())
|
steamid := SteamId(body.GetSteamid())
|
||||||
for _, message := range body.GetMessages() {
|
for _, message := range body.GetMessages() {
|
||||||
|
|||||||
12
vendor/github.com/Philipp15b/go-steam/social_events.go
generated
vendored
12
vendor/github.com/Philipp15b/go-steam/social_events.go
generated
vendored
@@ -1,9 +1,10 @@
|
|||||||
package steam
|
package steam
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||||
. "github.com/Philipp15b/go-steam/steamid"
|
. "github.com/Philipp15b/go-steam/steamid"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type FriendsListEvent struct{}
|
type FriendsListEvent struct{}
|
||||||
@@ -41,7 +42,7 @@ type PersonaStateEvent struct {
|
|||||||
SourceSteamId SteamId `json:",string"`
|
SourceSteamId SteamId `json:",string"`
|
||||||
GameDataBlob []byte
|
GameDataBlob []byte
|
||||||
Name string
|
Name string
|
||||||
Avatar string
|
Avatar []byte
|
||||||
LastLogOff uint32
|
LastLogOff uint32
|
||||||
LastLogOn uint32
|
LastLogOn uint32
|
||||||
ClanRank uint32
|
ClanRank uint32
|
||||||
@@ -49,17 +50,14 @@ type PersonaStateEvent struct {
|
|||||||
OnlineSessionInstances uint32
|
OnlineSessionInstances uint32
|
||||||
PublishedSessionId uint32
|
PublishedSessionId uint32
|
||||||
PersonaSetByUser bool
|
PersonaSetByUser bool
|
||||||
FacebookName string
|
|
||||||
FacebookId uint64 `json:",string"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fired when a clan's state has been changed
|
// Fired when a clan's state has been changed
|
||||||
type ClanStateEvent struct {
|
type ClanStateEvent struct {
|
||||||
ClandId SteamId `json:",string"`
|
ClanId SteamId `json:",string"`
|
||||||
StateFlags EClientPersonaStateFlag
|
|
||||||
AccountFlags EAccountFlags
|
AccountFlags EAccountFlags
|
||||||
ClanName string
|
ClanName string
|
||||||
Avatar string
|
Avatar []byte
|
||||||
MemberTotalCount uint32
|
MemberTotalCount uint32
|
||||||
MemberOnlineCount uint32
|
MemberOnlineCount uint32
|
||||||
MemberChattingCount uint32
|
MemberChattingCount uint32
|
||||||
|
|||||||
7
vendor/github.com/Philipp15b/go-steam/socialcache/friends.go
generated
vendored
7
vendor/github.com/Philipp15b/go-steam/socialcache/friends.go
generated
vendored
@@ -2,9 +2,10 @@ package socialcache
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"sync"
|
||||||
|
|
||||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||||
. "github.com/Philipp15b/go-steam/steamid"
|
. "github.com/Philipp15b/go-steam/steamid"
|
||||||
"sync"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Friends list is a thread safe map
|
// Friends list is a thread safe map
|
||||||
@@ -76,7 +77,7 @@ func (list *FriendsList) SetName(id SteamId, name string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (list *FriendsList) SetAvatar(id SteamId, hash string) {
|
func (list *FriendsList) SetAvatar(id SteamId, hash []byte) {
|
||||||
list.mutex.Lock()
|
list.mutex.Lock()
|
||||||
defer list.mutex.Unlock()
|
defer list.mutex.Unlock()
|
||||||
if val, ok := list.byId[id]; ok {
|
if val, ok := list.byId[id]; ok {
|
||||||
@@ -136,7 +137,7 @@ func (list *FriendsList) SetGameName(id SteamId, name string) {
|
|||||||
type Friend struct {
|
type Friend struct {
|
||||||
SteamId SteamId `json:",string"`
|
SteamId SteamId `json:",string"`
|
||||||
Name string
|
Name string
|
||||||
Avatar string
|
Avatar []byte
|
||||||
Relationship EFriendRelationship
|
Relationship EFriendRelationship
|
||||||
PersonaState EPersonaState
|
PersonaState EPersonaState
|
||||||
PersonaStateFlags EPersonaStateFlag
|
PersonaStateFlags EPersonaStateFlag
|
||||||
|
|||||||
7
vendor/github.com/Philipp15b/go-steam/socialcache/groups.go
generated
vendored
7
vendor/github.com/Philipp15b/go-steam/socialcache/groups.go
generated
vendored
@@ -2,9 +2,10 @@ package socialcache
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"sync"
|
||||||
|
|
||||||
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
. "github.com/Philipp15b/go-steam/protocol/steamlang"
|
||||||
. "github.com/Philipp15b/go-steam/steamid"
|
. "github.com/Philipp15b/go-steam/steamid"
|
||||||
"sync"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Groups list is a thread safe map
|
// Groups list is a thread safe map
|
||||||
@@ -78,7 +79,7 @@ func (list *GroupsList) SetName(id SteamId, name string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (list *GroupsList) SetAvatar(id SteamId, hash string) {
|
func (list *GroupsList) SetAvatar(id SteamId, hash []byte) {
|
||||||
list.mutex.Lock()
|
list.mutex.Lock()
|
||||||
defer list.mutex.Unlock()
|
defer list.mutex.Unlock()
|
||||||
id = id.ChatToClan()
|
id = id.ChatToClan()
|
||||||
@@ -136,7 +137,7 @@ func (list *GroupsList) SetMemberInGameCount(id SteamId, count uint32) {
|
|||||||
type Group struct {
|
type Group struct {
|
||||||
SteamId SteamId `json:",string"`
|
SteamId SteamId `json:",string"`
|
||||||
Name string
|
Name string
|
||||||
Avatar string
|
Avatar []byte
|
||||||
Relationship EClanRelationship
|
Relationship EClanRelationship
|
||||||
MemberTotalCount uint32
|
MemberTotalCount uint32
|
||||||
MemberOnlineCount uint32
|
MemberOnlineCount uint32
|
||||||
|
|||||||
10
vendor/github.com/Rhymen/go-whatsapp/README.md
generated
vendored
10
vendor/github.com/Rhymen/go-whatsapp/README.md
generated
vendored
@@ -50,17 +50,25 @@ func (myHandler) HandleImageMessage(message whatsapp.ImageMessage) {
|
|||||||
fmt.Println(message)
|
fmt.Println(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (myHandler) HandleDocumentMessage(message whatsapp.DocumentMessage) {
|
||||||
|
fmt.Println(message)
|
||||||
|
}
|
||||||
|
|
||||||
func (myHandler) HandleVideoMessage(message whatsapp.VideoMessage) {
|
func (myHandler) HandleVideoMessage(message whatsapp.VideoMessage) {
|
||||||
fmt.Println(message)
|
fmt.Println(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (myHandler) HandleAudioMessage(message whatsapp.AudioMessage){
|
||||||
|
fmt.Println(message)
|
||||||
|
}
|
||||||
|
|
||||||
func (myHandler) HandleJsonMessage(message string) {
|
func (myHandler) HandleJsonMessage(message string) {
|
||||||
fmt.Println(message)
|
fmt.Println(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
wac.AddHandler(myHandler{})
|
wac.AddHandler(myHandler{})
|
||||||
```
|
```
|
||||||
The message handlers are all optional, you don't need to implement anything but the error handler to implement the interface. The ImageMessage and VideoMessage provide a Download function to get the media data.
|
The message handlers are all optional, you don't need to implement anything but the error handler to implement the interface. The ImageMessage, VideoMessage, AudioMessage and DocumentMessage provide a Download function to get the media data.
|
||||||
|
|
||||||
### Sending text messages
|
### Sending text messages
|
||||||
```go
|
```go
|
||||||
|
|||||||
4699
vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.pb.go
generated
vendored
4699
vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.pb.go
generated
vendored
File diff suppressed because it is too large
Load Diff
389
vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.proto
generated
vendored
389
vendor/github.com/Rhymen/go-whatsapp/binary/proto/def.proto
generated
vendored
@@ -1,22 +1,94 @@
|
|||||||
syntax = "proto2";
|
syntax = "proto2";
|
||||||
package proto;
|
package proto;
|
||||||
|
|
||||||
message FingerprintData {
|
message HydratedQuickReplyButton {
|
||||||
optional string publicKey = 1;
|
optional string displayText = 1;
|
||||||
optional string identifier = 2;
|
optional string buttonId = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message CombinedFingerprint {
|
message HydratedURLButton {
|
||||||
optional uint32 version = 1;
|
optional string displayText = 1;
|
||||||
optional FingerprintData localFingerprint = 2;
|
optional string url = 2;
|
||||||
optional FingerprintData remoteFingerprint = 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
message MessageKey {
|
message HydratedCallButton {
|
||||||
optional string remoteJid = 1;
|
optional string displayText = 1;
|
||||||
optional bool fromMe = 2;
|
optional string phoneNumber = 2;
|
||||||
optional string id = 3;
|
}
|
||||||
optional string participant = 4;
|
|
||||||
|
message HydratedTemplateButton {
|
||||||
|
oneof hydratedButton {
|
||||||
|
HydratedQuickReplyButton quickReplyButton = 1;
|
||||||
|
HydratedURLButton urlButton = 2;
|
||||||
|
HydratedCallButton callButton = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
message QuickReplyButton {
|
||||||
|
optional HighlyStructuredMessage displayText = 1;
|
||||||
|
optional string buttonId = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message URLButton {
|
||||||
|
optional HighlyStructuredMessage displayText = 1;
|
||||||
|
optional HighlyStructuredMessage url = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message CallButton {
|
||||||
|
optional HighlyStructuredMessage displayText = 1;
|
||||||
|
optional HighlyStructuredMessage phoneNumber = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message TemplateButton {
|
||||||
|
oneof button {
|
||||||
|
QuickReplyButton quickReplyButton = 1;
|
||||||
|
URLButton urlButton = 2;
|
||||||
|
CallButton callButton = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
message Location {
|
||||||
|
optional double degreesLatitude = 1;
|
||||||
|
optional double degreesLongitude = 2;
|
||||||
|
optional string name = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Point {
|
||||||
|
optional double x = 3;
|
||||||
|
optional double y = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message InteractiveAnnotation {
|
||||||
|
repeated Point polygonVertices = 1;
|
||||||
|
oneof action {
|
||||||
|
Location location = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
message AdReplyInfo {
|
||||||
|
optional string advertiserName = 1;
|
||||||
|
enum AD_REPLY_INFO_MEDIATYPE {
|
||||||
|
NONE = 0;
|
||||||
|
IMAGE = 1;
|
||||||
|
VIDEO = 2;
|
||||||
|
}
|
||||||
|
optional AD_REPLY_INFO_MEDIATYPE mediaType = 2;
|
||||||
|
optional bytes jpegThumbnail = 16;
|
||||||
|
optional string caption = 17;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ContextInfo {
|
||||||
|
optional string stanzaId = 1;
|
||||||
|
optional string participant = 2;
|
||||||
|
optional Message quotedMessage = 3;
|
||||||
|
optional string remoteJid = 4;
|
||||||
|
repeated string mentionedJid = 15;
|
||||||
|
optional string conversionSource = 18;
|
||||||
|
optional bytes conversionData = 19;
|
||||||
|
optional uint32 conversionDelaySeconds = 20;
|
||||||
|
optional uint32 forwardingScore = 21;
|
||||||
|
optional bool isForwarded = 22;
|
||||||
|
optional AdReplyInfo quotedAd = 23;
|
||||||
}
|
}
|
||||||
|
|
||||||
message SenderKeyDistributionMessage {
|
message SenderKeyDistributionMessage {
|
||||||
@@ -36,10 +108,12 @@ message ImageMessage {
|
|||||||
optional bytes fileEncSha256 = 9;
|
optional bytes fileEncSha256 = 9;
|
||||||
repeated InteractiveAnnotation interactiveAnnotations = 10;
|
repeated InteractiveAnnotation interactiveAnnotations = 10;
|
||||||
optional string directPath = 11;
|
optional string directPath = 11;
|
||||||
|
optional int64 mediaKeyTimestamp = 12;
|
||||||
optional bytes jpegThumbnail = 16;
|
optional bytes jpegThumbnail = 16;
|
||||||
optional ContextInfo contextInfo = 17;
|
optional ContextInfo contextInfo = 17;
|
||||||
optional bytes firstScanSidecar = 18;
|
optional bytes firstScanSidecar = 18;
|
||||||
optional uint32 firstScanLength = 19;
|
optional uint32 firstScanLength = 19;
|
||||||
|
optional uint32 experimentGroupId = 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ContactMessage {
|
message ContactMessage {
|
||||||
@@ -66,7 +140,7 @@ message ExtendedTextMessage {
|
|||||||
optional string title = 6;
|
optional string title = 6;
|
||||||
optional fixed32 textArgb = 7;
|
optional fixed32 textArgb = 7;
|
||||||
optional fixed32 backgroundArgb = 8;
|
optional fixed32 backgroundArgb = 8;
|
||||||
enum FONTTYPE {
|
enum EXTENDED_TEXT_MESSAGE_FONTTYPE {
|
||||||
SANS_SERIF = 0;
|
SANS_SERIF = 0;
|
||||||
SERIF = 1;
|
SERIF = 1;
|
||||||
NORICAN_REGULAR = 2;
|
NORICAN_REGULAR = 2;
|
||||||
@@ -74,7 +148,12 @@ message ExtendedTextMessage {
|
|||||||
BEBASNEUE_REGULAR = 4;
|
BEBASNEUE_REGULAR = 4;
|
||||||
OSWALD_HEAVY = 5;
|
OSWALD_HEAVY = 5;
|
||||||
}
|
}
|
||||||
optional FONTTYPE font = 9;
|
optional EXTENDED_TEXT_MESSAGE_FONTTYPE font = 9;
|
||||||
|
enum EXTENDED_TEXT_MESSAGE_PREVIEWTYPE {
|
||||||
|
NONE = 0;
|
||||||
|
VIDEO = 1;
|
||||||
|
}
|
||||||
|
optional EXTENDED_TEXT_MESSAGE_PREVIEWTYPE previewType = 10;
|
||||||
optional bytes jpegThumbnail = 16;
|
optional bytes jpegThumbnail = 16;
|
||||||
optional ContextInfo contextInfo = 17;
|
optional ContextInfo contextInfo = 17;
|
||||||
}
|
}
|
||||||
@@ -90,6 +169,7 @@ message DocumentMessage {
|
|||||||
optional string fileName = 8;
|
optional string fileName = 8;
|
||||||
optional bytes fileEncSha256 = 9;
|
optional bytes fileEncSha256 = 9;
|
||||||
optional string directPath = 10;
|
optional string directPath = 10;
|
||||||
|
optional int64 mediaKeyTimestamp = 11;
|
||||||
optional bytes jpegThumbnail = 16;
|
optional bytes jpegThumbnail = 16;
|
||||||
optional ContextInfo contextInfo = 17;
|
optional ContextInfo contextInfo = 17;
|
||||||
}
|
}
|
||||||
@@ -104,6 +184,7 @@ message AudioMessage {
|
|||||||
optional bytes mediaKey = 7;
|
optional bytes mediaKey = 7;
|
||||||
optional bytes fileEncSha256 = 8;
|
optional bytes fileEncSha256 = 8;
|
||||||
optional string directPath = 9;
|
optional string directPath = 9;
|
||||||
|
optional int64 mediaKeyTimestamp = 10;
|
||||||
optional ContextInfo contextInfo = 17;
|
optional ContextInfo contextInfo = 17;
|
||||||
optional bytes streamingSidecar = 18;
|
optional bytes streamingSidecar = 18;
|
||||||
}
|
}
|
||||||
@@ -122,15 +203,16 @@ message VideoMessage {
|
|||||||
optional bytes fileEncSha256 = 11;
|
optional bytes fileEncSha256 = 11;
|
||||||
repeated InteractiveAnnotation interactiveAnnotations = 12;
|
repeated InteractiveAnnotation interactiveAnnotations = 12;
|
||||||
optional string directPath = 13;
|
optional string directPath = 13;
|
||||||
|
optional int64 mediaKeyTimestamp = 14;
|
||||||
optional bytes jpegThumbnail = 16;
|
optional bytes jpegThumbnail = 16;
|
||||||
optional ContextInfo contextInfo = 17;
|
optional ContextInfo contextInfo = 17;
|
||||||
optional bytes streamingSidecar = 18;
|
optional bytes streamingSidecar = 18;
|
||||||
enum ATTRIBUTION {
|
enum VIDEO_MESSAGE_ATTRIBUTION {
|
||||||
NONE = 0;
|
NONE = 0;
|
||||||
GIPHY = 1;
|
GIPHY = 1;
|
||||||
TENOR = 2;
|
TENOR = 2;
|
||||||
}
|
}
|
||||||
optional ATTRIBUTION gifAttribution = 19;
|
optional VIDEO_MESSAGE_ATTRIBUTION gifAttribution = 19;
|
||||||
}
|
}
|
||||||
|
|
||||||
message Call {
|
message Call {
|
||||||
@@ -144,10 +226,10 @@ message Chat {
|
|||||||
|
|
||||||
message ProtocolMessage {
|
message ProtocolMessage {
|
||||||
optional MessageKey key = 1;
|
optional MessageKey key = 1;
|
||||||
enum TYPE {
|
enum PROTOCOL_MESSAGE_TYPE {
|
||||||
REVOKE = 0;
|
REVOKE = 0;
|
||||||
}
|
}
|
||||||
optional TYPE type = 2;
|
optional PROTOCOL_MESSAGE_TYPE type = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ContactsArrayMessage {
|
message ContactsArrayMessage {
|
||||||
@@ -162,7 +244,7 @@ message HSMCurrency {
|
|||||||
}
|
}
|
||||||
|
|
||||||
message HSMDateTimeComponent {
|
message HSMDateTimeComponent {
|
||||||
enum DAYOFWEEKTYPE {
|
enum HSM_DATE_TIME_COMPONENT_DAYOFWEEKTYPE {
|
||||||
MONDAY = 1;
|
MONDAY = 1;
|
||||||
TUESDAY = 2;
|
TUESDAY = 2;
|
||||||
WEDNESDAY = 3;
|
WEDNESDAY = 3;
|
||||||
@@ -171,17 +253,17 @@ message HSMDateTimeComponent {
|
|||||||
SATURDAY = 6;
|
SATURDAY = 6;
|
||||||
SUNDAY = 7;
|
SUNDAY = 7;
|
||||||
}
|
}
|
||||||
optional DAYOFWEEKTYPE dayOfWeek = 1;
|
optional HSM_DATE_TIME_COMPONENT_DAYOFWEEKTYPE dayOfWeek = 1;
|
||||||
optional uint32 year = 2;
|
optional uint32 year = 2;
|
||||||
optional uint32 month = 3;
|
optional uint32 month = 3;
|
||||||
optional uint32 dayOfMonth = 4;
|
optional uint32 dayOfMonth = 4;
|
||||||
optional uint32 hour = 5;
|
optional uint32 hour = 5;
|
||||||
optional uint32 minute = 6;
|
optional uint32 minute = 6;
|
||||||
enum CALENDARTYPE {
|
enum HSM_DATE_TIME_COMPONENT_CALENDARTYPE {
|
||||||
GREGORIAN = 1;
|
GREGORIAN = 1;
|
||||||
SOLAR_HIJRI = 2;
|
SOLAR_HIJRI = 2;
|
||||||
}
|
}
|
||||||
optional CALENDARTYPE calendar = 7;
|
optional HSM_DATE_TIME_COMPONENT_CALENDARTYPE calendar = 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
message HSMDateTimeUnixEpoch {
|
message HSMDateTimeUnixEpoch {
|
||||||
@@ -210,17 +292,29 @@ message HighlyStructuredMessage {
|
|||||||
optional string fallbackLg = 4;
|
optional string fallbackLg = 4;
|
||||||
optional string fallbackLc = 5;
|
optional string fallbackLc = 5;
|
||||||
repeated HSMLocalizableParameter localizableParams = 6;
|
repeated HSMLocalizableParameter localizableParams = 6;
|
||||||
|
optional string deterministicLg = 7;
|
||||||
|
optional string deterministicLc = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
message SendPaymentMessage {
|
message SendPaymentMessage {
|
||||||
optional Message noteMessage = 2;
|
optional Message noteMessage = 2;
|
||||||
|
optional MessageKey requestMessageKey = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
message RequestPaymentMessage {
|
message RequestPaymentMessage {
|
||||||
|
optional Message noteMessage = 4;
|
||||||
optional string currencyCodeIso4217 = 1;
|
optional string currencyCodeIso4217 = 1;
|
||||||
optional uint64 amount1000 = 2;
|
optional uint64 amount1000 = 2;
|
||||||
optional string requestFrom = 3;
|
optional string requestFrom = 3;
|
||||||
optional Message noteMessage = 4;
|
optional int64 expiryTimestamp = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
message DeclinePaymentRequestMessage {
|
||||||
|
optional MessageKey key = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message CancelPaymentRequestMessage {
|
||||||
|
optional MessageKey key = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
message LiveLocationMessage {
|
message LiveLocationMessage {
|
||||||
@@ -231,6 +325,7 @@ message LiveLocationMessage {
|
|||||||
optional uint32 degreesClockwiseFromMagneticNorth = 5;
|
optional uint32 degreesClockwiseFromMagneticNorth = 5;
|
||||||
optional string caption = 6;
|
optional string caption = 6;
|
||||||
optional int64 sequenceNumber = 7;
|
optional int64 sequenceNumber = 7;
|
||||||
|
optional uint32 timeOffset = 8;
|
||||||
optional bytes jpegThumbnail = 16;
|
optional bytes jpegThumbnail = 16;
|
||||||
optional ContextInfo contextInfo = 17;
|
optional ContextInfo contextInfo = 17;
|
||||||
}
|
}
|
||||||
@@ -245,10 +340,77 @@ message StickerMessage {
|
|||||||
optional uint32 width = 7;
|
optional uint32 width = 7;
|
||||||
optional string directPath = 8;
|
optional string directPath = 8;
|
||||||
optional uint64 fileLength = 9;
|
optional uint64 fileLength = 9;
|
||||||
|
optional int64 mediaKeyTimestamp = 10;
|
||||||
optional bytes pngThumbnail = 16;
|
optional bytes pngThumbnail = 16;
|
||||||
optional ContextInfo contextInfo = 17;
|
optional ContextInfo contextInfo = 17;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message FourRowTemplate {
|
||||||
|
optional HighlyStructuredMessage content = 6;
|
||||||
|
optional HighlyStructuredMessage footer = 7;
|
||||||
|
repeated TemplateButton buttons = 8;
|
||||||
|
oneof title {
|
||||||
|
DocumentMessage documentMessage = 1;
|
||||||
|
HighlyStructuredMessage highlyStructuredMessage = 2;
|
||||||
|
ImageMessage imageMessage = 3;
|
||||||
|
VideoMessage videoMessage = 4;
|
||||||
|
LocationMessage locationMessage = 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
message HydratedFourRowTemplate {
|
||||||
|
optional string hydratedContentText = 6;
|
||||||
|
optional string hydratedFooterText = 7;
|
||||||
|
repeated HydratedTemplateButton hydratedButtons = 9;
|
||||||
|
oneof title {
|
||||||
|
DocumentMessage documentMessage = 1;
|
||||||
|
string hydratedTitleText = 2;
|
||||||
|
ImageMessage imageMessage = 3;
|
||||||
|
VideoMessage videoMessage = 4;
|
||||||
|
LocationMessage locationMessage = 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
message TemplateMessage {
|
||||||
|
oneof format {
|
||||||
|
FourRowTemplate fourRowTemplate = 1;
|
||||||
|
HydratedFourRowTemplate hydratedFourRowTemplate = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
message TemplateButtonReplyMessage {
|
||||||
|
optional string selectedButtonId = 1;
|
||||||
|
repeated string selectedButtonDisplayText = 2;
|
||||||
|
optional ContextInfo contextInfo = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ProductSnapshot {
|
||||||
|
optional ImageMessage productImage = 1;
|
||||||
|
optional string productId = 2;
|
||||||
|
optional string title = 3;
|
||||||
|
optional string description = 4;
|
||||||
|
optional string currencyCode = 5;
|
||||||
|
optional int64 priceAmount1000 = 6;
|
||||||
|
optional string retailerId = 7;
|
||||||
|
optional string url = 8;
|
||||||
|
optional uint32 productImageCount = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ProductMessage {
|
||||||
|
optional ProductSnapshot product = 1;
|
||||||
|
optional string businessOwnerJid = 2;
|
||||||
|
optional ContextInfo contextInfo = 17;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GroupInviteMessage {
|
||||||
|
optional string groupJid = 1;
|
||||||
|
optional string inviteCode = 2;
|
||||||
|
optional int64 inviteExpiration = 3;
|
||||||
|
optional string groupName = 4;
|
||||||
|
optional bytes jpegThumbnail = 5;
|
||||||
|
optional string caption = 6;
|
||||||
|
}
|
||||||
|
|
||||||
message Message {
|
message Message {
|
||||||
optional string conversation = 1;
|
optional string conversation = 1;
|
||||||
optional SenderKeyDistributionMessage senderKeyDistributionMessage = 2;
|
optional SenderKeyDistributionMessage senderKeyDistributionMessage = 2;
|
||||||
@@ -266,47 +428,104 @@ message Message {
|
|||||||
optional HighlyStructuredMessage highlyStructuredMessage = 14;
|
optional HighlyStructuredMessage highlyStructuredMessage = 14;
|
||||||
optional SenderKeyDistributionMessage fastRatchetKeySenderKeyDistributionMessage = 15;
|
optional SenderKeyDistributionMessage fastRatchetKeySenderKeyDistributionMessage = 15;
|
||||||
optional SendPaymentMessage sendPaymentMessage = 16;
|
optional SendPaymentMessage sendPaymentMessage = 16;
|
||||||
optional RequestPaymentMessage requestPaymentMessage = 17;
|
|
||||||
optional LiveLocationMessage liveLocationMessage = 18;
|
optional LiveLocationMessage liveLocationMessage = 18;
|
||||||
optional StickerMessage stickerMessage = 20;
|
optional RequestPaymentMessage requestPaymentMessage = 22;
|
||||||
|
optional DeclinePaymentRequestMessage declinePaymentRequestMessage = 23;
|
||||||
|
optional CancelPaymentRequestMessage cancelPaymentRequestMessage = 24;
|
||||||
|
optional TemplateMessage templateMessage = 25;
|
||||||
|
optional StickerMessage stickerMessage = 26;
|
||||||
|
optional ProductMessage productMessage = 27;
|
||||||
|
optional GroupInviteMessage groupInviteMessage = 28;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ContextInfo {
|
message MessageKey {
|
||||||
optional string stanzaId = 1;
|
optional string remoteJid = 1;
|
||||||
optional string participant = 2;
|
optional bool fromMe = 2;
|
||||||
repeated Message quotedMessage = 3;
|
optional string id = 3;
|
||||||
optional string remoteJid = 4;
|
optional string participant = 4;
|
||||||
repeated string mentionedJid = 15;
|
|
||||||
optional string conversionSource = 18;
|
|
||||||
optional bytes conversionData = 19;
|
|
||||||
optional uint32 conversionDelaySeconds = 20;
|
|
||||||
optional bool isForwarded = 22;
|
|
||||||
reserved 16, 17;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
message InteractiveAnnotation {
|
message WebFeatures {
|
||||||
repeated Point polygonVertices = 1;
|
enum WEB_FEATURES_FLAG {
|
||||||
oneof action {
|
NOT_IMPLEMENTED = 0;
|
||||||
Location location = 2;
|
IMPLEMENTED = 1;
|
||||||
|
OPTIONAL = 2;
|
||||||
}
|
}
|
||||||
|
optional WEB_FEATURES_FLAG labelsDisplay = 1;
|
||||||
|
optional WEB_FEATURES_FLAG voipIndividualOutgoing = 2;
|
||||||
|
optional WEB_FEATURES_FLAG groupsV3 = 3;
|
||||||
|
optional WEB_FEATURES_FLAG groupsV3Create = 4;
|
||||||
|
optional WEB_FEATURES_FLAG changeNumberV2 = 5;
|
||||||
|
optional WEB_FEATURES_FLAG queryStatusV3Thumbnail = 6;
|
||||||
|
optional WEB_FEATURES_FLAG liveLocations = 7;
|
||||||
|
optional WEB_FEATURES_FLAG queryVname = 8;
|
||||||
|
optional WEB_FEATURES_FLAG voipIndividualIncoming = 9;
|
||||||
|
optional WEB_FEATURES_FLAG quickRepliesQuery = 10;
|
||||||
|
optional WEB_FEATURES_FLAG payments = 11;
|
||||||
|
optional WEB_FEATURES_FLAG stickerPackQuery = 12;
|
||||||
|
optional WEB_FEATURES_FLAG liveLocationsFinal = 13;
|
||||||
|
optional WEB_FEATURES_FLAG labelsEdit = 14;
|
||||||
|
optional WEB_FEATURES_FLAG mediaUpload = 15;
|
||||||
|
optional WEB_FEATURES_FLAG mediaUploadRichQuickReplies = 18;
|
||||||
|
optional WEB_FEATURES_FLAG vnameV2 = 19;
|
||||||
|
optional WEB_FEATURES_FLAG videoPlaybackUrl = 20;
|
||||||
|
optional WEB_FEATURES_FLAG statusRanking = 21;
|
||||||
|
optional WEB_FEATURES_FLAG voipIndividualVideo = 22;
|
||||||
|
optional WEB_FEATURES_FLAG thirdPartyStickers = 23;
|
||||||
|
optional WEB_FEATURES_FLAG frequentlyForwardedSetting = 24;
|
||||||
}
|
}
|
||||||
|
|
||||||
message Point {
|
message TabletNotificationsInfo {
|
||||||
optional double x = 3;
|
optional uint64 timestamp = 2;
|
||||||
optional double y = 4;
|
optional uint32 unreadChats = 3;
|
||||||
|
optional uint32 notifyMessageCount = 4;
|
||||||
|
repeated NotificationMessageInfo notifyMessage = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
message Location {
|
message NotificationMessageInfo {
|
||||||
optional double degreesLatitude = 1;
|
optional MessageKey key = 1;
|
||||||
optional double degreesLongitude = 2;
|
optional Message message = 2;
|
||||||
optional string name = 3;
|
optional uint64 messageTimestamp = 3;
|
||||||
|
optional string participant = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message WebNotificationsInfo {
|
||||||
|
optional uint64 timestamp = 2;
|
||||||
|
optional uint32 unreadChats = 3;
|
||||||
|
optional uint32 notifyMessageCount = 4;
|
||||||
|
repeated WebMessageInfo notifyMessages = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
message PaymentInfo {
|
||||||
|
optional uint64 amount1000 = 2;
|
||||||
|
optional string receiverJid = 3;
|
||||||
|
enum PAYMENT_INFO_STATUS {
|
||||||
|
UNKNOWN_STATUS = 0;
|
||||||
|
PROCESSING = 1;
|
||||||
|
SENT = 2;
|
||||||
|
NEED_TO_ACCEPT = 3;
|
||||||
|
COMPLETE = 4;
|
||||||
|
COULD_NOT_COMPLETE = 5;
|
||||||
|
REFUNDED = 6;
|
||||||
|
EXPIRED = 7;
|
||||||
|
REJECTED = 8;
|
||||||
|
CANCELLED = 9;
|
||||||
|
WAITING_FOR_PAYER = 10;
|
||||||
|
WAITING = 11;
|
||||||
|
}
|
||||||
|
optional PAYMENT_INFO_STATUS status = 4;
|
||||||
|
optional uint64 transactionTimestamp = 5;
|
||||||
|
optional MessageKey requestMessageKey = 6;
|
||||||
|
optional uint64 expiryTimestamp = 7;
|
||||||
|
optional bool futureproofed = 8;
|
||||||
|
optional string currency = 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
message WebMessageInfo {
|
message WebMessageInfo {
|
||||||
required MessageKey key = 1;
|
required MessageKey key = 1;
|
||||||
optional Message message = 2;
|
optional Message message = 2;
|
||||||
optional uint64 messageTimestamp = 3;
|
optional uint64 messageTimestamp = 3;
|
||||||
enum STATUS {
|
enum WEB_MESSAGE_INFO_STATUS {
|
||||||
ERROR = 0;
|
ERROR = 0;
|
||||||
PENDING = 1;
|
PENDING = 1;
|
||||||
SERVER_ACK = 2;
|
SERVER_ACK = 2;
|
||||||
@@ -314,7 +533,7 @@ message WebMessageInfo {
|
|||||||
READ = 4;
|
READ = 4;
|
||||||
PLAYED = 5;
|
PLAYED = 5;
|
||||||
}
|
}
|
||||||
optional STATUS status = 4 [default=PENDING];
|
optional WEB_MESSAGE_INFO_STATUS status = 4;
|
||||||
optional string participant = 5;
|
optional string participant = 5;
|
||||||
optional bool ignore = 16;
|
optional bool ignore = 16;
|
||||||
optional bool starred = 17;
|
optional bool starred = 17;
|
||||||
@@ -324,7 +543,7 @@ message WebMessageInfo {
|
|||||||
optional bool multicast = 21;
|
optional bool multicast = 21;
|
||||||
optional bool urlText = 22;
|
optional bool urlText = 22;
|
||||||
optional bool urlNumber = 23;
|
optional bool urlNumber = 23;
|
||||||
enum STUBTYPE {
|
enum WEB_MESSAGE_INFO_STUBTYPE {
|
||||||
UNKNOWN = 0;
|
UNKNOWN = 0;
|
||||||
REVOKE = 1;
|
REVOKE = 1;
|
||||||
CIPHERTEXT = 2;
|
CIPHERTEXT = 2;
|
||||||
@@ -369,49 +588,39 @@ message WebMessageInfo {
|
|||||||
CALL_MISSED_VIDEO = 41;
|
CALL_MISSED_VIDEO = 41;
|
||||||
INDIVIDUAL_CHANGE_NUMBER = 42;
|
INDIVIDUAL_CHANGE_NUMBER = 42;
|
||||||
GROUP_DELETE = 43;
|
GROUP_DELETE = 43;
|
||||||
|
GROUP_ANNOUNCE_MODE_MESSAGE_BOUNCE = 44;
|
||||||
|
CALL_MISSED_GROUP_VOICE = 45;
|
||||||
|
CALL_MISSED_GROUP_VIDEO = 46;
|
||||||
|
PAYMENT_CIPHERTEXT = 47;
|
||||||
|
PAYMENT_FUTUREPROOF = 48;
|
||||||
|
PAYMENT_TRANSACTION_STATUS_UPDATE_FAILED = 49;
|
||||||
|
PAYMENT_TRANSACTION_STATUS_UPDATE_REFUNDED = 50;
|
||||||
|
PAYMENT_TRANSACTION_STATUS_UPDATE_REFUND_FAILED = 51;
|
||||||
|
PAYMENT_TRANSACTION_STATUS_RECEIVER_PENDING_SETUP = 52;
|
||||||
|
PAYMENT_TRANSACTION_STATUS_RECEIVER_SUCCESS_AFTER_HICCUP = 53;
|
||||||
|
PAYMENT_ACTION_ACCOUNT_SETUP_REMINDER = 54;
|
||||||
|
PAYMENT_ACTION_SEND_PAYMENT_REMINDER = 55;
|
||||||
|
PAYMENT_ACTION_SEND_PAYMENT_INVITATION = 56;
|
||||||
|
PAYMENT_ACTION_REQUEST_DECLINED = 57;
|
||||||
|
PAYMENT_ACTION_REQUEST_EXPIRED = 58;
|
||||||
|
PAYMENT_ACTION_REQUEST_CANCELLED = 59;
|
||||||
|
BIZ_VERIFIED_TRANSITION_TOP_TO_BOTTOM = 60;
|
||||||
|
BIZ_VERIFIED_TRANSITION_BOTTOM_TO_TOP = 61;
|
||||||
|
BIZ_INTRO_TOP = 62;
|
||||||
|
BIZ_INTRO_BOTTOM = 63;
|
||||||
|
BIZ_NAME_CHANGE = 64;
|
||||||
|
BIZ_MOVE_TO_CONSUMER_APP = 65;
|
||||||
|
BIZ_TWO_TIER_MIGRATION_TOP = 66;
|
||||||
|
BIZ_TWO_TIER_MIGRATION_BOTTOM = 67;
|
||||||
|
OVERSIZED = 68;
|
||||||
|
GROUP_CHANGE_NO_FREQUENTLY_FORWARDED = 69;
|
||||||
}
|
}
|
||||||
optional STUBTYPE messageStubType = 24;
|
optional WEB_MESSAGE_INFO_STUBTYPE messageStubType = 24;
|
||||||
optional bool clearMedia = 25;
|
optional bool clearMedia = 25;
|
||||||
repeated string messageStubParameters = 26;
|
repeated string messageStubParameters = 26;
|
||||||
optional uint32 duration = 27;
|
optional uint32 duration = 27;
|
||||||
repeated string labels = 28;
|
repeated string labels = 28;
|
||||||
}
|
optional PaymentInfo paymentInfo = 29;
|
||||||
|
optional LiveLocationMessage finalLiveLocation = 30;
|
||||||
message WebNotificationsInfo {
|
optional PaymentInfo quotedPaymentInfo = 31;
|
||||||
optional uint64 timestamp = 2;
|
|
||||||
optional uint32 unreadChats = 3;
|
|
||||||
optional uint32 notifyMessageCount = 4;
|
|
||||||
repeated Message notifyMessages = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
message NotificationMessageInfo {
|
|
||||||
optional MessageKey key = 1;
|
|
||||||
optional Message message = 2;
|
|
||||||
optional uint64 messageTimestamp = 3;
|
|
||||||
optional string participant = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
message TabletNotificationsInfo {
|
|
||||||
optional uint64 timestamp = 2;
|
|
||||||
optional uint32 unreadChats = 3;
|
|
||||||
optional uint32 notifyMessageCount = 4;
|
|
||||||
repeated Message notifyMessage = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
message WebFeatures {
|
|
||||||
enum FLAG {
|
|
||||||
NOT_IMPLEMENTED = 0;
|
|
||||||
IMPLEMENTED = 1;
|
|
||||||
OPTIONAL = 2;
|
|
||||||
}
|
|
||||||
optional FLAG labelsDisplay = 1;
|
|
||||||
optional FLAG voipIndividualOutgoing = 2;
|
|
||||||
optional FLAG groupsV3 = 3;
|
|
||||||
optional FLAG groupsV3Create = 4;
|
|
||||||
optional FLAG changeNumberV2 = 5;
|
|
||||||
optional FLAG queryStatusV3Thumbnail = 6;
|
|
||||||
optional FLAG liveLocations = 7;
|
|
||||||
optional FLAG queryVname = 8;
|
|
||||||
optional FLAG voipIndividualIncoming = 9;
|
|
||||||
optional FLAG quickRepliesQuery = 10;
|
|
||||||
}
|
}
|
||||||
|
|||||||
183
vendor/github.com/Rhymen/go-whatsapp/chat_history.go
generated
vendored
Normal file
183
vendor/github.com/Rhymen/go-whatsapp/chat_history.go
generated
vendored
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
package whatsapp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/Rhymen/go-whatsapp/binary"
|
||||||
|
"github.com/Rhymen/go-whatsapp/binary/proto"
|
||||||
|
"log"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MessageOffsetInfo struct {
|
||||||
|
FirstMessageId string
|
||||||
|
FirstMessageOwner bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeMessages(n *binary.Node) []*proto.WebMessageInfo {
|
||||||
|
|
||||||
|
var messages = make([]*proto.WebMessageInfo, 0)
|
||||||
|
|
||||||
|
if n == nil || n.Attributes == nil || n.Content == nil {
|
||||||
|
return messages
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, msg := range n.Content.([]interface{}) {
|
||||||
|
switch msg.(type) {
|
||||||
|
case *proto.WebMessageInfo:
|
||||||
|
messages = append(messages, msg.(*proto.WebMessageInfo))
|
||||||
|
default:
|
||||||
|
log.Println("decodeMessages: Non WebMessage encountered")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return messages
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadChatMessages is useful to "scroll" messages, loading by count at a time
|
||||||
|
// if handlers == nil the func will use default handlers
|
||||||
|
// if after == true LoadChatMessages will load messages after the specified messageId, otherwise it will return
|
||||||
|
// message before the messageId
|
||||||
|
func (wac *Conn) LoadChatMessages(jid string, count int, messageId string, owner bool, after bool, handlers ...Handler) error {
|
||||||
|
if count <= 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if handlers == nil {
|
||||||
|
handlers = wac.handler
|
||||||
|
}
|
||||||
|
|
||||||
|
kind := "before"
|
||||||
|
if after {
|
||||||
|
kind = "after"
|
||||||
|
}
|
||||||
|
|
||||||
|
node, err := wac.query("message", jid, messageId, kind,
|
||||||
|
strconv.FormatBool(owner), "", count, 0)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
wac.handleWithCustomHandlers(err, handlers)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, msg := range decodeMessages(node) {
|
||||||
|
wac.handleWithCustomHandlers(ParseProtoMessage(msg), handlers)
|
||||||
|
wac.handleWithCustomHandlers(msg, handlers)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadFullChatHistory loads full chat history for the given jid
|
||||||
|
// chunkSize = how many messages to load with one query; if handlers == nil the func will use default handlers;
|
||||||
|
// pauseBetweenQueries = how much time to sleep between queries
|
||||||
|
func (wac *Conn) LoadFullChatHistory(jid string, chunkSize int,
|
||||||
|
pauseBetweenQueries time.Duration, handlers ...Handler) {
|
||||||
|
if chunkSize <= 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if handlers == nil {
|
||||||
|
handlers = wac.handler
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeMsg := ""
|
||||||
|
beforeMsgIsOwner := true
|
||||||
|
|
||||||
|
for {
|
||||||
|
node, err := wac.query("message", jid, beforeMsg, "before",
|
||||||
|
strconv.FormatBool(beforeMsgIsOwner), "", chunkSize, 0)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
wac.handleWithCustomHandlers(err, handlers)
|
||||||
|
} else {
|
||||||
|
|
||||||
|
msgs := decodeMessages(node)
|
||||||
|
for _, msg := range msgs {
|
||||||
|
wac.handleWithCustomHandlers(ParseProtoMessage(msg), handlers)
|
||||||
|
wac.handleWithCustomHandlers(msg, handlers)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(msgs) == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeMsg = *msgs[0].Key.Id
|
||||||
|
beforeMsgIsOwner = msgs[0].Key.FromMe != nil && *msgs[0].Key.FromMe
|
||||||
|
}
|
||||||
|
|
||||||
|
<-time.After(pauseBetweenQueries)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadFullChatHistoryAfter loads all messages after the specified messageId
|
||||||
|
// useful to "catch up" with the message history after some specified message
|
||||||
|
func (wac *Conn) LoadFullChatHistoryAfter(jid string, messageId string, chunkSize int,
|
||||||
|
pauseBetweenQueries time.Duration, handlers ...Handler) {
|
||||||
|
|
||||||
|
if chunkSize <= 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if handlers == nil {
|
||||||
|
handlers = wac.handler
|
||||||
|
}
|
||||||
|
|
||||||
|
msgOwner := true
|
||||||
|
prevNotFound := false
|
||||||
|
|
||||||
|
for {
|
||||||
|
node, err := wac.query("message", jid, messageId, "after",
|
||||||
|
strconv.FormatBool(msgOwner), "", chunkSize, 0)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
|
||||||
|
// Whatsapp will return 404 status when there is wrong owner flag on the requested message id
|
||||||
|
if err == ErrServerRespondedWith404 {
|
||||||
|
|
||||||
|
// this will detect two consecutive "not found" errors.
|
||||||
|
// this is done to prevent infinite loop when wrong message id supplied
|
||||||
|
if prevNotFound {
|
||||||
|
log.Println("LoadFullChatHistoryAfter: could not retrieve any messages, wrong message id?")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
prevNotFound = true
|
||||||
|
|
||||||
|
// try to reverse the owner flag and retry
|
||||||
|
if msgOwner {
|
||||||
|
// reverse initial msgOwner value and retry
|
||||||
|
msgOwner = false
|
||||||
|
|
||||||
|
<-time.After(time.Second)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the error isn't a 404 error, pass it to the error handler
|
||||||
|
wac.handleWithCustomHandlers(err, handlers)
|
||||||
|
} else {
|
||||||
|
|
||||||
|
msgs := decodeMessages(node)
|
||||||
|
for _, msg := range msgs {
|
||||||
|
wac.handleWithCustomHandlers(ParseProtoMessage(msg), handlers)
|
||||||
|
wac.handleWithCustomHandlers(msg, handlers)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(msgs) != chunkSize {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
messageId = *msgs[0].Key.Id
|
||||||
|
msgOwner = msgs[0].Key.FromMe != nil && *msgs[0].Key.FromMe
|
||||||
|
}
|
||||||
|
|
||||||
|
// message was found
|
||||||
|
prevNotFound = false
|
||||||
|
|
||||||
|
<-time.After(pauseBetweenQueries)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
33
vendor/github.com/Rhymen/go-whatsapp/conn.go
generated
vendored
33
vendor/github.com/Rhymen/go-whatsapp/conn.go
generated
vendored
@@ -4,6 +4,7 @@ package whatsapp
|
|||||||
import (
|
import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -89,6 +90,9 @@ type Conn struct {
|
|||||||
|
|
||||||
longClientName string
|
longClientName string
|
||||||
shortClientName string
|
shortClientName string
|
||||||
|
|
||||||
|
loginSessionLock sync.RWMutex
|
||||||
|
Proxy func(*http.Request) (*url.URL, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type websocketWrapper struct {
|
type websocketWrapper struct {
|
||||||
@@ -119,6 +123,21 @@ func NewConn(timeout time.Duration) (*Conn, error) {
|
|||||||
return wac, wac.connect()
|
return wac, wac.connect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewConnWithProxy Create a new connect with a given timeout and a http proxy.
|
||||||
|
func NewConnWithProxy(timeout time.Duration, proxy func(*http.Request) (*url.URL, error)) (*Conn, error) {
|
||||||
|
wac := &Conn{
|
||||||
|
handler: make([]Handler, 0),
|
||||||
|
msgCount: 0,
|
||||||
|
msgTimeout: timeout,
|
||||||
|
Store: newStore(),
|
||||||
|
|
||||||
|
longClientName: "github.com/rhymen/go-whatsapp",
|
||||||
|
shortClientName: "go-whatsapp",
|
||||||
|
Proxy: proxy,
|
||||||
|
}
|
||||||
|
return wac, wac.connect()
|
||||||
|
}
|
||||||
|
|
||||||
// connect should be guarded with wsWriteMutex
|
// connect should be guarded with wsWriteMutex
|
||||||
func (wac *Conn) connect() (err error) {
|
func (wac *Conn) connect() (err error) {
|
||||||
if wac.connected {
|
if wac.connected {
|
||||||
@@ -135,6 +154,7 @@ func (wac *Conn) connect() (err error) {
|
|||||||
ReadBufferSize: 25 * 1024 * 1024,
|
ReadBufferSize: 25 * 1024 * 1024,
|
||||||
WriteBufferSize: 10 * 1024 * 1024,
|
WriteBufferSize: 10 * 1024 * 1024,
|
||||||
HandshakeTimeout: wac.msgTimeout,
|
HandshakeTimeout: wac.msgTimeout,
|
||||||
|
Proxy: wac.Proxy,
|
||||||
}
|
}
|
||||||
|
|
||||||
headers := http.Header{"Origin": []string{"https://web.whatsapp.com"}}
|
headers := http.Header{"Origin": []string{"https://web.whatsapp.com"}}
|
||||||
@@ -191,6 +211,19 @@ func (wac *Conn) Disconnect() (Session, error) {
|
|||||||
return *wac.session, err
|
return *wac.session, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (wac *Conn) AdminTest() (bool, error) {
|
||||||
|
if !wac.connected {
|
||||||
|
return false, ErrNotConnected
|
||||||
|
}
|
||||||
|
|
||||||
|
if !wac.loggedIn {
|
||||||
|
return false, ErrInvalidSession
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := wac.sendAdminTest()
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|
||||||
func (wac *Conn) keepAlive(minIntervalMs int, maxIntervalMs int) {
|
func (wac *Conn) keepAlive(minIntervalMs int, maxIntervalMs int) {
|
||||||
defer wac.wg.Done()
|
defer wac.wg.Done()
|
||||||
|
|
||||||
|
|||||||
11
vendor/github.com/Rhymen/go-whatsapp/contact.go
generated
vendored
11
vendor/github.com/Rhymen/go-whatsapp/contact.go
generated
vendored
@@ -51,6 +51,10 @@ func (wac *Conn) LoadMessagesAfter(jid, messageId string, count int) (*binary.No
|
|||||||
return wac.query("message", jid, messageId, "after", "true", "", count, 0)
|
return wac.query("message", jid, messageId, "after", "true", "", count, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (wac *Conn) LoadMediaInfo(jid, messageId, owner string) (*binary.Node, error) {
|
||||||
|
return wac.query("media", jid, messageId, "", owner, "", 0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
func (wac *Conn) Presence(jid string, presence Presence) (<-chan string, error) {
|
func (wac *Conn) Presence(jid string, presence Presence) (<-chan string, error) {
|
||||||
ts := time.Now().Unix()
|
ts := time.Now().Unix()
|
||||||
tag := fmt.Sprintf("%d.--%d", ts, wac.msgCount)
|
tag := fmt.Sprintf("%d.--%d", ts, wac.msgCount)
|
||||||
@@ -163,7 +167,12 @@ func (wac *Conn) query(t, jid, messageId, kind, owner, search string, count, pag
|
|||||||
n.Attributes["page"] = strconv.Itoa(page)
|
n.Attributes["page"] = strconv.Itoa(page)
|
||||||
}
|
}
|
||||||
|
|
||||||
ch, err := wac.writeBinary(n, group, ignore, tag)
|
metric := group
|
||||||
|
if t == "media" {
|
||||||
|
metric = queryMedia
|
||||||
|
}
|
||||||
|
|
||||||
|
ch, err := wac.writeBinary(n, metric, ignore, tag)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
23
vendor/github.com/Rhymen/go-whatsapp/errors.go
generated
vendored
23
vendor/github.com/Rhymen/go-whatsapp/errors.go
generated
vendored
@@ -6,15 +6,20 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ErrAlreadyConnected = errors.New("already connected")
|
ErrAlreadyConnected = errors.New("already connected")
|
||||||
ErrAlreadyLoggedIn = errors.New("already logged in")
|
ErrAlreadyLoggedIn = errors.New("already logged in")
|
||||||
ErrInvalidSession = errors.New("invalid session")
|
ErrInvalidSession = errors.New("invalid session")
|
||||||
ErrLoginInProgress = errors.New("login or restore already running")
|
ErrLoginInProgress = errors.New("login or restore already running")
|
||||||
ErrNotConnected = errors.New("not connected")
|
ErrNotConnected = errors.New("not connected")
|
||||||
ErrInvalidWsData = errors.New("received invalid data")
|
ErrInvalidWsData = errors.New("received invalid data")
|
||||||
ErrConnectionTimeout = errors.New("connection timed out")
|
ErrInvalidWsState = errors.New("can't handle binary data when not logged in")
|
||||||
ErrMissingMessageTag = errors.New("no messageTag specified or to short")
|
ErrConnectionTimeout = errors.New("connection timed out")
|
||||||
ErrInvalidHmac = errors.New("invalid hmac")
|
ErrMissingMessageTag = errors.New("no messageTag specified or to short")
|
||||||
|
ErrInvalidHmac = errors.New("invalid hmac")
|
||||||
|
ErrInvalidServerResponse = errors.New("invalid response received from server")
|
||||||
|
ErrServerRespondedWith404 = errors.New("server responded with status 404")
|
||||||
|
ErrMediaDownloadFailedWith404 = errors.New("download failed with status code 404")
|
||||||
|
ErrMediaDownloadFailedWith410 = errors.New("download failed with status code 410")
|
||||||
)
|
)
|
||||||
|
|
||||||
type ErrConnectionFailed struct {
|
type ErrConnectionFailed struct {
|
||||||
|
|||||||
148
vendor/github.com/Rhymen/go-whatsapp/handler.go
generated
vendored
148
vendor/github.com/Rhymen/go-whatsapp/handler.go
generated
vendored
@@ -20,6 +20,11 @@ type Handler interface {
|
|||||||
HandleError(err error)
|
HandleError(err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SyncHandler interface {
|
||||||
|
Handler
|
||||||
|
ShouldCallSynchronously() bool
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The TextMessageHandler interface needs to be implemented to receive text messages dispatched by the dispatcher.
|
The TextMessageHandler interface needs to be implemented to receive text messages dispatched by the dispatcher.
|
||||||
*/
|
*/
|
||||||
@@ -60,6 +65,30 @@ type DocumentMessageHandler interface {
|
|||||||
HandleDocumentMessage(message DocumentMessage)
|
HandleDocumentMessage(message DocumentMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
The LiveLocationMessageHandler interface needs to be implemented to receive live location messages dispatched by the dispatcher.
|
||||||
|
*/
|
||||||
|
type LiveLocationMessageHandler interface {
|
||||||
|
Handler
|
||||||
|
HandleLiveLocationMessage(message LiveLocationMessage)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
The LocationMessageHandler interface needs to be implemented to receive location messages dispatched by the dispatcher.
|
||||||
|
*/
|
||||||
|
type LocationMessageHandler interface {
|
||||||
|
Handler
|
||||||
|
HandleLocationMessage(message LocationMessage)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
The StickerMessageHandler interface needs to be implemented to receive location messages dispatched by the dispatcher.
|
||||||
|
*/
|
||||||
|
type StickerMessageHandler interface {
|
||||||
|
Handler
|
||||||
|
HandleStickerMessage(message StickerMessage)
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The JsonMessageHandler interface needs to be implemented to receive json messages dispatched by the dispatcher.
|
The JsonMessageHandler interface needs to be implemented to receive json messages dispatched by the dispatcher.
|
||||||
These json messages contain status updates of every kind sent by WhatsAppWeb servers. WhatsAppWeb uses these messages
|
These json messages contain status updates of every kind sent by WhatsAppWeb servers. WhatsAppWeb uses these messages
|
||||||
@@ -127,52 +156,125 @@ func (wac *Conn) RemoveHandlers() {
|
|||||||
wac.handler = make([]Handler, 0)
|
wac.handler = make([]Handler, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (wac *Conn) shouldCallSynchronously(handler Handler) bool {
|
||||||
|
sh, ok := handler.(SyncHandler)
|
||||||
|
return ok && sh.ShouldCallSynchronously()
|
||||||
|
}
|
||||||
|
|
||||||
func (wac *Conn) handle(message interface{}) {
|
func (wac *Conn) handle(message interface{}) {
|
||||||
|
wac.handleWithCustomHandlers(message, wac.handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (wac *Conn) handleWithCustomHandlers(message interface{}, handlers []Handler) {
|
||||||
switch m := message.(type) {
|
switch m := message.(type) {
|
||||||
case error:
|
case error:
|
||||||
for _, h := range wac.handler {
|
for _, h := range handlers {
|
||||||
go h.HandleError(m)
|
if wac.shouldCallSynchronously(h) {
|
||||||
|
h.HandleError(m)
|
||||||
|
} else {
|
||||||
|
go h.HandleError(m)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
case string:
|
case string:
|
||||||
for _, h := range wac.handler {
|
for _, h := range handlers {
|
||||||
if x, ok := h.(JsonMessageHandler); ok {
|
if x, ok := h.(JsonMessageHandler); ok {
|
||||||
go x.HandleJsonMessage(m)
|
if wac.shouldCallSynchronously(h) {
|
||||||
|
x.HandleJsonMessage(m)
|
||||||
|
} else {
|
||||||
|
go x.HandleJsonMessage(m)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case TextMessage:
|
case TextMessage:
|
||||||
for _, h := range wac.handler {
|
for _, h := range handlers {
|
||||||
if x, ok := h.(TextMessageHandler); ok {
|
if x, ok := h.(TextMessageHandler); ok {
|
||||||
go x.HandleTextMessage(m)
|
if wac.shouldCallSynchronously(h) {
|
||||||
|
x.HandleTextMessage(m)
|
||||||
|
} else {
|
||||||
|
go x.HandleTextMessage(m)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case ImageMessage:
|
case ImageMessage:
|
||||||
for _, h := range wac.handler {
|
for _, h := range handlers {
|
||||||
if x, ok := h.(ImageMessageHandler); ok {
|
if x, ok := h.(ImageMessageHandler); ok {
|
||||||
go x.HandleImageMessage(m)
|
if wac.shouldCallSynchronously(h) {
|
||||||
|
x.HandleImageMessage(m)
|
||||||
|
} else {
|
||||||
|
go x.HandleImageMessage(m)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case VideoMessage:
|
case VideoMessage:
|
||||||
for _, h := range wac.handler {
|
for _, h := range handlers {
|
||||||
if x, ok := h.(VideoMessageHandler); ok {
|
if x, ok := h.(VideoMessageHandler); ok {
|
||||||
go x.HandleVideoMessage(m)
|
if wac.shouldCallSynchronously(h) {
|
||||||
|
x.HandleVideoMessage(m)
|
||||||
|
} else {
|
||||||
|
go x.HandleVideoMessage(m)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case AudioMessage:
|
case AudioMessage:
|
||||||
for _, h := range wac.handler {
|
for _, h := range handlers {
|
||||||
if x, ok := h.(AudioMessageHandler); ok {
|
if x, ok := h.(AudioMessageHandler); ok {
|
||||||
go x.HandleAudioMessage(m)
|
if wac.shouldCallSynchronously(h) {
|
||||||
|
x.HandleAudioMessage(m)
|
||||||
|
} else {
|
||||||
|
go x.HandleAudioMessage(m)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case DocumentMessage:
|
case DocumentMessage:
|
||||||
for _, h := range wac.handler {
|
for _, h := range handlers {
|
||||||
if x, ok := h.(DocumentMessageHandler); ok {
|
if x, ok := h.(DocumentMessageHandler); ok {
|
||||||
go x.HandleDocumentMessage(m)
|
if wac.shouldCallSynchronously(h) {
|
||||||
|
x.HandleDocumentMessage(m)
|
||||||
|
} else {
|
||||||
|
go x.HandleDocumentMessage(m)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case LocationMessage:
|
||||||
|
for _, h := range handlers {
|
||||||
|
if x, ok := h.(LocationMessageHandler); ok {
|
||||||
|
if wac.shouldCallSynchronously(h) {
|
||||||
|
x.HandleLocationMessage(m)
|
||||||
|
} else {
|
||||||
|
go x.HandleLocationMessage(m)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case LiveLocationMessage:
|
||||||
|
for _, h := range handlers {
|
||||||
|
if x, ok := h.(LiveLocationMessageHandler); ok {
|
||||||
|
if wac.shouldCallSynchronously(h) {
|
||||||
|
x.HandleLiveLocationMessage(m)
|
||||||
|
} else {
|
||||||
|
go x.HandleLiveLocationMessage(m)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case StickerMessage:
|
||||||
|
for _, h := range handlers {
|
||||||
|
if x, ok := h.(StickerMessageHandler); ok {
|
||||||
|
if wac.shouldCallSynchronously(h) {
|
||||||
|
x.HandleStickerMessage(m)
|
||||||
|
} else {
|
||||||
|
go x.HandleStickerMessage(m)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
case *proto.WebMessageInfo:
|
case *proto.WebMessageInfo:
|
||||||
for _, h := range wac.handler {
|
for _, h := range handlers {
|
||||||
if x, ok := h.(RawMessageHandler); ok {
|
if x, ok := h.(RawMessageHandler); ok {
|
||||||
go x.HandleRawMessage(m)
|
if wac.shouldCallSynchronously(h) {
|
||||||
|
x.HandleRawMessage(m)
|
||||||
|
} else {
|
||||||
|
go x.HandleRawMessage(m)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -201,7 +303,11 @@ func (wac *Conn) handleContacts(contacts interface{}) {
|
|||||||
}
|
}
|
||||||
for _, h := range wac.handler {
|
for _, h := range wac.handler {
|
||||||
if x, ok := h.(ContactListHandler); ok {
|
if x, ok := h.(ContactListHandler); ok {
|
||||||
go x.HandleContactList(contactList)
|
if wac.shouldCallSynchronously(h) {
|
||||||
|
x.HandleContactList(contactList)
|
||||||
|
} else {
|
||||||
|
go x.HandleContactList(contactList)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -230,7 +336,11 @@ func (wac *Conn) handleChats(chats interface{}) {
|
|||||||
}
|
}
|
||||||
for _, h := range wac.handler {
|
for _, h := range wac.handler {
|
||||||
if x, ok := h.(ChatListHandler); ok {
|
if x, ok := h.(ChatListHandler); ok {
|
||||||
go x.HandleChatList(chatList)
|
if wac.shouldCallSynchronously(h) {
|
||||||
|
x.HandleChatList(chatList)
|
||||||
|
} else {
|
||||||
|
go x.HandleChatList(chatList)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -247,7 +357,7 @@ func (wac *Conn) dispatch(msg interface{}) {
|
|||||||
for a := range con {
|
for a := range con {
|
||||||
if v, ok := con[a].(*proto.WebMessageInfo); ok {
|
if v, ok := con[a].(*proto.WebMessageInfo); ok {
|
||||||
wac.handle(v)
|
wac.handle(v)
|
||||||
wac.handle(parseProtoMessage(v))
|
wac.handle(ParseProtoMessage(v))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
18
vendor/github.com/Rhymen/go-whatsapp/media.go
generated
vendored
18
vendor/github.com/Rhymen/go-whatsapp/media.go
generated
vendored
@@ -8,8 +8,6 @@ import (
|
|||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/Rhymen/go-whatsapp/crypto/cbc"
|
|
||||||
"github.com/Rhymen/go-whatsapp/crypto/hkdf"
|
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
@@ -17,6 +15,9 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/Rhymen/go-whatsapp/crypto/cbc"
|
||||||
|
"github.com/Rhymen/go-whatsapp/crypto/hkdf"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Download(url string, mediaKey []byte, appInfo MediaType, fileLength int) ([]byte, error) {
|
func Download(url string, mediaKey []byte, appInfo MediaType, fileLength int) ([]byte, error) {
|
||||||
@@ -73,17 +74,24 @@ func downloadMedia(url string) (file []byte, mac []byte, err error) {
|
|||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
if resp.StatusCode != 200 {
|
if resp.StatusCode != 200 {
|
||||||
return nil, nil, fmt.Errorf("download failed")
|
if resp.StatusCode == 404 {
|
||||||
|
return nil, nil, ErrMediaDownloadFailedWith404
|
||||||
|
}
|
||||||
|
if resp.StatusCode == 410 {
|
||||||
|
return nil, nil, ErrMediaDownloadFailedWith410
|
||||||
|
}
|
||||||
|
return nil, nil, fmt.Errorf("download failed with status code %d", resp.StatusCode)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
if resp.ContentLength <= 10 {
|
if resp.ContentLength <= 10 {
|
||||||
return nil, nil, fmt.Errorf("file to short")
|
return nil, nil, fmt.Errorf("file to short")
|
||||||
}
|
}
|
||||||
data, err := ioutil.ReadAll(resp.Body)
|
data, err := ioutil.ReadAll(resp.Body)
|
||||||
n := len(data)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
n := len(data)
|
||||||
return data[:n-10], data[n-10 : n], nil
|
return data[:n-10], data[n-10 : n], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,7 +150,7 @@ func (wac *Conn) Upload(reader io.Reader, appInfo MediaType) (url string, mediaK
|
|||||||
select {
|
select {
|
||||||
case r := <-ch:
|
case r := <-ch:
|
||||||
if err = json.Unmarshal([]byte(r), &resp); err != nil {
|
if err = json.Unmarshal([]byte(r), &resp); err != nil {
|
||||||
return "", nil, nil, nil, 0, fmt.Errorf("error decoding upload response: %v\n", err)
|
return "", nil, nil, nil, 0, fmt.Errorf("error decoding upload response: %v", err)
|
||||||
}
|
}
|
||||||
case <-time.After(wac.msgTimeout):
|
case <-time.After(wac.msgTimeout):
|
||||||
return "", nil, nil, nil, 0, fmt.Errorf("restore session init timed out")
|
return "", nil, nil, nil, 0, fmt.Errorf("restore session init timed out")
|
||||||
|
|||||||
254
vendor/github.com/Rhymen/go-whatsapp/message.go
generated
vendored
254
vendor/github.com/Rhymen/go-whatsapp/message.go
generated
vendored
@@ -4,13 +4,14 @@ import (
|
|||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/Rhymen/go-whatsapp/binary"
|
|
||||||
"github.com/Rhymen/go-whatsapp/binary/proto"
|
|
||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/Rhymen/go-whatsapp/binary"
|
||||||
|
"github.com/Rhymen/go-whatsapp/binary/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MediaType string
|
type MediaType string
|
||||||
@@ -68,6 +69,14 @@ func (wac *Conn) Send(msg interface{}) (string, error) {
|
|||||||
msgProto = getAudioProto(m)
|
msgProto = getAudioProto(m)
|
||||||
msgInfo = getMessageInfo(msgProto)
|
msgInfo = getMessageInfo(msgProto)
|
||||||
ch, err = wac.sendProto(msgProto)
|
ch, err = wac.sendProto(msgProto)
|
||||||
|
case LocationMessage:
|
||||||
|
msgProto = GetLocationProto(m)
|
||||||
|
msgInfo = getMessageInfo(msgProto)
|
||||||
|
ch, err = wac.sendProto(msgProto)
|
||||||
|
case LiveLocationMessage:
|
||||||
|
msgProto = GetLiveLocationProto(m)
|
||||||
|
msgInfo = getMessageInfo(msgProto)
|
||||||
|
ch, err = wac.sendProto(msgProto)
|
||||||
default:
|
default:
|
||||||
return "ERROR", fmt.Errorf("cannot match type %T, use message types declared in the package", msg)
|
return "ERROR", fmt.Errorf("cannot match type %T, use message types declared in the package", msg)
|
||||||
}
|
}
|
||||||
@@ -123,6 +132,7 @@ type MessageInfo struct {
|
|||||||
PushName string
|
PushName string
|
||||||
Status MessageStatus
|
Status MessageStatus
|
||||||
QuotedMessageID string
|
QuotedMessageID string
|
||||||
|
QuotedMessage proto.Message
|
||||||
|
|
||||||
Source *proto.WebMessageInfo
|
Source *proto.WebMessageInfo
|
||||||
}
|
}
|
||||||
@@ -162,7 +172,7 @@ func getInfoProto(info *MessageInfo) *proto.WebMessageInfo {
|
|||||||
}
|
}
|
||||||
info.FromMe = true
|
info.FromMe = true
|
||||||
|
|
||||||
status := proto.WebMessageInfo_STATUS(info.Status)
|
status := proto.WebMessageInfo_WEB_MESSAGE_INFO_STATUS(info.Status)
|
||||||
|
|
||||||
return &proto.WebMessageInfo{
|
return &proto.WebMessageInfo{
|
||||||
Key: &proto.MessageKey{
|
Key: &proto.MessageKey{
|
||||||
@@ -175,6 +185,22 @@ func getInfoProto(info *MessageInfo) *proto.WebMessageInfo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getContextInfoProto(info *MessageInfo) *proto.ContextInfo {
|
||||||
|
if len(info.QuotedMessageID) > 0 {
|
||||||
|
contextInfo := &proto.ContextInfo{
|
||||||
|
StanzaId: &info.QuotedMessageID,
|
||||||
|
}
|
||||||
|
|
||||||
|
if &info.QuotedMessage != nil {
|
||||||
|
contextInfo.QuotedMessage = &info.QuotedMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
return contextInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TextMessage represents a text message.
|
TextMessage represents a text message.
|
||||||
*/
|
*/
|
||||||
@@ -196,9 +222,21 @@ func getTextMessage(msg *proto.WebMessageInfo) TextMessage {
|
|||||||
|
|
||||||
func getTextProto(msg TextMessage) *proto.WebMessageInfo {
|
func getTextProto(msg TextMessage) *proto.WebMessageInfo {
|
||||||
p := getInfoProto(&msg.Info)
|
p := getInfoProto(&msg.Info)
|
||||||
p.Message = &proto.Message{
|
contextInfo := getContextInfoProto(&msg.Info)
|
||||||
Conversation: &msg.Text,
|
|
||||||
|
if contextInfo == nil {
|
||||||
|
p.Message = &proto.Message{
|
||||||
|
Conversation: &msg.Text,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p.Message = &proto.Message{
|
||||||
|
ExtendedTextMessage: &proto.ExtendedTextMessage{
|
||||||
|
Text: &msg.Text,
|
||||||
|
ContextInfo: contextInfo,
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,7 +259,8 @@ type ImageMessage struct {
|
|||||||
|
|
||||||
func getImageMessage(msg *proto.WebMessageInfo) ImageMessage {
|
func getImageMessage(msg *proto.WebMessageInfo) ImageMessage {
|
||||||
image := msg.GetMessage().GetImageMessage()
|
image := msg.GetMessage().GetImageMessage()
|
||||||
return ImageMessage{
|
|
||||||
|
imageMessage := ImageMessage{
|
||||||
Info: getMessageInfo(msg),
|
Info: getMessageInfo(msg),
|
||||||
Caption: image.GetCaption(),
|
Caption: image.GetCaption(),
|
||||||
Thumbnail: image.GetJpegThumbnail(),
|
Thumbnail: image.GetJpegThumbnail(),
|
||||||
@@ -232,10 +271,18 @@ func getImageMessage(msg *proto.WebMessageInfo) ImageMessage {
|
|||||||
fileSha256: image.GetFileSha256(),
|
fileSha256: image.GetFileSha256(),
|
||||||
fileLength: image.GetFileLength(),
|
fileLength: image.GetFileLength(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if contextInfo := image.GetContextInfo(); contextInfo != nil {
|
||||||
|
imageMessage.Info.QuotedMessageID = contextInfo.GetStanzaId()
|
||||||
|
}
|
||||||
|
|
||||||
|
return imageMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
func getImageProto(msg ImageMessage) *proto.WebMessageInfo {
|
func getImageProto(msg ImageMessage) *proto.WebMessageInfo {
|
||||||
p := getInfoProto(&msg.Info)
|
p := getInfoProto(&msg.Info)
|
||||||
|
contextInfo := getContextInfoProto(&msg.Info)
|
||||||
|
|
||||||
p.Message = &proto.Message{
|
p.Message = &proto.Message{
|
||||||
ImageMessage: &proto.ImageMessage{
|
ImageMessage: &proto.ImageMessage{
|
||||||
Caption: &msg.Caption,
|
Caption: &msg.Caption,
|
||||||
@@ -246,6 +293,7 @@ func getImageProto(msg ImageMessage) *proto.WebMessageInfo {
|
|||||||
FileEncSha256: msg.fileEncSha256,
|
FileEncSha256: msg.fileEncSha256,
|
||||||
FileSha256: msg.fileSha256,
|
FileSha256: msg.fileSha256,
|
||||||
FileLength: &msg.fileLength,
|
FileLength: &msg.fileLength,
|
||||||
|
ContextInfo: contextInfo,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
return p
|
return p
|
||||||
@@ -269,6 +317,7 @@ type VideoMessage struct {
|
|||||||
Length uint32
|
Length uint32
|
||||||
Type string
|
Type string
|
||||||
Content io.Reader
|
Content io.Reader
|
||||||
|
GifPlayback bool
|
||||||
url string
|
url string
|
||||||
mediaKey []byte
|
mediaKey []byte
|
||||||
fileEncSha256 []byte
|
fileEncSha256 []byte
|
||||||
@@ -278,10 +327,12 @@ type VideoMessage struct {
|
|||||||
|
|
||||||
func getVideoMessage(msg *proto.WebMessageInfo) VideoMessage {
|
func getVideoMessage(msg *proto.WebMessageInfo) VideoMessage {
|
||||||
vid := msg.GetMessage().GetVideoMessage()
|
vid := msg.GetMessage().GetVideoMessage()
|
||||||
return VideoMessage{
|
|
||||||
|
videoMessage := VideoMessage{
|
||||||
Info: getMessageInfo(msg),
|
Info: getMessageInfo(msg),
|
||||||
Caption: vid.GetCaption(),
|
Caption: vid.GetCaption(),
|
||||||
Thumbnail: vid.GetJpegThumbnail(),
|
Thumbnail: vid.GetJpegThumbnail(),
|
||||||
|
GifPlayback: vid.GetGifPlayback(),
|
||||||
url: vid.GetUrl(),
|
url: vid.GetUrl(),
|
||||||
mediaKey: vid.GetMediaKey(),
|
mediaKey: vid.GetMediaKey(),
|
||||||
Length: vid.GetSeconds(),
|
Length: vid.GetSeconds(),
|
||||||
@@ -290,21 +341,31 @@ func getVideoMessage(msg *proto.WebMessageInfo) VideoMessage {
|
|||||||
fileSha256: vid.GetFileSha256(),
|
fileSha256: vid.GetFileSha256(),
|
||||||
fileLength: vid.GetFileLength(),
|
fileLength: vid.GetFileLength(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if contextInfo := vid.GetContextInfo(); contextInfo != nil {
|
||||||
|
videoMessage.Info.QuotedMessageID = contextInfo.GetStanzaId()
|
||||||
|
}
|
||||||
|
|
||||||
|
return videoMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
func getVideoProto(msg VideoMessage) *proto.WebMessageInfo {
|
func getVideoProto(msg VideoMessage) *proto.WebMessageInfo {
|
||||||
p := getInfoProto(&msg.Info)
|
p := getInfoProto(&msg.Info)
|
||||||
|
contextInfo := getContextInfoProto(&msg.Info)
|
||||||
|
|
||||||
p.Message = &proto.Message{
|
p.Message = &proto.Message{
|
||||||
VideoMessage: &proto.VideoMessage{
|
VideoMessage: &proto.VideoMessage{
|
||||||
Caption: &msg.Caption,
|
Caption: &msg.Caption,
|
||||||
JpegThumbnail: msg.Thumbnail,
|
JpegThumbnail: msg.Thumbnail,
|
||||||
Url: &msg.url,
|
Url: &msg.url,
|
||||||
|
GifPlayback: &msg.GifPlayback,
|
||||||
MediaKey: msg.mediaKey,
|
MediaKey: msg.mediaKey,
|
||||||
Seconds: &msg.Length,
|
Seconds: &msg.Length,
|
||||||
FileEncSha256: msg.fileEncSha256,
|
FileEncSha256: msg.fileEncSha256,
|
||||||
FileSha256: msg.fileSha256,
|
FileSha256: msg.fileSha256,
|
||||||
FileLength: &msg.fileLength,
|
FileLength: &msg.fileLength,
|
||||||
Mimetype: &msg.Type,
|
Mimetype: &msg.Type,
|
||||||
|
ContextInfo: contextInfo,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
return p
|
return p
|
||||||
@@ -326,6 +387,7 @@ type AudioMessage struct {
|
|||||||
Length uint32
|
Length uint32
|
||||||
Type string
|
Type string
|
||||||
Content io.Reader
|
Content io.Reader
|
||||||
|
Ptt bool
|
||||||
url string
|
url string
|
||||||
mediaKey []byte
|
mediaKey []byte
|
||||||
fileEncSha256 []byte
|
fileEncSha256 []byte
|
||||||
@@ -335,7 +397,8 @@ type AudioMessage struct {
|
|||||||
|
|
||||||
func getAudioMessage(msg *proto.WebMessageInfo) AudioMessage {
|
func getAudioMessage(msg *proto.WebMessageInfo) AudioMessage {
|
||||||
aud := msg.GetMessage().GetAudioMessage()
|
aud := msg.GetMessage().GetAudioMessage()
|
||||||
return AudioMessage{
|
|
||||||
|
audioMessage := AudioMessage{
|
||||||
Info: getMessageInfo(msg),
|
Info: getMessageInfo(msg),
|
||||||
url: aud.GetUrl(),
|
url: aud.GetUrl(),
|
||||||
mediaKey: aud.GetMediaKey(),
|
mediaKey: aud.GetMediaKey(),
|
||||||
@@ -345,10 +408,17 @@ func getAudioMessage(msg *proto.WebMessageInfo) AudioMessage {
|
|||||||
fileSha256: aud.GetFileSha256(),
|
fileSha256: aud.GetFileSha256(),
|
||||||
fileLength: aud.GetFileLength(),
|
fileLength: aud.GetFileLength(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if contextInfo := aud.GetContextInfo(); contextInfo != nil {
|
||||||
|
audioMessage.Info.QuotedMessageID = contextInfo.GetStanzaId()
|
||||||
|
}
|
||||||
|
|
||||||
|
return audioMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
func getAudioProto(msg AudioMessage) *proto.WebMessageInfo {
|
func getAudioProto(msg AudioMessage) *proto.WebMessageInfo {
|
||||||
p := getInfoProto(&msg.Info)
|
p := getInfoProto(&msg.Info)
|
||||||
|
contextInfo := getContextInfoProto(&msg.Info)
|
||||||
p.Message = &proto.Message{
|
p.Message = &proto.Message{
|
||||||
AudioMessage: &proto.AudioMessage{
|
AudioMessage: &proto.AudioMessage{
|
||||||
Url: &msg.url,
|
Url: &msg.url,
|
||||||
@@ -358,6 +428,8 @@ func getAudioProto(msg AudioMessage) *proto.WebMessageInfo {
|
|||||||
FileSha256: msg.fileSha256,
|
FileSha256: msg.fileSha256,
|
||||||
FileLength: &msg.fileLength,
|
FileLength: &msg.fileLength,
|
||||||
Mimetype: &msg.Type,
|
Mimetype: &msg.Type,
|
||||||
|
ContextInfo: contextInfo,
|
||||||
|
Ptt: &msg.Ptt,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
return p
|
return p
|
||||||
@@ -391,7 +463,8 @@ type DocumentMessage struct {
|
|||||||
|
|
||||||
func getDocumentMessage(msg *proto.WebMessageInfo) DocumentMessage {
|
func getDocumentMessage(msg *proto.WebMessageInfo) DocumentMessage {
|
||||||
doc := msg.GetMessage().GetDocumentMessage()
|
doc := msg.GetMessage().GetDocumentMessage()
|
||||||
return DocumentMessage{
|
|
||||||
|
documentMessage := DocumentMessage{
|
||||||
Info: getMessageInfo(msg),
|
Info: getMessageInfo(msg),
|
||||||
Title: doc.GetTitle(),
|
Title: doc.GetTitle(),
|
||||||
PageCount: doc.GetPageCount(),
|
PageCount: doc.GetPageCount(),
|
||||||
@@ -404,10 +477,17 @@ func getDocumentMessage(msg *proto.WebMessageInfo) DocumentMessage {
|
|||||||
fileSha256: doc.GetFileSha256(),
|
fileSha256: doc.GetFileSha256(),
|
||||||
fileLength: doc.GetFileLength(),
|
fileLength: doc.GetFileLength(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if contextInfo := doc.GetContextInfo(); contextInfo != nil {
|
||||||
|
documentMessage.Info.QuotedMessageID = contextInfo.GetStanzaId()
|
||||||
|
}
|
||||||
|
|
||||||
|
return documentMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
func getDocumentProto(msg DocumentMessage) *proto.WebMessageInfo {
|
func getDocumentProto(msg DocumentMessage) *proto.WebMessageInfo {
|
||||||
p := getInfoProto(&msg.Info)
|
p := getInfoProto(&msg.Info)
|
||||||
|
contextInfo := getContextInfoProto(&msg.Info)
|
||||||
p.Message = &proto.Message{
|
p.Message = &proto.Message{
|
||||||
DocumentMessage: &proto.DocumentMessage{
|
DocumentMessage: &proto.DocumentMessage{
|
||||||
JpegThumbnail: msg.Thumbnail,
|
JpegThumbnail: msg.Thumbnail,
|
||||||
@@ -419,6 +499,7 @@ func getDocumentProto(msg DocumentMessage) *proto.WebMessageInfo {
|
|||||||
PageCount: &msg.PageCount,
|
PageCount: &msg.PageCount,
|
||||||
Title: &msg.Title,
|
Title: &msg.Title,
|
||||||
Mimetype: &msg.Type,
|
Mimetype: &msg.Type,
|
||||||
|
ContextInfo: contextInfo,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
return p
|
return p
|
||||||
@@ -431,7 +512,151 @@ func (m *DocumentMessage) Download() ([]byte, error) {
|
|||||||
return Download(m.url, m.mediaKey, MediaDocument, int(m.fileLength))
|
return Download(m.url, m.mediaKey, MediaDocument, int(m.fileLength))
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseProtoMessage(msg *proto.WebMessageInfo) interface{} {
|
/*
|
||||||
|
LocationMessage represents a location message
|
||||||
|
*/
|
||||||
|
type LocationMessage struct {
|
||||||
|
Info MessageInfo
|
||||||
|
DegreesLatitude float64
|
||||||
|
DegreesLongitude float64
|
||||||
|
Name string
|
||||||
|
Address string
|
||||||
|
Url string
|
||||||
|
JpegThumbnail []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetLocationMessage(msg *proto.WebMessageInfo) LocationMessage {
|
||||||
|
loc := msg.GetMessage().GetLocationMessage()
|
||||||
|
|
||||||
|
locationMessage := LocationMessage{
|
||||||
|
Info: getMessageInfo(msg),
|
||||||
|
DegreesLatitude: loc.GetDegreesLatitude(),
|
||||||
|
DegreesLongitude: loc.GetDegreesLongitude(),
|
||||||
|
Name: loc.GetName(),
|
||||||
|
Address: loc.GetAddress(),
|
||||||
|
Url: loc.GetUrl(),
|
||||||
|
JpegThumbnail: loc.GetJpegThumbnail(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if contextInfo := loc.GetContextInfo(); contextInfo != nil {
|
||||||
|
locationMessage.Info.QuotedMessageID = contextInfo.GetStanzaId()
|
||||||
|
}
|
||||||
|
|
||||||
|
return locationMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetLocationProto(msg LocationMessage) *proto.WebMessageInfo {
|
||||||
|
p := getInfoProto(&msg.Info)
|
||||||
|
contextInfo := getContextInfoProto(&msg.Info)
|
||||||
|
|
||||||
|
p.Message = &proto.Message{
|
||||||
|
LocationMessage: &proto.LocationMessage{
|
||||||
|
DegreesLatitude: &msg.DegreesLatitude,
|
||||||
|
DegreesLongitude: &msg.DegreesLongitude,
|
||||||
|
Name: &msg.Name,
|
||||||
|
Address: &msg.Address,
|
||||||
|
Url: &msg.Url,
|
||||||
|
JpegThumbnail: msg.JpegThumbnail,
|
||||||
|
ContextInfo: contextInfo,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
LiveLocationMessage represents a live location message
|
||||||
|
*/
|
||||||
|
type LiveLocationMessage struct {
|
||||||
|
Info MessageInfo
|
||||||
|
DegreesLatitude float64
|
||||||
|
DegreesLongitude float64
|
||||||
|
AccuracyInMeters uint32
|
||||||
|
SpeedInMps float32
|
||||||
|
DegreesClockwiseFromMagneticNorth uint32
|
||||||
|
Caption string
|
||||||
|
SequenceNumber int64
|
||||||
|
JpegThumbnail []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetLiveLocationMessage(msg *proto.WebMessageInfo) LiveLocationMessage {
|
||||||
|
loc := msg.GetMessage().GetLiveLocationMessage()
|
||||||
|
|
||||||
|
liveLocationMessage := LiveLocationMessage{
|
||||||
|
Info: getMessageInfo(msg),
|
||||||
|
DegreesLatitude: loc.GetDegreesLatitude(),
|
||||||
|
DegreesLongitude: loc.GetDegreesLongitude(),
|
||||||
|
AccuracyInMeters: loc.GetAccuracyInMeters(),
|
||||||
|
SpeedInMps: loc.GetSpeedInMps(),
|
||||||
|
DegreesClockwiseFromMagneticNorth: loc.GetDegreesClockwiseFromMagneticNorth(),
|
||||||
|
Caption: loc.GetCaption(),
|
||||||
|
SequenceNumber: loc.GetSequenceNumber(),
|
||||||
|
JpegThumbnail: loc.GetJpegThumbnail(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if contextInfo := loc.GetContextInfo(); contextInfo != nil {
|
||||||
|
liveLocationMessage.Info.QuotedMessageID = contextInfo.GetStanzaId()
|
||||||
|
}
|
||||||
|
|
||||||
|
return liveLocationMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetLiveLocationProto(msg LiveLocationMessage) *proto.WebMessageInfo {
|
||||||
|
p := getInfoProto(&msg.Info)
|
||||||
|
contextInfo := getContextInfoProto(&msg.Info)
|
||||||
|
p.Message = &proto.Message{
|
||||||
|
LiveLocationMessage: &proto.LiveLocationMessage{
|
||||||
|
DegreesLatitude: &msg.DegreesLatitude,
|
||||||
|
DegreesLongitude: &msg.DegreesLongitude,
|
||||||
|
AccuracyInMeters: &msg.AccuracyInMeters,
|
||||||
|
SpeedInMps: &msg.SpeedInMps,
|
||||||
|
DegreesClockwiseFromMagneticNorth: &msg.DegreesClockwiseFromMagneticNorth,
|
||||||
|
Caption: &msg.Caption,
|
||||||
|
SequenceNumber: &msg.SequenceNumber,
|
||||||
|
JpegThumbnail: msg.JpegThumbnail,
|
||||||
|
ContextInfo: contextInfo,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
StickerMessage represents a sticker message.
|
||||||
|
*/
|
||||||
|
type StickerMessage struct {
|
||||||
|
Info MessageInfo
|
||||||
|
|
||||||
|
Thumbnail []byte
|
||||||
|
Type string
|
||||||
|
Content io.Reader
|
||||||
|
url string
|
||||||
|
mediaKey []byte
|
||||||
|
fileEncSha256 []byte
|
||||||
|
fileSha256 []byte
|
||||||
|
fileLength uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
func getStickerMessage(msg *proto.WebMessageInfo) StickerMessage {
|
||||||
|
sticker := msg.GetMessage().GetStickerMessage()
|
||||||
|
|
||||||
|
StickerMessage := StickerMessage{
|
||||||
|
Info: getMessageInfo(msg),
|
||||||
|
Thumbnail: sticker.GetPngThumbnail(),
|
||||||
|
url: sticker.GetUrl(),
|
||||||
|
mediaKey: sticker.GetMediaKey(),
|
||||||
|
Type: sticker.GetMimetype(),
|
||||||
|
fileEncSha256: sticker.GetFileEncSha256(),
|
||||||
|
fileSha256: sticker.GetFileSha256(),
|
||||||
|
fileLength: sticker.GetFileLength(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if contextInfo := sticker.GetContextInfo(); contextInfo != nil {
|
||||||
|
StickerMessage.Info.QuotedMessageID = contextInfo.GetStanzaId()
|
||||||
|
}
|
||||||
|
|
||||||
|
return StickerMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseProtoMessage(msg *proto.WebMessageInfo) interface{} {
|
||||||
switch {
|
switch {
|
||||||
|
|
||||||
case msg.GetMessage().GetAudioMessage() != nil:
|
case msg.GetMessage().GetAudioMessage() != nil:
|
||||||
@@ -452,6 +677,15 @@ func parseProtoMessage(msg *proto.WebMessageInfo) interface{} {
|
|||||||
case msg.GetMessage().GetExtendedTextMessage() != nil:
|
case msg.GetMessage().GetExtendedTextMessage() != nil:
|
||||||
return getTextMessage(msg)
|
return getTextMessage(msg)
|
||||||
|
|
||||||
|
case msg.GetMessage().GetLocationMessage() != nil:
|
||||||
|
return GetLocationMessage(msg)
|
||||||
|
|
||||||
|
case msg.GetMessage().GetLiveLocationMessage() != nil:
|
||||||
|
return GetLiveLocationMessage(msg)
|
||||||
|
|
||||||
|
case msg.GetMessage().GetStickerMessage() != nil:
|
||||||
|
return getStickerMessage(msg)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
//cannot match message
|
//cannot match message
|
||||||
}
|
}
|
||||||
|
|||||||
25
vendor/github.com/Rhymen/go-whatsapp/read.go
generated
vendored
25
vendor/github.com/Rhymen/go-whatsapp/read.go
generated
vendored
@@ -3,6 +3,8 @@ package whatsapp
|
|||||||
import (
|
import (
|
||||||
"crypto/hmac"
|
"crypto/hmac"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"github.com/Rhymen/go-whatsapp/binary"
|
"github.com/Rhymen/go-whatsapp/binary"
|
||||||
"github.com/Rhymen/go-whatsapp/crypto/cbc"
|
"github.com/Rhymen/go-whatsapp/crypto/cbc"
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
@@ -75,7 +77,13 @@ func (wac *Conn) processReadData(msgType int, msg []byte) error {
|
|||||||
wac.listener.Lock()
|
wac.listener.Lock()
|
||||||
delete(wac.listener.m, data[0])
|
delete(wac.listener.m, data[0])
|
||||||
wac.listener.Unlock()
|
wac.listener.Unlock()
|
||||||
} else if msgType == websocket.BinaryMessage && wac.loggedIn {
|
} else if msgType == websocket.BinaryMessage {
|
||||||
|
wac.loginSessionLock.RLock()
|
||||||
|
sess := wac.session
|
||||||
|
wac.loginSessionLock.RUnlock()
|
||||||
|
if sess == nil || sess.MacKey == nil || sess.EncKey == nil {
|
||||||
|
return ErrInvalidWsState
|
||||||
|
}
|
||||||
message, err := wac.decryptBinaryMessage([]byte(data[1]))
|
message, err := wac.decryptBinaryMessage([]byte(data[1]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "error decoding binary")
|
return errors.Wrap(err, "error decoding binary")
|
||||||
@@ -90,6 +98,21 @@ func (wac *Conn) processReadData(msgType int, msg []byte) error {
|
|||||||
func (wac *Conn) decryptBinaryMessage(msg []byte) (*binary.Node, error) {
|
func (wac *Conn) decryptBinaryMessage(msg []byte) (*binary.Node, error) {
|
||||||
//message validation
|
//message validation
|
||||||
h2 := hmac.New(sha256.New, wac.session.MacKey)
|
h2 := hmac.New(sha256.New, wac.session.MacKey)
|
||||||
|
if len(msg) < 33 {
|
||||||
|
var response struct {
|
||||||
|
Status int `json:"status"`
|
||||||
|
}
|
||||||
|
err := json.Unmarshal(msg, &response)
|
||||||
|
if err == nil {
|
||||||
|
if response.Status == 404 {
|
||||||
|
return nil, ErrServerRespondedWith404
|
||||||
|
}
|
||||||
|
return nil, errors.New(fmt.Sprintf("server responded with %d", response.Status))
|
||||||
|
} else {
|
||||||
|
return nil, ErrInvalidServerResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
h2.Write([]byte(msg[32:]))
|
h2.Write([]byte(msg[32:]))
|
||||||
if !hmac.Equal(h2.Sum(nil), msg[:32]) {
|
if !hmac.Equal(h2.Sum(nil), msg[:32]) {
|
||||||
return nil, ErrInvalidHmac
|
return nil, ErrInvalidHmac
|
||||||
|
|||||||
64
vendor/github.com/Rhymen/go-whatsapp/session.go
generated
vendored
64
vendor/github.com/Rhymen/go-whatsapp/session.go
generated
vendored
@@ -7,6 +7,8 @@ import (
|
|||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -88,6 +90,53 @@ func newInfoFromReq(info map[string]interface{}) *Info {
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
CheckCurrentServerVersion is based on the login method logic in order to establish the websocket connection and get
|
||||||
|
the current version from the server with the `admin init` command. This can be very useful for automations in which
|
||||||
|
you need to quickly perceive new versions (mostly patches) and update your application so it suddenly stops working.
|
||||||
|
*/
|
||||||
|
func CheckCurrentServerVersion() ([]int, error) {
|
||||||
|
wac, err := NewConn(5 * time.Second)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("fail to create connection")
|
||||||
|
}
|
||||||
|
|
||||||
|
clientId := make([]byte, 16)
|
||||||
|
if _, err = rand.Read(clientId); err != nil {
|
||||||
|
return nil, fmt.Errorf("error creating random ClientId: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
b64ClientId := base64.StdEncoding.EncodeToString(clientId)
|
||||||
|
login := []interface{}{"admin", "init", waVersion, []string{wac.longClientName, wac.shortClientName}, b64ClientId, true}
|
||||||
|
loginChan, err := wac.writeJson(login)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("error writing login", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve an answer from the websocket
|
||||||
|
var r string
|
||||||
|
select {
|
||||||
|
case r = <-loginChan:
|
||||||
|
case <-time.After(wac.msgTimeout):
|
||||||
|
return nil, fmt.Errorf("login connection timed out")
|
||||||
|
}
|
||||||
|
|
||||||
|
var resp map[string]interface{}
|
||||||
|
if err = json.Unmarshal([]byte(r), &resp); err != nil {
|
||||||
|
return nil, fmt.Errorf("error decoding login", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Take the curr property as X.Y.Z and split it into as int slice
|
||||||
|
curr := resp["curr"].(string)
|
||||||
|
currArray := strings.Split(curr, ".")
|
||||||
|
version := make([]int, len(currArray))
|
||||||
|
for i := range version {
|
||||||
|
version[i], _ = strconv.Atoi(currArray[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
return version, nil
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SetClientName sets the long and short client names that are sent to WhatsApp when logging in and displayed in the
|
SetClientName sets the long and short client names that are sent to WhatsApp when logging in and displayed in the
|
||||||
WhatsApp Web device list. As the values are only sent when logging in, changing them after logging in is not possible.
|
WhatsApp Web device list. As the values are only sent when logging in, changing them after logging in is not possible.
|
||||||
@@ -100,6 +149,19 @@ func (wac *Conn) SetClientName(long, short string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SetClientVersion sets WhatsApp client version
|
||||||
|
Default value is 0.3.3324
|
||||||
|
*/
|
||||||
|
func (wac *Conn) SetClientVersion(major int, minor int, patch int) {
|
||||||
|
waVersion = []int{major, minor, patch}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetClientVersion returns WhatsApp client version
|
||||||
|
func (wac *Conn) GetClientVersion() []int {
|
||||||
|
return waVersion
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Login is the function that creates a new whatsapp session and logs you in. If you do not want to scan the qr code
|
Login is the function that creates a new whatsapp session and logs you in. If you do not want to scan the qr code
|
||||||
every time, you should save the returned session and use RestoreWithSession the next time. Login takes a writable channel
|
every time, you should save the returned session and use RestoreWithSession the next time. Login takes a writable channel
|
||||||
@@ -187,6 +249,8 @@ func (wac *Conn) Login(qrChan chan<- string) (Session, error) {
|
|||||||
var resp2 []interface{}
|
var resp2 []interface{}
|
||||||
select {
|
select {
|
||||||
case r1 := <-s1:
|
case r1 := <-s1:
|
||||||
|
wac.loginSessionLock.Lock()
|
||||||
|
defer wac.loginSessionLock.Unlock()
|
||||||
if err := json.Unmarshal([]byte(r1), &resp2); err != nil {
|
if err := json.Unmarshal([]byte(r1), &resp2); err != nil {
|
||||||
return session, fmt.Errorf("error decoding qr code resp: %v", err)
|
return session, fmt.Errorf("error decoding qr code resp: %v", err)
|
||||||
}
|
}
|
||||||
|
|||||||
30
vendor/github.com/Rhymen/go-whatsapp/write.go
generated
vendored
30
vendor/github.com/Rhymen/go-whatsapp/write.go
generated
vendored
@@ -78,6 +78,36 @@ func (wac *Conn) sendKeepAlive() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
When phone is unreachable, WhatsAppWeb sends ["admin","test"] time after time to try a successful contact.
|
||||||
|
Tested with Airplane mode and no connection at all.
|
||||||
|
*/
|
||||||
|
func (wac *Conn) sendAdminTest() (bool, error) {
|
||||||
|
data := []interface{}{"admin", "test"}
|
||||||
|
|
||||||
|
r, err := wac.writeJson(data)
|
||||||
|
if err != nil {
|
||||||
|
return false, errors.Wrap(err, "error sending admin test")
|
||||||
|
}
|
||||||
|
|
||||||
|
var response []interface{}
|
||||||
|
|
||||||
|
select {
|
||||||
|
case resp := <-r:
|
||||||
|
if err := json.Unmarshal([]byte(resp), &response); err != nil {
|
||||||
|
return false, fmt.Errorf("error decoding response message: %v\n", err)
|
||||||
|
}
|
||||||
|
case <-time.After(wac.msgTimeout):
|
||||||
|
return false, ErrConnectionTimeout
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(response) == 2 && response[0].(string) == "Pong" && response[1].(bool) == true {
|
||||||
|
return true, nil
|
||||||
|
} else {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (wac *Conn) write(messageType int, answerMessageTag string, data []byte) (<-chan string, error) {
|
func (wac *Conn) write(messageType int, answerMessageTag string, data []byte) (<-chan string, error) {
|
||||||
var ch chan string
|
var ch chan string
|
||||||
if answerMessageTag != "" {
|
if answerMessageTag != "" {
|
||||||
|
|||||||
2
vendor/github.com/bwmarrin/discordgo/README.md
generated
vendored
2
vendor/github.com/bwmarrin/discordgo/README.md
generated
vendored
@@ -1,6 +1,6 @@
|
|||||||
# DiscordGo
|
# DiscordGo
|
||||||
|
|
||||||
[](https://godoc.org/github.com/bwmarrin/discordgo) [](http://goreportcard.com/report/bwmarrin/discordgo) [](https://travis-ci.org/bwmarrin/discordgo) [](https://discord.gg/0f1SbxBZjYoCtNPP) [](https://discord.gg/0SBTUU1wZTWT6sqd)
|
[](https://godoc.org/github.com/bwmarrin/discordgo) [](http://goreportcard.com/report/bwmarrin/discordgo) [](https://travis-ci.org/bwmarrin/discordgo) [](https://discord.gg/0f1SbxBZjYoCtNPP) [](https://discordapp.com/invite/discord-api)
|
||||||
|
|
||||||
<img align="right" src="http://bwmarrin.github.io/discordgo/img/discordgo.png">
|
<img align="right" src="http://bwmarrin.github.io/discordgo/img/discordgo.png">
|
||||||
|
|
||||||
|
|||||||
3
vendor/github.com/bwmarrin/discordgo/discord.go
generated
vendored
3
vendor/github.com/bwmarrin/discordgo/discord.go
generated
vendored
@@ -21,7 +21,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// VERSION of DiscordGo, follows Semantic Versioning. (http://semver.org/)
|
// VERSION of DiscordGo, follows Semantic Versioning. (http://semver.org/)
|
||||||
const VERSION = "0.19.0"
|
const VERSION = "0.20.1"
|
||||||
|
|
||||||
// ErrMFA will be risen by New when the user has 2FA.
|
// ErrMFA will be risen by New when the user has 2FA.
|
||||||
var ErrMFA = errors.New("account has 2FA enabled")
|
var ErrMFA = errors.New("account has 2FA enabled")
|
||||||
@@ -58,6 +58,7 @@ func New(args ...interface{}) (s *Session, err error) {
|
|||||||
ShardCount: 1,
|
ShardCount: 1,
|
||||||
MaxRestRetries: 3,
|
MaxRestRetries: 3,
|
||||||
Client: &http.Client{Timeout: (20 * time.Second)},
|
Client: &http.Client{Timeout: (20 * time.Second)},
|
||||||
|
UserAgent: "DiscordBot (https://github.com/bwmarrin/discordgo, v" + VERSION + ")",
|
||||||
sequence: new(int64),
|
sequence: new(int64),
|
||||||
LastHeartbeatAck: time.Now().UTC(),
|
LastHeartbeatAck: time.Now().UTC(),
|
||||||
}
|
}
|
||||||
|
|||||||
12
vendor/github.com/bwmarrin/discordgo/endpoints.go
generated
vendored
12
vendor/github.com/bwmarrin/discordgo/endpoints.go
generated
vendored
@@ -38,6 +38,7 @@ var (
|
|||||||
EndpointCDNIcons = EndpointCDN + "icons/"
|
EndpointCDNIcons = EndpointCDN + "icons/"
|
||||||
EndpointCDNSplashes = EndpointCDN + "splashes/"
|
EndpointCDNSplashes = EndpointCDN + "splashes/"
|
||||||
EndpointCDNChannelIcons = EndpointCDN + "channel-icons/"
|
EndpointCDNChannelIcons = EndpointCDN + "channel-icons/"
|
||||||
|
EndpointCDNBanners = EndpointCDN + "banners/"
|
||||||
|
|
||||||
EndpointAuth = EndpointAPI + "auth/"
|
EndpointAuth = EndpointAPI + "auth/"
|
||||||
EndpointLogin = EndpointAuth + "login"
|
EndpointLogin = EndpointAuth + "login"
|
||||||
@@ -92,11 +93,13 @@ var (
|
|||||||
EndpointGuildEmbed = func(gID string) string { return EndpointGuilds + gID + "/embed" }
|
EndpointGuildEmbed = func(gID string) string { return EndpointGuilds + gID + "/embed" }
|
||||||
EndpointGuildPrune = func(gID string) string { return EndpointGuilds + gID + "/prune" }
|
EndpointGuildPrune = func(gID string) string { return EndpointGuilds + gID + "/prune" }
|
||||||
EndpointGuildIcon = func(gID, hash string) string { return EndpointCDNIcons + gID + "/" + hash + ".png" }
|
EndpointGuildIcon = func(gID, hash string) string { return EndpointCDNIcons + gID + "/" + hash + ".png" }
|
||||||
|
EndpointGuildIconAnimated = func(gID, hash string) string { return EndpointCDNIcons + gID + "/" + hash + ".gif" }
|
||||||
EndpointGuildSplash = func(gID, hash string) string { return EndpointCDNSplashes + gID + "/" + hash + ".png" }
|
EndpointGuildSplash = func(gID, hash string) string { return EndpointCDNSplashes + gID + "/" + hash + ".png" }
|
||||||
EndpointGuildWebhooks = func(gID string) string { return EndpointGuilds + gID + "/webhooks" }
|
EndpointGuildWebhooks = func(gID string) string { return EndpointGuilds + gID + "/webhooks" }
|
||||||
EndpointGuildAuditLogs = func(gID string) string { return EndpointGuilds + gID + "/audit-logs" }
|
EndpointGuildAuditLogs = func(gID string) string { return EndpointGuilds + gID + "/audit-logs" }
|
||||||
EndpointGuildEmojis = func(gID string) string { return EndpointGuilds + gID + "/emojis" }
|
EndpointGuildEmojis = func(gID string) string { return EndpointGuilds + gID + "/emojis" }
|
||||||
EndpointGuildEmoji = func(gID, eID string) string { return EndpointGuilds + gID + "/emojis/" + eID }
|
EndpointGuildEmoji = func(gID, eID string) string { return EndpointGuilds + gID + "/emojis/" + eID }
|
||||||
|
EndpointGuildBanner = func(gID, hash string) string { return EndpointCDNBanners + gID + "/" + hash + ".png" }
|
||||||
|
|
||||||
EndpointChannel = func(cID string) string { return EndpointChannels + cID }
|
EndpointChannel = func(cID string) string { return EndpointChannels + cID }
|
||||||
EndpointChannelPermissions = func(cID string) string { return EndpointChannels + cID + "/permissions" }
|
EndpointChannelPermissions = func(cID string) string { return EndpointChannels + cID + "/permissions" }
|
||||||
@@ -139,8 +142,9 @@ var (
|
|||||||
EndpointEmoji = func(eID string) string { return EndpointAPI + "emojis/" + eID + ".png" }
|
EndpointEmoji = func(eID string) string { return EndpointAPI + "emojis/" + eID + ".png" }
|
||||||
EndpointEmojiAnimated = func(eID string) string { return EndpointAPI + "emojis/" + eID + ".gif" }
|
EndpointEmojiAnimated = func(eID string) string { return EndpointAPI + "emojis/" + eID + ".gif" }
|
||||||
|
|
||||||
EndpointOauth2 = EndpointAPI + "oauth2/"
|
EndpointOauth2 = EndpointAPI + "oauth2/"
|
||||||
EndpointApplications = EndpointOauth2 + "applications"
|
EndpointApplications = EndpointOauth2 + "applications"
|
||||||
EndpointApplication = func(aID string) string { return EndpointApplications + "/" + aID }
|
EndpointApplication = func(aID string) string { return EndpointApplications + "/" + aID }
|
||||||
EndpointApplicationsBot = func(aID string) string { return EndpointApplications + "/" + aID + "/bot" }
|
EndpointApplicationsBot = func(aID string) string { return EndpointApplications + "/" + aID + "/bot" }
|
||||||
|
EndpointApplicationAssets = func(aID string) string { return EndpointApplications + "/" + aID + "/assets" }
|
||||||
)
|
)
|
||||||
|
|||||||
8
vendor/github.com/bwmarrin/discordgo/events.go
generated
vendored
8
vendor/github.com/bwmarrin/discordgo/events.go
generated
vendored
@@ -10,15 +10,15 @@ import (
|
|||||||
//go:generate go run tools/cmd/eventhandlers/main.go
|
//go:generate go run tools/cmd/eventhandlers/main.go
|
||||||
|
|
||||||
// Connect is the data for a Connect event.
|
// Connect is the data for a Connect event.
|
||||||
// This is a sythetic event and is not dispatched by Discord.
|
// This is a synthetic event and is not dispatched by Discord.
|
||||||
type Connect struct{}
|
type Connect struct{}
|
||||||
|
|
||||||
// Disconnect is the data for a Disconnect event.
|
// Disconnect is the data for a Disconnect event.
|
||||||
// This is a sythetic event and is not dispatched by Discord.
|
// This is a synthetic event and is not dispatched by Discord.
|
||||||
type Disconnect struct{}
|
type Disconnect struct{}
|
||||||
|
|
||||||
// RateLimit is the data for a RateLimit event.
|
// RateLimit is the data for a RateLimit event.
|
||||||
// This is a sythetic event and is not dispatched by Discord.
|
// This is a synthetic event and is not dispatched by Discord.
|
||||||
type RateLimit struct {
|
type RateLimit struct {
|
||||||
*TooManyRequests
|
*TooManyRequests
|
||||||
URL string
|
URL string
|
||||||
@@ -162,6 +162,8 @@ type MessageCreate struct {
|
|||||||
// MessageUpdate is the data for a MessageUpdate event.
|
// MessageUpdate is the data for a MessageUpdate event.
|
||||||
type MessageUpdate struct {
|
type MessageUpdate struct {
|
||||||
*Message
|
*Message
|
||||||
|
// BeforeUpdate will be nil if the Message was not previously cached in the state cache.
|
||||||
|
BeforeUpdate *Message `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// MessageDelete is the data for a MessageDelete event.
|
// MessageDelete is the data for a MessageDelete event.
|
||||||
|
|||||||
79
vendor/github.com/bwmarrin/discordgo/message.go
generated
vendored
79
vendor/github.com/bwmarrin/discordgo/message.go
generated
vendored
@@ -28,6 +28,11 @@ const (
|
|||||||
MessageTypeChannelIconChange
|
MessageTypeChannelIconChange
|
||||||
MessageTypeChannelPinnedMessage
|
MessageTypeChannelPinnedMessage
|
||||||
MessageTypeGuildMemberJoin
|
MessageTypeGuildMemberJoin
|
||||||
|
MessageTypeUserPremiumGuildSubscription
|
||||||
|
MessageTypeUserPremiumGuildSubscriptionTierOne
|
||||||
|
MessageTypeUserPremiumGuildSubscriptionTierTwo
|
||||||
|
MessageTypeUserPremiumGuildSubscriptionTierThree
|
||||||
|
MessageTypeChannelFollowAdd
|
||||||
)
|
)
|
||||||
|
|
||||||
// A Message stores all data related to a specific Discord message.
|
// A Message stores all data related to a specific Discord message.
|
||||||
@@ -80,11 +85,39 @@ type Message struct {
|
|||||||
// A list of reactions to the message.
|
// A list of reactions to the message.
|
||||||
Reactions []*MessageReactions `json:"reactions"`
|
Reactions []*MessageReactions `json:"reactions"`
|
||||||
|
|
||||||
|
// Whether the message is pinned or not.
|
||||||
|
Pinned bool `json:"pinned"`
|
||||||
|
|
||||||
// The type of the message.
|
// The type of the message.
|
||||||
Type MessageType `json:"type"`
|
Type MessageType `json:"type"`
|
||||||
|
|
||||||
// The webhook ID of the message, if it was generated by a webhook
|
// The webhook ID of the message, if it was generated by a webhook
|
||||||
WebhookID string `json:"webhook_id"`
|
WebhookID string `json:"webhook_id"`
|
||||||
|
|
||||||
|
// Member properties for this message's author,
|
||||||
|
// contains only partial information
|
||||||
|
Member *Member `json:"member"`
|
||||||
|
|
||||||
|
// Channels specifically mentioned in this message
|
||||||
|
// Not all channel mentions in a message will appear in mention_channels.
|
||||||
|
// Only textual channels that are visible to everyone in a lurkable guild will ever be included.
|
||||||
|
// Only crossposted messages (via Channel Following) currently include mention_channels at all.
|
||||||
|
// If no mentions in the message meet these requirements, this field will not be sent.
|
||||||
|
MentionChannels []*Channel `json:"mention_channels"`
|
||||||
|
|
||||||
|
// Is sent with Rich Presence-related chat embeds
|
||||||
|
Activity *MessageActivity `json:"activity"`
|
||||||
|
|
||||||
|
// Is sent with Rich Presence-related chat embeds
|
||||||
|
Application *MessageApplication `json:"application"`
|
||||||
|
|
||||||
|
// MessageReference contains reference data sent with crossposted messages
|
||||||
|
MessageReference *MessageReference `json:"message_reference"`
|
||||||
|
|
||||||
|
// The flags of the message, which describe extra features of a message.
|
||||||
|
// This is a combination of bit masks; the presence of a certain permission can
|
||||||
|
// be checked by performing a bitwise AND between this int and the flag.
|
||||||
|
Flags int `json:"flags"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// File stores info about files you e.g. send in messages.
|
// File stores info about files you e.g. send in messages.
|
||||||
@@ -225,6 +258,52 @@ type MessageReactions struct {
|
|||||||
Emoji *Emoji `json:"emoji"`
|
Emoji *Emoji `json:"emoji"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MessageActivity is sent with Rich Presence-related chat embeds
|
||||||
|
type MessageActivity struct {
|
||||||
|
Type MessageActivityType `json:"type"`
|
||||||
|
PartyID string `json:"party_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// MessageActivityType is the type of message activity
|
||||||
|
type MessageActivityType int
|
||||||
|
|
||||||
|
// Constants for the different types of Message Activity
|
||||||
|
const (
|
||||||
|
MessageActivityTypeJoin = iota + 1
|
||||||
|
MessageActivityTypeSpectate
|
||||||
|
MessageActivityTypeListen
|
||||||
|
MessageActivityTypeJoinRequest
|
||||||
|
)
|
||||||
|
|
||||||
|
// MessageFlag describes an extra feature of the message
|
||||||
|
type MessageFlag int
|
||||||
|
|
||||||
|
// Constants for the different bit offsets of Message Flags
|
||||||
|
const (
|
||||||
|
// This message has been published to subscribed channels (via Channel Following)
|
||||||
|
MessageFlagCrossposted = 1 << iota
|
||||||
|
// This message originated from a message in another channel (via Channel Following)
|
||||||
|
MessageFlagIsCrosspost
|
||||||
|
// Do not include any embeds when serializing this message
|
||||||
|
MessageFlagSuppressEmbeds
|
||||||
|
)
|
||||||
|
|
||||||
|
// MessageApplication is sent with Rich Presence-related chat embeds
|
||||||
|
type MessageApplication struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
CoverImage string `json:"cover_image"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
Icon string `json:"icon"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// MessageReference contains reference data sent with crossposted messages
|
||||||
|
type MessageReference struct {
|
||||||
|
MessageID string `json:"message_id"`
|
||||||
|
ChannelID string `json:"channel_id"`
|
||||||
|
GuildID string `json:"guild_id"`
|
||||||
|
}
|
||||||
|
|
||||||
// ContentWithMentionsReplaced will replace all @<id> mentions with the
|
// ContentWithMentionsReplaced will replace all @<id> mentions with the
|
||||||
// username of the mention.
|
// username of the mention.
|
||||||
func (m *Message) ContentWithMentionsReplaced() (content string) {
|
func (m *Message) ContentWithMentionsReplaced() (content string) {
|
||||||
|
|||||||
19
vendor/github.com/bwmarrin/discordgo/oauth2.go
generated
vendored
19
vendor/github.com/bwmarrin/discordgo/oauth2.go
generated
vendored
@@ -105,6 +105,25 @@ func (s *Session) ApplicationDelete(appID string) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Asset struct stores values for an asset of an application
|
||||||
|
type Asset struct {
|
||||||
|
Type int `json:"type"`
|
||||||
|
ID string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ApplicationAssets returns an application's assets
|
||||||
|
func (s *Session) ApplicationAssets(appID string) (ass []*Asset, err error) {
|
||||||
|
|
||||||
|
body, err := s.RequestWithBucketID("GET", EndpointApplicationAssets(appID), nil, EndpointApplicationAssets(""))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = unmarshal(body, &ass)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Code specific to Discord OAuth2 Application Bots
|
// Code specific to Discord OAuth2 Application Bots
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
83
vendor/github.com/bwmarrin/discordgo/restapi.go
generated
vendored
83
vendor/github.com/bwmarrin/discordgo/restapi.go
generated
vendored
@@ -90,7 +90,7 @@ func (s *Session) RequestWithLockedBucket(method, urlStr, contentType string, b
|
|||||||
|
|
||||||
req.Header.Set("Content-Type", contentType)
|
req.Header.Set("Content-Type", contentType)
|
||||||
// TODO: Make a configurable static variable.
|
// TODO: Make a configurable static variable.
|
||||||
req.Header.Set("User-Agent", "DiscordBot (https://github.com/bwmarrin/discordgo, v"+VERSION+")")
|
req.Header.Set("User-Agent", s.UserAgent)
|
||||||
|
|
||||||
if s.Debug {
|
if s.Debug {
|
||||||
for k, v := range req.Header {
|
for k, v := range req.Header {
|
||||||
@@ -617,10 +617,10 @@ func (s *Session) GuildCreate(name string) (st *Guild, err error) {
|
|||||||
// g : A GuildParams struct with the values Name, Region and VerificationLevel defined.
|
// g : A GuildParams struct with the values Name, Region and VerificationLevel defined.
|
||||||
func (s *Session) GuildEdit(guildID string, g GuildParams) (st *Guild, err error) {
|
func (s *Session) GuildEdit(guildID string, g GuildParams) (st *Guild, err error) {
|
||||||
|
|
||||||
// Bounds checking for VerificationLevel, interval: [0, 3]
|
// Bounds checking for VerificationLevel, interval: [0, 4]
|
||||||
if g.VerificationLevel != nil {
|
if g.VerificationLevel != nil {
|
||||||
val := *g.VerificationLevel
|
val := *g.VerificationLevel
|
||||||
if val < 0 || val > 3 {
|
if val < 0 || val > 4 {
|
||||||
err = ErrVerificationLevelBounds
|
err = ErrVerificationLevelBounds
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -675,7 +675,7 @@ func (s *Session) GuildLeave(guildID string) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// GuildBans returns an array of User structures for all bans of a
|
// GuildBans returns an array of GuildBan structures for all bans of a
|
||||||
// given guild.
|
// given guild.
|
||||||
// guildID : The ID of a Guild.
|
// guildID : The ID of a Guild.
|
||||||
func (s *Session) GuildBans(guildID string) (st []*GuildBan, err error) {
|
func (s *Session) GuildBans(guildID string) (st []*GuildBan, err error) {
|
||||||
@@ -2067,15 +2067,80 @@ func (s *Session) WebhookDeleteWithToken(webhookID, token string) (st *Webhook,
|
|||||||
// WebhookExecute executes a webhook.
|
// WebhookExecute executes a webhook.
|
||||||
// webhookID: The ID of a webhook.
|
// webhookID: The ID of a webhook.
|
||||||
// token : The auth token for the webhook
|
// token : The auth token for the webhook
|
||||||
func (s *Session) WebhookExecute(webhookID, token string, wait bool, data *WebhookParams) (err error) {
|
// wait : Waits for server confirmation of message send and ensures that the return struct is populated (it is nil otherwise)
|
||||||
|
//
|
||||||
|
// If `wait` is `false`, the returned *Message is always empty, because server
|
||||||
|
// does not provide the response data.
|
||||||
|
func (s *Session) WebhookExecute(webhookID, token string, wait bool, data *WebhookParams) (st *Message, err error) {
|
||||||
uri := EndpointWebhookToken(webhookID, token)
|
uri := EndpointWebhookToken(webhookID, token)
|
||||||
|
|
||||||
if wait {
|
if wait {
|
||||||
uri += "?wait=true"
|
uri += "?wait=true"
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = s.RequestWithBucketID("POST", uri, data, EndpointWebhookToken("", ""))
|
var response []byte
|
||||||
|
if data.File != nil {
|
||||||
|
body := &bytes.Buffer{}
|
||||||
|
bodywriter := multipart.NewWriter(body)
|
||||||
|
|
||||||
|
var payload []byte
|
||||||
|
payload, err = json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var p io.Writer
|
||||||
|
|
||||||
|
h := make(textproto.MIMEHeader)
|
||||||
|
h.Set("Content-Disposition", `form-data; name="payload_json"`)
|
||||||
|
h.Set("Content-Type", "application/json")
|
||||||
|
|
||||||
|
p, err = bodywriter.CreatePart(h)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = p.Write(payload); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
file := data.File
|
||||||
|
h := make(textproto.MIMEHeader)
|
||||||
|
h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="file"; filename="%s"`, quoteEscaper.Replace(file.Name)))
|
||||||
|
contentType := file.ContentType
|
||||||
|
if contentType == "" {
|
||||||
|
contentType = "application/octet-stream"
|
||||||
|
}
|
||||||
|
h.Set("Content-Type", contentType)
|
||||||
|
|
||||||
|
p, err = bodywriter.CreatePart(h)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = io.Copy(p, file.Reader); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = bodywriter.Close()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err = s.request("POST", uri, bodywriter.FormDataContentType(), body.Bytes(), EndpointWebhookToken("", ""), 0)
|
||||||
|
} else {
|
||||||
|
response, err = s.RequestWithBucketID("POST", uri, data, EndpointWebhookToken("", ""))
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !wait {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = unmarshal(response, &st)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2085,6 +2150,8 @@ func (s *Session) WebhookExecute(webhookID, token string, wait bool, data *Webho
|
|||||||
// emojiID : Either the unicode emoji for the reaction, or a guild emoji identifier.
|
// emojiID : Either the unicode emoji for the reaction, or a guild emoji identifier.
|
||||||
func (s *Session) MessageReactionAdd(channelID, messageID, emojiID string) error {
|
func (s *Session) MessageReactionAdd(channelID, messageID, emojiID string) error {
|
||||||
|
|
||||||
|
// emoji such as #⃣ need to have # escaped
|
||||||
|
emojiID = strings.Replace(emojiID, "#", "%23", -1)
|
||||||
_, err := s.RequestWithBucketID("PUT", EndpointMessageReaction(channelID, messageID, emojiID, "@me"), nil, EndpointMessageReaction(channelID, "", "", ""))
|
_, err := s.RequestWithBucketID("PUT", EndpointMessageReaction(channelID, messageID, emojiID, "@me"), nil, EndpointMessageReaction(channelID, "", "", ""))
|
||||||
|
|
||||||
return err
|
return err
|
||||||
@@ -2097,6 +2164,8 @@ func (s *Session) MessageReactionAdd(channelID, messageID, emojiID string) error
|
|||||||
// userID : @me or ID of the user to delete the reaction for.
|
// userID : @me or ID of the user to delete the reaction for.
|
||||||
func (s *Session) MessageReactionRemove(channelID, messageID, emojiID, userID string) error {
|
func (s *Session) MessageReactionRemove(channelID, messageID, emojiID, userID string) error {
|
||||||
|
|
||||||
|
// emoji such as #⃣ need to have # escaped
|
||||||
|
emojiID = strings.Replace(emojiID, "#", "%23", -1)
|
||||||
_, err := s.RequestWithBucketID("DELETE", EndpointMessageReaction(channelID, messageID, emojiID, userID), nil, EndpointMessageReaction(channelID, "", "", ""))
|
_, err := s.RequestWithBucketID("DELETE", EndpointMessageReaction(channelID, messageID, emojiID, userID), nil, EndpointMessageReaction(channelID, "", "", ""))
|
||||||
|
|
||||||
return err
|
return err
|
||||||
@@ -2118,6 +2187,8 @@ func (s *Session) MessageReactionsRemoveAll(channelID, messageID string) error {
|
|||||||
// emojiID : Either the unicode emoji for the reaction, or a guild emoji identifier.
|
// emojiID : Either the unicode emoji for the reaction, or a guild emoji identifier.
|
||||||
// limit : max number of users to return (max 100)
|
// limit : max number of users to return (max 100)
|
||||||
func (s *Session) MessageReactions(channelID, messageID, emojiID string, limit int) (st []*User, err error) {
|
func (s *Session) MessageReactions(channelID, messageID, emojiID string, limit int) (st []*User, err error) {
|
||||||
|
// emoji such as #⃣ need to have # escaped
|
||||||
|
emojiID = strings.Replace(emojiID, "#", "%23", -1)
|
||||||
uri := EndpointMessageReactions(channelID, messageID, emojiID)
|
uri := EndpointMessageReactions(channelID, messageID, emojiID)
|
||||||
|
|
||||||
v := url.Values{}
|
v := url.Values{}
|
||||||
|
|||||||
7
vendor/github.com/bwmarrin/discordgo/state.go
generated
vendored
7
vendor/github.com/bwmarrin/discordgo/state.go
generated
vendored
@@ -882,6 +882,13 @@ func (s *State) OnInterface(se *Session, i interface{}) (err error) {
|
|||||||
}
|
}
|
||||||
case *MessageUpdate:
|
case *MessageUpdate:
|
||||||
if s.MaxMessageCount != 0 {
|
if s.MaxMessageCount != 0 {
|
||||||
|
var old *Message
|
||||||
|
old, err = s.Message(t.ChannelID, t.ID)
|
||||||
|
if err == nil {
|
||||||
|
oldCopy := *old
|
||||||
|
t.BeforeUpdate = &oldCopy
|
||||||
|
}
|
||||||
|
|
||||||
err = s.MessageAdd(t.Message)
|
err = s.MessageAdd(t.Message)
|
||||||
}
|
}
|
||||||
case *MessageDelete:
|
case *MessageDelete:
|
||||||
|
|||||||
68
vendor/github.com/bwmarrin/discordgo/structs.go
generated
vendored
68
vendor/github.com/bwmarrin/discordgo/structs.go
generated
vendored
@@ -15,6 +15,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -82,6 +83,9 @@ type Session struct {
|
|||||||
// The http client used for REST requests
|
// The http client used for REST requests
|
||||||
Client *http.Client
|
Client *http.Client
|
||||||
|
|
||||||
|
// The user agent used for REST APIs
|
||||||
|
UserAgent string
|
||||||
|
|
||||||
// Stores the last HeartbeatAck that was recieved (in UTC)
|
// Stores the last HeartbeatAck that was recieved (in UTC)
|
||||||
LastHeartbeatAck time.Time
|
LastHeartbeatAck time.Time
|
||||||
|
|
||||||
@@ -196,6 +200,8 @@ const (
|
|||||||
ChannelTypeGuildVoice
|
ChannelTypeGuildVoice
|
||||||
ChannelTypeGroupDM
|
ChannelTypeGroupDM
|
||||||
ChannelTypeGuildCategory
|
ChannelTypeGuildCategory
|
||||||
|
ChannelTypeGuildNews
|
||||||
|
ChannelTypeGuildStore
|
||||||
)
|
)
|
||||||
|
|
||||||
// A Channel holds all data related to an individual Discord channel.
|
// A Channel holds all data related to an individual Discord channel.
|
||||||
@@ -220,6 +226,10 @@ type Channel struct {
|
|||||||
// guaranteed to be an ID of a valid message.
|
// guaranteed to be an ID of a valid message.
|
||||||
LastMessageID string `json:"last_message_id"`
|
LastMessageID string `json:"last_message_id"`
|
||||||
|
|
||||||
|
// The timestamp of the last pinned message in the channel.
|
||||||
|
// Empty if the channel has no pinned messages.
|
||||||
|
LastPinTimestamp Timestamp `json:"last_pin_timestamp"`
|
||||||
|
|
||||||
// Whether the channel is marked as NSFW.
|
// Whether the channel is marked as NSFW.
|
||||||
NSFW bool `json:"nsfw"`
|
NSFW bool `json:"nsfw"`
|
||||||
|
|
||||||
@@ -247,6 +257,10 @@ type Channel struct {
|
|||||||
|
|
||||||
// The ID of the parent channel, if the channel is under a category
|
// The ID of the parent channel, if the channel is under a category
|
||||||
ParentID string `json:"parent_id"`
|
ParentID string `json:"parent_id"`
|
||||||
|
|
||||||
|
// Amount of seconds a user has to wait before sending another message (0-21600)
|
||||||
|
// bots, as well as users with the permission manage_messages or manage_channel, are unaffected
|
||||||
|
RateLimitPerUser int `json:"rate_limit_per_user"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mention returns a string which mentions the channel
|
// Mention returns a string which mentions the channel
|
||||||
@@ -283,6 +297,7 @@ type Emoji struct {
|
|||||||
Managed bool `json:"managed"`
|
Managed bool `json:"managed"`
|
||||||
RequireColons bool `json:"require_colons"`
|
RequireColons bool `json:"require_colons"`
|
||||||
Animated bool `json:"animated"`
|
Animated bool `json:"animated"`
|
||||||
|
Available bool `json:"available"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// MessageFormat returns a correctly formatted Emoji for use in Message content and embeds
|
// MessageFormat returns a correctly formatted Emoji for use in Message content and embeds
|
||||||
@@ -312,12 +327,13 @@ func (e *Emoji) APIName() string {
|
|||||||
// VerificationLevel type definition
|
// VerificationLevel type definition
|
||||||
type VerificationLevel int
|
type VerificationLevel int
|
||||||
|
|
||||||
// Constants for VerificationLevel levels from 0 to 3 inclusive
|
// Constants for VerificationLevel levels from 0 to 4 inclusive
|
||||||
const (
|
const (
|
||||||
VerificationLevelNone VerificationLevel = iota
|
VerificationLevelNone VerificationLevel = iota
|
||||||
VerificationLevelLow
|
VerificationLevelLow
|
||||||
VerificationLevelMedium
|
VerificationLevelMedium
|
||||||
VerificationLevelHigh
|
VerificationLevelHigh
|
||||||
|
VerificationLevelVeryHigh
|
||||||
)
|
)
|
||||||
|
|
||||||
// ExplicitContentFilterLevel type definition
|
// ExplicitContentFilterLevel type definition
|
||||||
@@ -339,6 +355,17 @@ const (
|
|||||||
MfaLevelElevated
|
MfaLevelElevated
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// PremiumTier type definition
|
||||||
|
type PremiumTier int
|
||||||
|
|
||||||
|
// Constants for PremiumTier levels from 0 to 3 inclusive
|
||||||
|
const (
|
||||||
|
PremiumTierNone PremiumTier = iota
|
||||||
|
PremiumTier1
|
||||||
|
PremiumTier2
|
||||||
|
PremiumTier3
|
||||||
|
)
|
||||||
|
|
||||||
// A Guild holds all data related to a specific Discord Guild. Guilds are also
|
// A Guild holds all data related to a specific Discord Guild. Guilds are also
|
||||||
// sometimes referred to as Servers in the Discord client.
|
// sometimes referred to as Servers in the Discord client.
|
||||||
type Guild struct {
|
type Guild struct {
|
||||||
@@ -443,6 +470,34 @@ type Guild struct {
|
|||||||
|
|
||||||
// The Channel ID to which system messages are sent (eg join and leave messages)
|
// The Channel ID to which system messages are sent (eg join and leave messages)
|
||||||
SystemChannelID string `json:"system_channel_id"`
|
SystemChannelID string `json:"system_channel_id"`
|
||||||
|
|
||||||
|
// the vanity url code for the guild
|
||||||
|
VanityURLCode string `json:"vanity_url_code"`
|
||||||
|
|
||||||
|
// the description for the guild
|
||||||
|
Description string `json:"description"`
|
||||||
|
|
||||||
|
// The hash of the guild's banner
|
||||||
|
Banner string `json:"banner"`
|
||||||
|
|
||||||
|
// The premium tier of the guild
|
||||||
|
PremiumTier PremiumTier `json:"premium_tier"`
|
||||||
|
|
||||||
|
// The total number of users currently boosting this server
|
||||||
|
PremiumSubscriptionCount int `json:"premium_subscription_count"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// IconURL returns a URL to the guild's icon.
|
||||||
|
func (g *Guild) IconURL() string {
|
||||||
|
if g.Icon == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(g.Icon, "a_") {
|
||||||
|
return EndpointGuildIconAnimated(g.ID, g.Icon)
|
||||||
|
}
|
||||||
|
|
||||||
|
return EndpointGuildIcon(g.ID, g.Icon)
|
||||||
}
|
}
|
||||||
|
|
||||||
// A UserGuild holds a brief version of a Guild
|
// A UserGuild holds a brief version of a Guild
|
||||||
@@ -617,6 +672,9 @@ type Member struct {
|
|||||||
|
|
||||||
// A list of IDs of the roles which are possessed by the member.
|
// A list of IDs of the roles which are possessed by the member.
|
||||||
Roles []string `json:"roles"`
|
Roles []string `json:"roles"`
|
||||||
|
|
||||||
|
// When the user used their Nitro boost on the server
|
||||||
|
PremiumSince Timestamp `json:"premium_since"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mention creates a member mention
|
// Mention creates a member mention
|
||||||
@@ -832,7 +890,7 @@ type WebhookParams struct {
|
|||||||
Username string `json:"username,omitempty"`
|
Username string `json:"username,omitempty"`
|
||||||
AvatarURL string `json:"avatar_url,omitempty"`
|
AvatarURL string `json:"avatar_url,omitempty"`
|
||||||
TTS bool `json:"tts,omitempty"`
|
TTS bool `json:"tts,omitempty"`
|
||||||
File string `json:"file,omitempty"`
|
File *File `json:"-"`
|
||||||
Embeds []*MessageEmbed `json:"embeds,omitempty"`
|
Embeds []*MessageEmbed `json:"embeds,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -872,6 +930,7 @@ const (
|
|||||||
PermissionVoiceDeafenMembers
|
PermissionVoiceDeafenMembers
|
||||||
PermissionVoiceMoveMembers
|
PermissionVoiceMoveMembers
|
||||||
PermissionVoiceUseVAD
|
PermissionVoiceUseVAD
|
||||||
|
PermissionVoicePrioritySpeaker = 1 << (iota + 2)
|
||||||
)
|
)
|
||||||
|
|
||||||
// Constants for general management.
|
// Constants for general management.
|
||||||
@@ -907,7 +966,8 @@ const (
|
|||||||
PermissionVoiceMuteMembers |
|
PermissionVoiceMuteMembers |
|
||||||
PermissionVoiceDeafenMembers |
|
PermissionVoiceDeafenMembers |
|
||||||
PermissionVoiceMoveMembers |
|
PermissionVoiceMoveMembers |
|
||||||
PermissionVoiceUseVAD
|
PermissionVoiceUseVAD |
|
||||||
|
PermissionVoicePrioritySpeaker
|
||||||
PermissionAllChannel = PermissionAllText |
|
PermissionAllChannel = PermissionAllText |
|
||||||
PermissionAllVoice |
|
PermissionAllVoice |
|
||||||
PermissionCreateInstantInvite |
|
PermissionCreateInstantInvite |
|
||||||
@@ -956,7 +1016,7 @@ const (
|
|||||||
ErrCodeMissingAccess = 50001
|
ErrCodeMissingAccess = 50001
|
||||||
ErrCodeInvalidAccountType = 50002
|
ErrCodeInvalidAccountType = 50002
|
||||||
ErrCodeCannotExecuteActionOnDMChannel = 50003
|
ErrCodeCannotExecuteActionOnDMChannel = 50003
|
||||||
ErrCodeEmbedCisabled = 50004
|
ErrCodeEmbedDisabled = 50004
|
||||||
ErrCodeCannotEditFromAnotherUser = 50005
|
ErrCodeCannotEditFromAnotherUser = 50005
|
||||||
ErrCodeCannotSendEmptyMessage = 50006
|
ErrCodeCannotSendEmptyMessage = 50006
|
||||||
ErrCodeCannotSendMessagesToThisUser = 50007
|
ErrCodeCannotSendMessagesToThisUser = 50007
|
||||||
|
|||||||
17
vendor/github.com/bwmarrin/discordgo/util.go
generated
vendored
Normal file
17
vendor/github.com/bwmarrin/discordgo/util.go
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package discordgo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SnowflakeTimestamp returns the creation time of a Snowflake ID relative to the creation of Discord.
|
||||||
|
func SnowflakeTimestamp(ID string) (t time.Time, err error) {
|
||||||
|
i, err := strconv.ParseInt(ID, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
timestamp := (i >> 22) + 1420070400000
|
||||||
|
t = time.Unix(timestamp/1000, 0)
|
||||||
|
return
|
||||||
|
}
|
||||||
5
vendor/github.com/bwmarrin/discordgo/voice.go
generated
vendored
5
vendor/github.com/bwmarrin/discordgo/voice.go
generated
vendored
@@ -243,6 +243,7 @@ type voiceOP2 struct {
|
|||||||
Port int `json:"port"`
|
Port int `json:"port"`
|
||||||
Modes []string `json:"modes"`
|
Modes []string `json:"modes"`
|
||||||
HeartbeatInterval time.Duration `json:"heartbeat_interval"`
|
HeartbeatInterval time.Duration `json:"heartbeat_interval"`
|
||||||
|
IP string `json:"ip"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// WaitUntilConnected waits for the Voice Connection to
|
// WaitUntilConnected waits for the Voice Connection to
|
||||||
@@ -542,7 +543,7 @@ func (v *VoiceConnection) udpOpen() (err error) {
|
|||||||
return fmt.Errorf("empty endpoint")
|
return fmt.Errorf("empty endpoint")
|
||||||
}
|
}
|
||||||
|
|
||||||
host := strings.TrimSuffix(v.endpoint, ":80") + ":" + strconv.Itoa(v.op2.Port)
|
host := v.op2.IP + ":" + strconv.Itoa(v.op2.Port)
|
||||||
addr, err := net.ResolveUDPAddr("udp", host)
|
addr, err := net.ResolveUDPAddr("udp", host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
v.log(LogWarning, "error resolving udp host %s, %s", host, err)
|
v.log(LogWarning, "error resolving udp host %s, %s", host, err)
|
||||||
@@ -593,7 +594,7 @@ func (v *VoiceConnection) udpOpen() (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Grab port from position 68 and 69
|
// Grab port from position 68 and 69
|
||||||
port := binary.LittleEndian.Uint16(rb[68:70])
|
port := binary.BigEndian.Uint16(rb[68:70])
|
||||||
|
|
||||||
// Take the data from above and send it back to Discord to finalize
|
// Take the data from above and send it back to Discord to finalize
|
||||||
// the UDP connection handshake.
|
// the UDP connection handshake.
|
||||||
|
|||||||
22
vendor/github.com/bwmarrin/discordgo/wsapi.go
generated
vendored
22
vendor/github.com/bwmarrin/discordgo/wsapi.go
generated
vendored
@@ -261,7 +261,6 @@ type heartbeatOp struct {
|
|||||||
|
|
||||||
type helloOp struct {
|
type helloOp struct {
|
||||||
HeartbeatInterval time.Duration `json:"heartbeat_interval"`
|
HeartbeatInterval time.Duration `json:"heartbeat_interval"`
|
||||||
Trace []string `json:"_trace"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// FailedHeartbeatAcks is the Number of heartbeat intervals to wait until forcing a connection restart.
|
// FailedHeartbeatAcks is the Number of heartbeat intervals to wait until forcing a connection restart.
|
||||||
@@ -615,11 +614,7 @@ func (s *Session) ChannelVoiceJoin(gID, cID string, mute, deaf bool) (voice *Voi
|
|||||||
voice.session = s
|
voice.session = s
|
||||||
voice.Unlock()
|
voice.Unlock()
|
||||||
|
|
||||||
// Send the request to Discord that we want to join the voice channel
|
err = s.ChannelVoiceJoinManual(gID, cID, mute, deaf)
|
||||||
data := voiceChannelJoinOp{4, voiceChannelJoinData{&gID, &cID, mute, deaf}}
|
|
||||||
s.wsMutex.Lock()
|
|
||||||
err = s.wsConn.WriteJSON(data)
|
|
||||||
s.wsMutex.Unlock()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -640,22 +635,25 @@ func (s *Session) ChannelVoiceJoin(gID, cID string, mute, deaf bool) (voice *Voi
|
|||||||
// This should only be used when the VoiceServerUpdate will be intercepted and used elsewhere.
|
// This should only be used when the VoiceServerUpdate will be intercepted and used elsewhere.
|
||||||
//
|
//
|
||||||
// gID : Guild ID of the channel to join.
|
// gID : Guild ID of the channel to join.
|
||||||
// cID : Channel ID of the channel to join.
|
// cID : Channel ID of the channel to join, leave empty to disconnect.
|
||||||
// mute : If true, you will be set to muted upon joining.
|
// mute : If true, you will be set to muted upon joining.
|
||||||
// deaf : If true, you will be set to deafened upon joining.
|
// deaf : If true, you will be set to deafened upon joining.
|
||||||
func (s *Session) ChannelVoiceJoinManual(gID, cID string, mute, deaf bool) (err error) {
|
func (s *Session) ChannelVoiceJoinManual(gID, cID string, mute, deaf bool) (err error) {
|
||||||
|
|
||||||
s.log(LogInformational, "called")
|
s.log(LogInformational, "called")
|
||||||
|
|
||||||
|
var channelID *string
|
||||||
|
if cID == "" {
|
||||||
|
channelID = nil
|
||||||
|
} else {
|
||||||
|
channelID = &cID
|
||||||
|
}
|
||||||
|
|
||||||
// Send the request to Discord that we want to join the voice channel
|
// Send the request to Discord that we want to join the voice channel
|
||||||
data := voiceChannelJoinOp{4, voiceChannelJoinData{&gID, &cID, mute, deaf}}
|
data := voiceChannelJoinOp{4, voiceChannelJoinData{&gID, channelID, mute, deaf}}
|
||||||
s.wsMutex.Lock()
|
s.wsMutex.Lock()
|
||||||
err = s.wsConn.WriteJSON(data)
|
err = s.wsConn.WriteJSON(data)
|
||||||
s.wsMutex.Unlock()
|
s.wsMutex.Unlock()
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
6
vendor/github.com/d5/tengo/.goreleaser.yml
generated
vendored
6
vendor/github.com/d5/tengo/.goreleaser.yml
generated
vendored
@@ -1,3 +1,8 @@
|
|||||||
|
env:
|
||||||
|
- GO111MODULE=on
|
||||||
|
before:
|
||||||
|
hooks:
|
||||||
|
- go mod tidy
|
||||||
builds:
|
builds:
|
||||||
- env:
|
- env:
|
||||||
- CGO_ENABLED=0
|
- CGO_ENABLED=0
|
||||||
@@ -9,6 +14,7 @@ builds:
|
|||||||
- env:
|
- env:
|
||||||
- CGO_ENABLED=0
|
- CGO_ENABLED=0
|
||||||
main: ./cmd/tengomin/main.go
|
main: ./cmd/tengomin/main.go
|
||||||
|
id: tengomin
|
||||||
binary: tengomin
|
binary: tengomin
|
||||||
goos:
|
goos:
|
||||||
- darwin
|
- darwin
|
||||||
|
|||||||
6
vendor/github.com/d5/tengo/.travis.yml
generated
vendored
6
vendor/github.com/d5/tengo/.travis.yml
generated
vendored
@@ -1,13 +1,13 @@
|
|||||||
language: go
|
language: go
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- 1.9
|
- "1.12"
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- go get -u golang.org/x/lint/golint
|
- env GO111MODULE=on go get -u golang.org/x/lint/golint
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- make test
|
- env GO111MODULE=on make test
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
- provider: script
|
- provider: script
|
||||||
|
|||||||
3
vendor/github.com/d5/tengo/go.mod
generated
vendored
Normal file
3
vendor/github.com/d5/tengo/go.mod
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
module github.com/d5/tengo
|
||||||
|
|
||||||
|
go 1.12
|
||||||
0
vendor/github.com/d5/tengo/go.sum
generated
vendored
Normal file
0
vendor/github.com/d5/tengo/go.sum
generated
vendored
Normal file
20
vendor/github.com/d5/tengo/stdlib/base64.go
generated
vendored
Normal file
20
vendor/github.com/d5/tengo/stdlib/base64.go
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package stdlib
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/base64"
|
||||||
|
"github.com/d5/tengo/objects"
|
||||||
|
)
|
||||||
|
|
||||||
|
var base64Module = map[string]objects.Object{
|
||||||
|
"encode": &objects.UserFunction{Value: FuncAYRS(base64.StdEncoding.EncodeToString)},
|
||||||
|
"decode": &objects.UserFunction{Value: FuncASRYE(base64.StdEncoding.DecodeString)},
|
||||||
|
|
||||||
|
"raw_encode": &objects.UserFunction{Value: FuncAYRS(base64.RawStdEncoding.EncodeToString)},
|
||||||
|
"raw_decode": &objects.UserFunction{Value: FuncASRYE(base64.RawStdEncoding.DecodeString)},
|
||||||
|
|
||||||
|
"url_encode": &objects.UserFunction{Value: FuncAYRS(base64.URLEncoding.EncodeToString)},
|
||||||
|
"url_decode": &objects.UserFunction{Value: FuncASRYE(base64.URLEncoding.DecodeString)},
|
||||||
|
|
||||||
|
"raw_url_encode": &objects.UserFunction{Value: FuncAYRS(base64.RawURLEncoding.EncodeToString)},
|
||||||
|
"raw_url_decode": &objects.UserFunction{Value: FuncASRYE(base64.RawURLEncoding.DecodeString)},
|
||||||
|
}
|
||||||
2
vendor/github.com/d5/tengo/stdlib/builtin_modules.go
generated
vendored
2
vendor/github.com/d5/tengo/stdlib/builtin_modules.go
generated
vendored
@@ -11,4 +11,6 @@ var BuiltinModules = map[string]map[string]objects.Object{
|
|||||||
"rand": randModule,
|
"rand": randModule,
|
||||||
"fmt": fmtModule,
|
"fmt": fmtModule,
|
||||||
"json": jsonModule,
|
"json": jsonModule,
|
||||||
|
"base64": base64Module,
|
||||||
|
"hex": hexModule,
|
||||||
}
|
}
|
||||||
|
|||||||
53
vendor/github.com/d5/tengo/stdlib/func_typedefs.go
generated
vendored
53
vendor/github.com/d5/tengo/stdlib/func_typedefs.go
generated
vendored
@@ -1036,6 +1036,29 @@ func FuncAYRIE(fn func([]byte) (int, error)) objects.CallableFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FuncAYRS transform a function of 'func([]byte) string' signature
|
||||||
|
// into CallableFunc type.
|
||||||
|
func FuncAYRS(fn func([]byte) string) objects.CallableFunc {
|
||||||
|
return func(args ...objects.Object) (ret objects.Object, err error) {
|
||||||
|
if len(args) != 1 {
|
||||||
|
return nil, objects.ErrWrongNumArguments
|
||||||
|
}
|
||||||
|
|
||||||
|
y1, ok := objects.ToByteSlice(args[0])
|
||||||
|
if !ok {
|
||||||
|
return nil, objects.ErrInvalidArgumentType{
|
||||||
|
Name: "first",
|
||||||
|
Expected: "bytes(compatible)",
|
||||||
|
Found: args[0].TypeName(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res := fn(y1)
|
||||||
|
|
||||||
|
return &objects.String{Value: res}, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// FuncASRIE transform a function of 'func(string) (int, error)' signature
|
// FuncASRIE transform a function of 'func(string) (int, error)' signature
|
||||||
// into CallableFunc type.
|
// into CallableFunc type.
|
||||||
func FuncASRIE(fn func(string) (int, error)) objects.CallableFunc {
|
func FuncASRIE(fn func(string) (int, error)) objects.CallableFunc {
|
||||||
@@ -1062,6 +1085,36 @@ func FuncASRIE(fn func(string) (int, error)) objects.CallableFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FuncASRYE transform a function of 'func(string) ([]byte, error)' signature
|
||||||
|
// into CallableFunc type.
|
||||||
|
func FuncASRYE(fn func(string) ([]byte, error)) objects.CallableFunc {
|
||||||
|
return func(args ...objects.Object) (ret objects.Object, err error) {
|
||||||
|
if len(args) != 1 {
|
||||||
|
return nil, objects.ErrWrongNumArguments
|
||||||
|
}
|
||||||
|
|
||||||
|
s1, ok := objects.ToString(args[0])
|
||||||
|
if !ok {
|
||||||
|
return nil, objects.ErrInvalidArgumentType{
|
||||||
|
Name: "first",
|
||||||
|
Expected: "string(compatible)",
|
||||||
|
Found: args[0].TypeName(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := fn(s1)
|
||||||
|
if err != nil {
|
||||||
|
return wrapError(err), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(res) > tengo.MaxBytesLen {
|
||||||
|
return nil, objects.ErrBytesLimit
|
||||||
|
}
|
||||||
|
|
||||||
|
return &objects.Bytes{Value: res}, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// FuncAIRSsE transform a function of 'func(int) ([]string, error)' signature
|
// FuncAIRSsE transform a function of 'func(int) ([]string, error)' signature
|
||||||
// into CallableFunc type.
|
// into CallableFunc type.
|
||||||
func FuncAIRSsE(fn func(int) ([]string, error)) objects.CallableFunc {
|
func FuncAIRSsE(fn func(int) ([]string, error)) objects.CallableFunc {
|
||||||
|
|||||||
53
vendor/github.com/d5/tengo/stdlib/gensrcmods.go
generated
vendored
53
vendor/github.com/d5/tengo/stdlib/gensrcmods.go
generated
vendored
@@ -1,53 +0,0 @@
|
|||||||
// +build ignore
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"regexp"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
var tengoModFileRE = regexp.MustCompile(`^srcmod_(\w+).tengo$`)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
modules := make(map[string]string)
|
|
||||||
|
|
||||||
// enumerate all Tengo module files
|
|
||||||
files, err := ioutil.ReadDir(".")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
for _, file := range files {
|
|
||||||
m := tengoModFileRE.FindStringSubmatch(file.Name())
|
|
||||||
if m != nil {
|
|
||||||
modName := m[1]
|
|
||||||
|
|
||||||
src, err := ioutil.ReadFile(file.Name())
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("file '%s' read error: %s", file.Name(), err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
modules[modName] = string(src)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var out bytes.Buffer
|
|
||||||
out.WriteString(`// Code generated using gensrcmods.go; DO NOT EDIT.
|
|
||||||
|
|
||||||
package stdlib
|
|
||||||
|
|
||||||
// SourceModules are source type standard library modules.
|
|
||||||
var SourceModules = map[string]string{` + "\n")
|
|
||||||
for modName, modSrc := range modules {
|
|
||||||
out.WriteString("\t\"" + modName + "\": " + strconv.Quote(modSrc) + ",\n")
|
|
||||||
}
|
|
||||||
out.WriteString("}\n")
|
|
||||||
|
|
||||||
const target = "source_modules.go"
|
|
||||||
if err := ioutil.WriteFile(target, out.Bytes(), 0644); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
11
vendor/github.com/d5/tengo/stdlib/hex.go
generated
vendored
Normal file
11
vendor/github.com/d5/tengo/stdlib/hex.go
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package stdlib
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/hex"
|
||||||
|
"github.com/d5/tengo/objects"
|
||||||
|
)
|
||||||
|
|
||||||
|
var hexModule = map[string]objects.Object{
|
||||||
|
"encode": &objects.UserFunction{Value: FuncAYRS(hex.EncodeToString)},
|
||||||
|
"decode": &objects.UserFunction{Value: FuncASRYE(hex.DecodeString)},
|
||||||
|
}
|
||||||
19
vendor/github.com/gorilla/websocket/.travis.yml
generated
vendored
19
vendor/github.com/gorilla/websocket/.travis.yml
generated
vendored
@@ -1,19 +0,0 @@
|
|||||||
language: go
|
|
||||||
sudo: false
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- go: 1.7.x
|
|
||||||
- go: 1.8.x
|
|
||||||
- go: 1.9.x
|
|
||||||
- go: 1.10.x
|
|
||||||
- go: 1.11.x
|
|
||||||
- go: tip
|
|
||||||
allow_failures:
|
|
||||||
- go: tip
|
|
||||||
|
|
||||||
script:
|
|
||||||
- go get -t -v ./...
|
|
||||||
- diff -u <(echo -n) <(gofmt -d .)
|
|
||||||
- go vet $(go list ./... | grep -v /vendor/)
|
|
||||||
- go test -v -race ./...
|
|
||||||
10
vendor/github.com/gorilla/websocket/README.md
generated
vendored
10
vendor/github.com/gorilla/websocket/README.md
generated
vendored
@@ -1,11 +1,11 @@
|
|||||||
# Gorilla WebSocket
|
# Gorilla WebSocket
|
||||||
|
|
||||||
|
[](https://godoc.org/github.com/gorilla/websocket)
|
||||||
|
[](https://circleci.com/gh/gorilla/websocket)
|
||||||
|
|
||||||
Gorilla WebSocket is a [Go](http://golang.org/) implementation of the
|
Gorilla WebSocket is a [Go](http://golang.org/) implementation of the
|
||||||
[WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol.
|
[WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol.
|
||||||
|
|
||||||
[](https://travis-ci.org/gorilla/websocket)
|
|
||||||
[](https://godoc.org/github.com/gorilla/websocket)
|
|
||||||
|
|
||||||
### Documentation
|
### Documentation
|
||||||
|
|
||||||
* [API Reference](http://godoc.org/github.com/gorilla/websocket)
|
* [API Reference](http://godoc.org/github.com/gorilla/websocket)
|
||||||
@@ -27,7 +27,7 @@ package API is stable.
|
|||||||
### Protocol Compliance
|
### Protocol Compliance
|
||||||
|
|
||||||
The Gorilla WebSocket package passes the server tests in the [Autobahn Test
|
The Gorilla WebSocket package passes the server tests in the [Autobahn Test
|
||||||
Suite](http://autobahn.ws/testsuite) using the application in the [examples/autobahn
|
Suite](https://github.com/crossbario/autobahn-testsuite) using the application in the [examples/autobahn
|
||||||
subdirectory](https://github.com/gorilla/websocket/tree/master/examples/autobahn).
|
subdirectory](https://github.com/gorilla/websocket/tree/master/examples/autobahn).
|
||||||
|
|
||||||
### Gorilla WebSocket compared with other packages
|
### Gorilla WebSocket compared with other packages
|
||||||
@@ -40,7 +40,7 @@ subdirectory](https://github.com/gorilla/websocket/tree/master/examples/autobahn
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<tr><td colspan="3"><a href="http://tools.ietf.org/html/rfc6455">RFC 6455</a> Features</td></tr>
|
<tr><td colspan="3"><a href="http://tools.ietf.org/html/rfc6455">RFC 6455</a> Features</td></tr>
|
||||||
<tr><td>Passes <a href="http://autobahn.ws/testsuite/">Autobahn Test Suite</a></td><td><a href="https://github.com/gorilla/websocket/tree/master/examples/autobahn">Yes</a></td><td>No</td></tr>
|
<tr><td>Passes <a href="https://github.com/crossbario/autobahn-testsuite">Autobahn Test Suite</a></td><td><a href="https://github.com/gorilla/websocket/tree/master/examples/autobahn">Yes</a></td><td>No</td></tr>
|
||||||
<tr><td>Receive <a href="https://tools.ietf.org/html/rfc6455#section-5.4">fragmented</a> message<td>Yes</td><td><a href="https://code.google.com/p/go/issues/detail?id=7632">No</a>, see note 1</td></tr>
|
<tr><td>Receive <a href="https://tools.ietf.org/html/rfc6455#section-5.4">fragmented</a> message<td>Yes</td><td><a href="https://code.google.com/p/go/issues/detail?id=7632">No</a>, see note 1</td></tr>
|
||||||
<tr><td>Send <a href="https://tools.ietf.org/html/rfc6455#section-5.5.1">close</a> message</td><td><a href="http://godoc.org/github.com/gorilla/websocket#hdr-Control_Messages">Yes</a></td><td><a href="https://code.google.com/p/go/issues/detail?id=4588">No</a></td></tr>
|
<tr><td>Send <a href="https://tools.ietf.org/html/rfc6455#section-5.5.1">close</a> message</td><td><a href="http://godoc.org/github.com/gorilla/websocket#hdr-Control_Messages">Yes</a></td><td><a href="https://code.google.com/p/go/issues/detail?id=4588">No</a></td></tr>
|
||||||
<tr><td>Send <a href="https://tools.ietf.org/html/rfc6455#section-5.5.2">pings</a> and receive <a href="https://tools.ietf.org/html/rfc6455#section-5.5.3">pongs</a></td><td><a href="http://godoc.org/github.com/gorilla/websocket#hdr-Control_Messages">Yes</a></td><td>No</td></tr>
|
<tr><td>Send <a href="https://tools.ietf.org/html/rfc6455#section-5.5.2">pings</a> and receive <a href="https://tools.ietf.org/html/rfc6455#section-5.5.3">pongs</a></td><td><a href="http://godoc.org/github.com/gorilla/websocket#hdr-Control_Messages">Yes</a></td><td>No</td></tr>
|
||||||
|
|||||||
4
vendor/github.com/gorilla/websocket/client.go
generated
vendored
4
vendor/github.com/gorilla/websocket/client.go
generated
vendored
@@ -70,7 +70,7 @@ type Dialer struct {
|
|||||||
// HandshakeTimeout specifies the duration for the handshake to complete.
|
// HandshakeTimeout specifies the duration for the handshake to complete.
|
||||||
HandshakeTimeout time.Duration
|
HandshakeTimeout time.Duration
|
||||||
|
|
||||||
// ReadBufferSize and WriteBufferSize specify I/O buffer sizes. If a buffer
|
// ReadBufferSize and WriteBufferSize specify I/O buffer sizes in bytes. If a buffer
|
||||||
// size is zero, then a useful default size is used. The I/O buffer sizes
|
// size is zero, then a useful default size is used. The I/O buffer sizes
|
||||||
// do not limit the size of the messages that can be sent or received.
|
// do not limit the size of the messages that can be sent or received.
|
||||||
ReadBufferSize, WriteBufferSize int
|
ReadBufferSize, WriteBufferSize int
|
||||||
@@ -140,7 +140,7 @@ var nilDialer = *DefaultDialer
|
|||||||
// Use the response.Header to get the selected subprotocol
|
// Use the response.Header to get the selected subprotocol
|
||||||
// (Sec-WebSocket-Protocol) and cookies (Set-Cookie).
|
// (Sec-WebSocket-Protocol) and cookies (Set-Cookie).
|
||||||
//
|
//
|
||||||
// The context will be used in the request and in the Dialer
|
// The context will be used in the request and in the Dialer.
|
||||||
//
|
//
|
||||||
// If the WebSocket handshake fails, ErrBadHandshake is returned along with a
|
// If the WebSocket handshake fails, ErrBadHandshake is returned along with a
|
||||||
// non-nil *http.Response so that callers can handle redirects, authentication,
|
// non-nil *http.Response so that callers can handle redirects, authentication,
|
||||||
|
|||||||
112
vendor/github.com/gorilla/websocket/conn.go
generated
vendored
112
vendor/github.com/gorilla/websocket/conn.go
generated
vendored
@@ -260,10 +260,12 @@ type Conn struct {
|
|||||||
newCompressionWriter func(io.WriteCloser, int) io.WriteCloser
|
newCompressionWriter func(io.WriteCloser, int) io.WriteCloser
|
||||||
|
|
||||||
// Read fields
|
// Read fields
|
||||||
reader io.ReadCloser // the current reader returned to the application
|
reader io.ReadCloser // the current reader returned to the application
|
||||||
readErr error
|
readErr error
|
||||||
br *bufio.Reader
|
br *bufio.Reader
|
||||||
readRemaining int64 // bytes remaining in current frame.
|
// bytes remaining in current frame.
|
||||||
|
// set setReadRemaining to safely update this value and prevent overflow
|
||||||
|
readRemaining int64
|
||||||
readFinal bool // true the current message has more frames.
|
readFinal bool // true the current message has more frames.
|
||||||
readLength int64 // Message size.
|
readLength int64 // Message size.
|
||||||
readLimit int64 // Maximum message size.
|
readLimit int64 // Maximum message size.
|
||||||
@@ -320,6 +322,17 @@ func newConn(conn net.Conn, isServer bool, readBufferSize, writeBufferSize int,
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// setReadRemaining tracks the number of bytes remaining on the connection. If n
|
||||||
|
// overflows, an ErrReadLimit is returned.
|
||||||
|
func (c *Conn) setReadRemaining(n int64) error {
|
||||||
|
if n < 0 {
|
||||||
|
return ErrReadLimit
|
||||||
|
}
|
||||||
|
|
||||||
|
c.readRemaining = n
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Subprotocol returns the negotiated protocol for the connection.
|
// Subprotocol returns the negotiated protocol for the connection.
|
||||||
func (c *Conn) Subprotocol() string {
|
func (c *Conn) Subprotocol() string {
|
||||||
return c.subprotocol
|
return c.subprotocol
|
||||||
@@ -451,7 +464,8 @@ func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) er
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Conn) prepWrite(messageType int) error {
|
// beginMessage prepares a connection and message writer for a new message.
|
||||||
|
func (c *Conn) beginMessage(mw *messageWriter, messageType int) error {
|
||||||
// Close previous writer if not already closed by the application. It's
|
// Close previous writer if not already closed by the application. It's
|
||||||
// probably better to return an error in this situation, but we cannot
|
// probably better to return an error in this situation, but we cannot
|
||||||
// change this without breaking existing applications.
|
// change this without breaking existing applications.
|
||||||
@@ -471,6 +485,10 @@ func (c *Conn) prepWrite(messageType int) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mw.c = c
|
||||||
|
mw.frameType = messageType
|
||||||
|
mw.pos = maxFrameHeaderSize
|
||||||
|
|
||||||
if c.writeBuf == nil {
|
if c.writeBuf == nil {
|
||||||
wpd, ok := c.writePool.Get().(writePoolData)
|
wpd, ok := c.writePool.Get().(writePoolData)
|
||||||
if ok {
|
if ok {
|
||||||
@@ -491,16 +509,11 @@ func (c *Conn) prepWrite(messageType int) error {
|
|||||||
// All message types (TextMessage, BinaryMessage, CloseMessage, PingMessage and
|
// All message types (TextMessage, BinaryMessage, CloseMessage, PingMessage and
|
||||||
// PongMessage) are supported.
|
// PongMessage) are supported.
|
||||||
func (c *Conn) NextWriter(messageType int) (io.WriteCloser, error) {
|
func (c *Conn) NextWriter(messageType int) (io.WriteCloser, error) {
|
||||||
if err := c.prepWrite(messageType); err != nil {
|
var mw messageWriter
|
||||||
|
if err := c.beginMessage(&mw, messageType); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
c.writer = &mw
|
||||||
mw := &messageWriter{
|
|
||||||
c: c,
|
|
||||||
frameType: messageType,
|
|
||||||
pos: maxFrameHeaderSize,
|
|
||||||
}
|
|
||||||
c.writer = mw
|
|
||||||
if c.newCompressionWriter != nil && c.enableWriteCompression && isData(messageType) {
|
if c.newCompressionWriter != nil && c.enableWriteCompression && isData(messageType) {
|
||||||
w := c.newCompressionWriter(c.writer, c.compressionLevel)
|
w := c.newCompressionWriter(c.writer, c.compressionLevel)
|
||||||
mw.compress = true
|
mw.compress = true
|
||||||
@@ -517,10 +530,16 @@ type messageWriter struct {
|
|||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *messageWriter) fatal(err error) error {
|
func (w *messageWriter) endMessage(err error) error {
|
||||||
if w.err != nil {
|
if w.err != nil {
|
||||||
w.err = err
|
return err
|
||||||
w.c.writer = nil
|
}
|
||||||
|
c := w.c
|
||||||
|
w.err = err
|
||||||
|
c.writer = nil
|
||||||
|
if c.writePool != nil {
|
||||||
|
c.writePool.Put(writePoolData{buf: c.writeBuf})
|
||||||
|
c.writeBuf = nil
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -534,7 +553,7 @@ func (w *messageWriter) flushFrame(final bool, extra []byte) error {
|
|||||||
// Check for invalid control frames.
|
// Check for invalid control frames.
|
||||||
if isControl(w.frameType) &&
|
if isControl(w.frameType) &&
|
||||||
(!final || length > maxControlFramePayloadSize) {
|
(!final || length > maxControlFramePayloadSize) {
|
||||||
return w.fatal(errInvalidControlFrame)
|
return w.endMessage(errInvalidControlFrame)
|
||||||
}
|
}
|
||||||
|
|
||||||
b0 := byte(w.frameType)
|
b0 := byte(w.frameType)
|
||||||
@@ -579,7 +598,7 @@ func (w *messageWriter) flushFrame(final bool, extra []byte) error {
|
|||||||
copy(c.writeBuf[maxFrameHeaderSize-4:], key[:])
|
copy(c.writeBuf[maxFrameHeaderSize-4:], key[:])
|
||||||
maskBytes(key, 0, c.writeBuf[maxFrameHeaderSize:w.pos])
|
maskBytes(key, 0, c.writeBuf[maxFrameHeaderSize:w.pos])
|
||||||
if len(extra) > 0 {
|
if len(extra) > 0 {
|
||||||
return c.writeFatal(errors.New("websocket: internal error, extra used in client mode"))
|
return w.endMessage(c.writeFatal(errors.New("websocket: internal error, extra used in client mode")))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -600,15 +619,11 @@ func (w *messageWriter) flushFrame(final bool, extra []byte) error {
|
|||||||
c.isWriting = false
|
c.isWriting = false
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return w.fatal(err)
|
return w.endMessage(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if final {
|
if final {
|
||||||
c.writer = nil
|
w.endMessage(errWriteClosed)
|
||||||
if c.writePool != nil {
|
|
||||||
c.writePool.Put(writePoolData{buf: c.writeBuf})
|
|
||||||
c.writeBuf = nil
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -706,11 +721,7 @@ func (w *messageWriter) Close() error {
|
|||||||
if w.err != nil {
|
if w.err != nil {
|
||||||
return w.err
|
return w.err
|
||||||
}
|
}
|
||||||
if err := w.flushFrame(true, nil); err != nil {
|
return w.flushFrame(true, nil)
|
||||||
return err
|
|
||||||
}
|
|
||||||
w.err = errWriteClosed
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WritePreparedMessage writes prepared message into connection.
|
// WritePreparedMessage writes prepared message into connection.
|
||||||
@@ -742,10 +753,10 @@ func (c *Conn) WriteMessage(messageType int, data []byte) error {
|
|||||||
if c.isServer && (c.newCompressionWriter == nil || !c.enableWriteCompression) {
|
if c.isServer && (c.newCompressionWriter == nil || !c.enableWriteCompression) {
|
||||||
// Fast path with no allocations and single frame.
|
// Fast path with no allocations and single frame.
|
||||||
|
|
||||||
if err := c.prepWrite(messageType); err != nil {
|
var mw messageWriter
|
||||||
|
if err := c.beginMessage(&mw, messageType); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
mw := messageWriter{c: c, frameType: messageType, pos: maxFrameHeaderSize}
|
|
||||||
n := copy(c.writeBuf[mw.pos:], data)
|
n := copy(c.writeBuf[mw.pos:], data)
|
||||||
mw.pos += n
|
mw.pos += n
|
||||||
data = data[n:]
|
data = data[n:]
|
||||||
@@ -792,7 +803,7 @@ func (c *Conn) advanceFrame() (int, error) {
|
|||||||
final := p[0]&finalBit != 0
|
final := p[0]&finalBit != 0
|
||||||
frameType := int(p[0] & 0xf)
|
frameType := int(p[0] & 0xf)
|
||||||
mask := p[1]&maskBit != 0
|
mask := p[1]&maskBit != 0
|
||||||
c.readRemaining = int64(p[1] & 0x7f)
|
c.setReadRemaining(int64(p[1] & 0x7f))
|
||||||
|
|
||||||
c.readDecompress = false
|
c.readDecompress = false
|
||||||
if c.newDecompressionReader != nil && (p[0]&rsv1Bit) != 0 {
|
if c.newDecompressionReader != nil && (p[0]&rsv1Bit) != 0 {
|
||||||
@@ -826,7 +837,17 @@ func (c *Conn) advanceFrame() (int, error) {
|
|||||||
return noFrame, c.handleProtocolError("unknown opcode " + strconv.Itoa(frameType))
|
return noFrame, c.handleProtocolError("unknown opcode " + strconv.Itoa(frameType))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. Read and parse frame length.
|
// 3. Read and parse frame length as per
|
||||||
|
// https://tools.ietf.org/html/rfc6455#section-5.2
|
||||||
|
//
|
||||||
|
// The length of the "Payload data", in bytes: if 0-125, that is the payload
|
||||||
|
// length.
|
||||||
|
// - If 126, the following 2 bytes interpreted as a 16-bit unsigned
|
||||||
|
// integer are the payload length.
|
||||||
|
// - If 127, the following 8 bytes interpreted as
|
||||||
|
// a 64-bit unsigned integer (the most significant bit MUST be 0) are the
|
||||||
|
// payload length. Multibyte length quantities are expressed in network byte
|
||||||
|
// order.
|
||||||
|
|
||||||
switch c.readRemaining {
|
switch c.readRemaining {
|
||||||
case 126:
|
case 126:
|
||||||
@@ -834,13 +855,19 @@ func (c *Conn) advanceFrame() (int, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return noFrame, err
|
return noFrame, err
|
||||||
}
|
}
|
||||||
c.readRemaining = int64(binary.BigEndian.Uint16(p))
|
|
||||||
|
if err := c.setReadRemaining(int64(binary.BigEndian.Uint16(p))); err != nil {
|
||||||
|
return noFrame, err
|
||||||
|
}
|
||||||
case 127:
|
case 127:
|
||||||
p, err := c.read(8)
|
p, err := c.read(8)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return noFrame, err
|
return noFrame, err
|
||||||
}
|
}
|
||||||
c.readRemaining = int64(binary.BigEndian.Uint64(p))
|
|
||||||
|
if err := c.setReadRemaining(int64(binary.BigEndian.Uint64(p))); err != nil {
|
||||||
|
return noFrame, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. Handle frame masking.
|
// 4. Handle frame masking.
|
||||||
@@ -863,6 +890,12 @@ func (c *Conn) advanceFrame() (int, error) {
|
|||||||
if frameType == continuationFrame || frameType == TextMessage || frameType == BinaryMessage {
|
if frameType == continuationFrame || frameType == TextMessage || frameType == BinaryMessage {
|
||||||
|
|
||||||
c.readLength += c.readRemaining
|
c.readLength += c.readRemaining
|
||||||
|
// Don't allow readLength to overflow in the presence of a large readRemaining
|
||||||
|
// counter.
|
||||||
|
if c.readLength < 0 {
|
||||||
|
return noFrame, ErrReadLimit
|
||||||
|
}
|
||||||
|
|
||||||
if c.readLimit > 0 && c.readLength > c.readLimit {
|
if c.readLimit > 0 && c.readLength > c.readLimit {
|
||||||
c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait))
|
c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait))
|
||||||
return noFrame, ErrReadLimit
|
return noFrame, ErrReadLimit
|
||||||
@@ -876,7 +909,7 @@ func (c *Conn) advanceFrame() (int, error) {
|
|||||||
var payload []byte
|
var payload []byte
|
||||||
if c.readRemaining > 0 {
|
if c.readRemaining > 0 {
|
||||||
payload, err = c.read(int(c.readRemaining))
|
payload, err = c.read(int(c.readRemaining))
|
||||||
c.readRemaining = 0
|
c.setReadRemaining(0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return noFrame, err
|
return noFrame, err
|
||||||
}
|
}
|
||||||
@@ -949,6 +982,7 @@ func (c *Conn) NextReader() (messageType int, r io.Reader, err error) {
|
|||||||
c.readErr = hideTempErr(err)
|
c.readErr = hideTempErr(err)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
if frameType == TextMessage || frameType == BinaryMessage {
|
if frameType == TextMessage || frameType == BinaryMessage {
|
||||||
c.messageReader = &messageReader{c}
|
c.messageReader = &messageReader{c}
|
||||||
c.reader = c.messageReader
|
c.reader = c.messageReader
|
||||||
@@ -989,7 +1023,9 @@ func (r *messageReader) Read(b []byte) (int, error) {
|
|||||||
if c.isServer {
|
if c.isServer {
|
||||||
c.readMaskPos = maskBytes(c.readMaskKey, c.readMaskPos, b[:n])
|
c.readMaskPos = maskBytes(c.readMaskKey, c.readMaskPos, b[:n])
|
||||||
}
|
}
|
||||||
c.readRemaining -= int64(n)
|
rem := c.readRemaining
|
||||||
|
rem -= int64(n)
|
||||||
|
c.setReadRemaining(rem)
|
||||||
if c.readRemaining > 0 && c.readErr == io.EOF {
|
if c.readRemaining > 0 && c.readErr == io.EOF {
|
||||||
c.readErr = errUnexpectedEOF
|
c.readErr = errUnexpectedEOF
|
||||||
}
|
}
|
||||||
@@ -1041,7 +1077,7 @@ func (c *Conn) SetReadDeadline(t time.Time) error {
|
|||||||
return c.conn.SetReadDeadline(t)
|
return c.conn.SetReadDeadline(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetReadLimit sets the maximum size for a message read from the peer. If a
|
// SetReadLimit sets the maximum size in bytes for a message read from the peer. If a
|
||||||
// message exceeds the limit, the connection sends a close message to the peer
|
// message exceeds the limit, the connection sends a close message to the peer
|
||||||
// and returns ErrReadLimit to the application.
|
// and returns ErrReadLimit to the application.
|
||||||
func (c *Conn) SetReadLimit(limit int64) {
|
func (c *Conn) SetReadLimit(limit int64) {
|
||||||
|
|||||||
47
vendor/github.com/gorilla/websocket/doc.go
generated
vendored
47
vendor/github.com/gorilla/websocket/doc.go
generated
vendored
@@ -151,6 +151,53 @@
|
|||||||
// checking. The application is responsible for checking the Origin header
|
// checking. The application is responsible for checking the Origin header
|
||||||
// before calling the Upgrade function.
|
// before calling the Upgrade function.
|
||||||
//
|
//
|
||||||
|
// Buffers
|
||||||
|
//
|
||||||
|
// Connections buffer network input and output to reduce the number
|
||||||
|
// of system calls when reading or writing messages.
|
||||||
|
//
|
||||||
|
// Write buffers are also used for constructing WebSocket frames. See RFC 6455,
|
||||||
|
// Section 5 for a discussion of message framing. A WebSocket frame header is
|
||||||
|
// written to the network each time a write buffer is flushed to the network.
|
||||||
|
// Decreasing the size of the write buffer can increase the amount of framing
|
||||||
|
// overhead on the connection.
|
||||||
|
//
|
||||||
|
// The buffer sizes in bytes are specified by the ReadBufferSize and
|
||||||
|
// WriteBufferSize fields in the Dialer and Upgrader. The Dialer uses a default
|
||||||
|
// size of 4096 when a buffer size field is set to zero. The Upgrader reuses
|
||||||
|
// buffers created by the HTTP server when a buffer size field is set to zero.
|
||||||
|
// The HTTP server buffers have a size of 4096 at the time of this writing.
|
||||||
|
//
|
||||||
|
// The buffer sizes do not limit the size of a message that can be read or
|
||||||
|
// written by a connection.
|
||||||
|
//
|
||||||
|
// Buffers are held for the lifetime of the connection by default. If the
|
||||||
|
// Dialer or Upgrader WriteBufferPool field is set, then a connection holds the
|
||||||
|
// write buffer only when writing a message.
|
||||||
|
//
|
||||||
|
// Applications should tune the buffer sizes to balance memory use and
|
||||||
|
// performance. Increasing the buffer size uses more memory, but can reduce the
|
||||||
|
// number of system calls to read or write the network. In the case of writing,
|
||||||
|
// increasing the buffer size can reduce the number of frame headers written to
|
||||||
|
// the network.
|
||||||
|
//
|
||||||
|
// Some guidelines for setting buffer parameters are:
|
||||||
|
//
|
||||||
|
// Limit the buffer sizes to the maximum expected message size. Buffers larger
|
||||||
|
// than the largest message do not provide any benefit.
|
||||||
|
//
|
||||||
|
// Depending on the distribution of message sizes, setting the buffer size to
|
||||||
|
// to a value less than the maximum expected message size can greatly reduce
|
||||||
|
// memory use with a small impact on performance. Here's an example: If 99% of
|
||||||
|
// the messages are smaller than 256 bytes and the maximum message size is 512
|
||||||
|
// bytes, then a buffer size of 256 bytes will result in 1.01 more system calls
|
||||||
|
// than a buffer size of 512 bytes. The memory savings is 50%.
|
||||||
|
//
|
||||||
|
// A write buffer pool is useful when the application has a modest number
|
||||||
|
// writes over a large number of connections. when buffers are pooled, a larger
|
||||||
|
// buffer size has a reduced impact on total memory use and has the benefit of
|
||||||
|
// reducing system calls and frame overhead.
|
||||||
|
//
|
||||||
// Compression EXPERIMENTAL
|
// Compression EXPERIMENTAL
|
||||||
//
|
//
|
||||||
// Per message compression extensions (RFC 7692) are experimentally supported
|
// Per message compression extensions (RFC 7692) are experimentally supported
|
||||||
|
|||||||
3
vendor/github.com/gorilla/websocket/go.mod
generated
vendored
Normal file
3
vendor/github.com/gorilla/websocket/go.mod
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
module github.com/gorilla/websocket
|
||||||
|
|
||||||
|
go 1.12
|
||||||
2
vendor/github.com/gorilla/websocket/go.sum
generated
vendored
Normal file
2
vendor/github.com/gorilla/websocket/go.sum
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
|
||||||
|
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||||
42
vendor/github.com/gorilla/websocket/join.go
generated
vendored
Normal file
42
vendor/github.com/gorilla/websocket/join.go
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
// Copyright 2019 The Gorilla WebSocket Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package websocket
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// JoinMessages concatenates received messages to create a single io.Reader.
|
||||||
|
// The string term is appended to each message. The returned reader does not
|
||||||
|
// support concurrent calls to the Read method.
|
||||||
|
func JoinMessages(c *Conn, term string) io.Reader {
|
||||||
|
return &joinReader{c: c, term: term}
|
||||||
|
}
|
||||||
|
|
||||||
|
type joinReader struct {
|
||||||
|
c *Conn
|
||||||
|
term string
|
||||||
|
r io.Reader
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *joinReader) Read(p []byte) (int, error) {
|
||||||
|
if r.r == nil {
|
||||||
|
var err error
|
||||||
|
_, r.r, err = r.c.NextReader()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
if r.term != "" {
|
||||||
|
r.r = io.MultiReader(r.r, strings.NewReader(r.term))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
n, err := r.r.Read(p)
|
||||||
|
if err == io.EOF {
|
||||||
|
err = nil
|
||||||
|
r.r = nil
|
||||||
|
}
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
8
vendor/github.com/gorilla/websocket/proxy.go
generated
vendored
8
vendor/github.com/gorilla/websocket/proxy.go
generated
vendored
@@ -22,18 +22,18 @@ func (fn netDialerFunc) Dial(network, addr string) (net.Conn, error) {
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
proxy_RegisterDialerType("http", func(proxyURL *url.URL, forwardDialer proxy_Dialer) (proxy_Dialer, error) {
|
proxy_RegisterDialerType("http", func(proxyURL *url.URL, forwardDialer proxy_Dialer) (proxy_Dialer, error) {
|
||||||
return &httpProxyDialer{proxyURL: proxyURL, fowardDial: forwardDialer.Dial}, nil
|
return &httpProxyDialer{proxyURL: proxyURL, forwardDial: forwardDialer.Dial}, nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
type httpProxyDialer struct {
|
type httpProxyDialer struct {
|
||||||
proxyURL *url.URL
|
proxyURL *url.URL
|
||||||
fowardDial func(network, addr string) (net.Conn, error)
|
forwardDial func(network, addr string) (net.Conn, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hpd *httpProxyDialer) Dial(network string, addr string) (net.Conn, error) {
|
func (hpd *httpProxyDialer) Dial(network string, addr string) (net.Conn, error) {
|
||||||
hostPort, _ := hostPortNoPort(hpd.proxyURL)
|
hostPort, _ := hostPortNoPort(hpd.proxyURL)
|
||||||
conn, err := hpd.fowardDial(network, hostPort)
|
conn, err := hpd.forwardDial(network, hostPort)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
4
vendor/github.com/gorilla/websocket/server.go
generated
vendored
4
vendor/github.com/gorilla/websocket/server.go
generated
vendored
@@ -27,7 +27,7 @@ type Upgrader struct {
|
|||||||
// HandshakeTimeout specifies the duration for the handshake to complete.
|
// HandshakeTimeout specifies the duration for the handshake to complete.
|
||||||
HandshakeTimeout time.Duration
|
HandshakeTimeout time.Duration
|
||||||
|
|
||||||
// ReadBufferSize and WriteBufferSize specify I/O buffer sizes. If a buffer
|
// ReadBufferSize and WriteBufferSize specify I/O buffer sizes in bytes. If a buffer
|
||||||
// size is zero, then buffers allocated by the HTTP server are used. The
|
// size is zero, then buffers allocated by the HTTP server are used. The
|
||||||
// I/O buffer sizes do not limit the size of the messages that can be sent
|
// I/O buffer sizes do not limit the size of the messages that can be sent
|
||||||
// or received.
|
// or received.
|
||||||
@@ -153,7 +153,7 @@ func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeade
|
|||||||
|
|
||||||
challengeKey := r.Header.Get("Sec-Websocket-Key")
|
challengeKey := r.Header.Get("Sec-Websocket-Key")
|
||||||
if challengeKey == "" {
|
if challengeKey == "" {
|
||||||
return u.returnError(w, r, http.StatusBadRequest, "websocket: not a websocket handshake: `Sec-WebSocket-Key' header is missing or blank")
|
return u.returnError(w, r, http.StatusBadRequest, "websocket: not a websocket handshake: 'Sec-WebSocket-Key' header is missing or blank")
|
||||||
}
|
}
|
||||||
|
|
||||||
subprotocol := u.selectSubprotocol(r, responseHeader)
|
subprotocol := u.selectSubprotocol(r, responseHeader)
|
||||||
|
|||||||
132
vendor/github.com/gorilla/websocket/util.go
generated
vendored
132
vendor/github.com/gorilla/websocket/util.go
generated
vendored
@@ -31,68 +31,113 @@ func generateChallengeKey() (string, error) {
|
|||||||
return base64.StdEncoding.EncodeToString(p), nil
|
return base64.StdEncoding.EncodeToString(p), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Octet types from RFC 2616.
|
// Token octets per RFC 2616.
|
||||||
var octetTypes [256]byte
|
var isTokenOctet = [256]bool{
|
||||||
|
'!': true,
|
||||||
const (
|
'#': true,
|
||||||
isTokenOctet = 1 << iota
|
'$': true,
|
||||||
isSpaceOctet
|
'%': true,
|
||||||
)
|
'&': true,
|
||||||
|
'\'': true,
|
||||||
func init() {
|
'*': true,
|
||||||
// From RFC 2616
|
'+': true,
|
||||||
//
|
'-': true,
|
||||||
// OCTET = <any 8-bit sequence of data>
|
'.': true,
|
||||||
// CHAR = <any US-ASCII character (octets 0 - 127)>
|
'0': true,
|
||||||
// CTL = <any US-ASCII control character (octets 0 - 31) and DEL (127)>
|
'1': true,
|
||||||
// CR = <US-ASCII CR, carriage return (13)>
|
'2': true,
|
||||||
// LF = <US-ASCII LF, linefeed (10)>
|
'3': true,
|
||||||
// SP = <US-ASCII SP, space (32)>
|
'4': true,
|
||||||
// HT = <US-ASCII HT, horizontal-tab (9)>
|
'5': true,
|
||||||
// <"> = <US-ASCII double-quote mark (34)>
|
'6': true,
|
||||||
// CRLF = CR LF
|
'7': true,
|
||||||
// LWS = [CRLF] 1*( SP | HT )
|
'8': true,
|
||||||
// TEXT = <any OCTET except CTLs, but including LWS>
|
'9': true,
|
||||||
// separators = "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\" | <">
|
'A': true,
|
||||||
// | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT
|
'B': true,
|
||||||
// token = 1*<any CHAR except CTLs or separators>
|
'C': true,
|
||||||
// qdtext = <any TEXT except <">>
|
'D': true,
|
||||||
|
'E': true,
|
||||||
for c := 0; c < 256; c++ {
|
'F': true,
|
||||||
var t byte
|
'G': true,
|
||||||
isCtl := c <= 31 || c == 127
|
'H': true,
|
||||||
isChar := 0 <= c && c <= 127
|
'I': true,
|
||||||
isSeparator := strings.IndexRune(" \t\"(),/:;<=>?@[]\\{}", rune(c)) >= 0
|
'J': true,
|
||||||
if strings.IndexRune(" \t\r\n", rune(c)) >= 0 {
|
'K': true,
|
||||||
t |= isSpaceOctet
|
'L': true,
|
||||||
}
|
'M': true,
|
||||||
if isChar && !isCtl && !isSeparator {
|
'N': true,
|
||||||
t |= isTokenOctet
|
'O': true,
|
||||||
}
|
'P': true,
|
||||||
octetTypes[c] = t
|
'Q': true,
|
||||||
}
|
'R': true,
|
||||||
|
'S': true,
|
||||||
|
'T': true,
|
||||||
|
'U': true,
|
||||||
|
'W': true,
|
||||||
|
'V': true,
|
||||||
|
'X': true,
|
||||||
|
'Y': true,
|
||||||
|
'Z': true,
|
||||||
|
'^': true,
|
||||||
|
'_': true,
|
||||||
|
'`': true,
|
||||||
|
'a': true,
|
||||||
|
'b': true,
|
||||||
|
'c': true,
|
||||||
|
'd': true,
|
||||||
|
'e': true,
|
||||||
|
'f': true,
|
||||||
|
'g': true,
|
||||||
|
'h': true,
|
||||||
|
'i': true,
|
||||||
|
'j': true,
|
||||||
|
'k': true,
|
||||||
|
'l': true,
|
||||||
|
'm': true,
|
||||||
|
'n': true,
|
||||||
|
'o': true,
|
||||||
|
'p': true,
|
||||||
|
'q': true,
|
||||||
|
'r': true,
|
||||||
|
's': true,
|
||||||
|
't': true,
|
||||||
|
'u': true,
|
||||||
|
'v': true,
|
||||||
|
'w': true,
|
||||||
|
'x': true,
|
||||||
|
'y': true,
|
||||||
|
'z': true,
|
||||||
|
'|': true,
|
||||||
|
'~': true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// skipSpace returns a slice of the string s with all leading RFC 2616 linear
|
||||||
|
// whitespace removed.
|
||||||
func skipSpace(s string) (rest string) {
|
func skipSpace(s string) (rest string) {
|
||||||
i := 0
|
i := 0
|
||||||
for ; i < len(s); i++ {
|
for ; i < len(s); i++ {
|
||||||
if octetTypes[s[i]]&isSpaceOctet == 0 {
|
if b := s[i]; b != ' ' && b != '\t' {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return s[i:]
|
return s[i:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// nextToken returns the leading RFC 2616 token of s and the string following
|
||||||
|
// the token.
|
||||||
func nextToken(s string) (token, rest string) {
|
func nextToken(s string) (token, rest string) {
|
||||||
i := 0
|
i := 0
|
||||||
for ; i < len(s); i++ {
|
for ; i < len(s); i++ {
|
||||||
if octetTypes[s[i]]&isTokenOctet == 0 {
|
if !isTokenOctet[s[i]] {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return s[:i], s[i:]
|
return s[:i], s[i:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// nextTokenOrQuoted returns the leading token or quoted string per RFC 2616
|
||||||
|
// and the string following the token or quoted string.
|
||||||
func nextTokenOrQuoted(s string) (value string, rest string) {
|
func nextTokenOrQuoted(s string) (value string, rest string) {
|
||||||
if !strings.HasPrefix(s, "\"") {
|
if !strings.HasPrefix(s, "\"") {
|
||||||
return nextToken(s)
|
return nextToken(s)
|
||||||
@@ -128,7 +173,8 @@ func nextTokenOrQuoted(s string) (value string, rest string) {
|
|||||||
return "", ""
|
return "", ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// equalASCIIFold returns true if s is equal to t with ASCII case folding.
|
// equalASCIIFold returns true if s is equal to t with ASCII case folding as
|
||||||
|
// defined in RFC 4790.
|
||||||
func equalASCIIFold(s, t string) bool {
|
func equalASCIIFold(s, t string) bool {
|
||||||
for s != "" && t != "" {
|
for s != "" && t != "" {
|
||||||
sr, size := utf8.DecodeRuneInString(s)
|
sr, size := utf8.DecodeRuneInString(s)
|
||||||
|
|||||||
2
vendor/github.com/hashicorp/golang-lru/go.mod
generated
vendored
2
vendor/github.com/hashicorp/golang-lru/go.mod
generated
vendored
@@ -1 +1,3 @@
|
|||||||
module github.com/hashicorp/golang-lru
|
module github.com/hashicorp/golang-lru
|
||||||
|
|
||||||
|
go 1.12
|
||||||
|
|||||||
26
vendor/github.com/hashicorp/golang-lru/lru.go
generated
vendored
26
vendor/github.com/hashicorp/golang-lru/lru.go
generated
vendored
@@ -86,17 +86,35 @@ func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evicted bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remove removes the provided key from the cache.
|
// Remove removes the provided key from the cache.
|
||||||
func (c *Cache) Remove(key interface{}) {
|
func (c *Cache) Remove(key interface{}) (present bool) {
|
||||||
c.lock.Lock()
|
c.lock.Lock()
|
||||||
c.lru.Remove(key)
|
present = c.lru.Remove(key)
|
||||||
c.lock.Unlock()
|
c.lock.Unlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resize changes the cache size.
|
||||||
|
func (c *Cache) Resize(size int) (evicted int) {
|
||||||
|
c.lock.Lock()
|
||||||
|
evicted = c.lru.Resize(size)
|
||||||
|
c.lock.Unlock()
|
||||||
|
return evicted
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveOldest removes the oldest item from the cache.
|
// RemoveOldest removes the oldest item from the cache.
|
||||||
func (c *Cache) RemoveOldest() {
|
func (c *Cache) RemoveOldest() (key interface{}, value interface{}, ok bool) {
|
||||||
c.lock.Lock()
|
c.lock.Lock()
|
||||||
c.lru.RemoveOldest()
|
key, value, ok = c.lru.RemoveOldest()
|
||||||
c.lock.Unlock()
|
c.lock.Unlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetOldest returns the oldest entry
|
||||||
|
func (c *Cache) GetOldest() (key interface{}, value interface{}, ok bool) {
|
||||||
|
c.lock.Lock()
|
||||||
|
key, value, ok = c.lru.GetOldest()
|
||||||
|
c.lock.Unlock()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keys returns a slice of the keys in the cache, from oldest to newest.
|
// Keys returns a slice of the keys in the cache, from oldest to newest.
|
||||||
|
|||||||
16
vendor/github.com/hashicorp/golang-lru/simplelru/lru.go
generated
vendored
16
vendor/github.com/hashicorp/golang-lru/simplelru/lru.go
generated
vendored
@@ -73,6 +73,9 @@ func (c *LRU) Add(key, value interface{}) (evicted bool) {
|
|||||||
func (c *LRU) Get(key interface{}) (value interface{}, ok bool) {
|
func (c *LRU) Get(key interface{}) (value interface{}, ok bool) {
|
||||||
if ent, ok := c.items[key]; ok {
|
if ent, ok := c.items[key]; ok {
|
||||||
c.evictList.MoveToFront(ent)
|
c.evictList.MoveToFront(ent)
|
||||||
|
if ent.Value.(*entry) == nil {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
return ent.Value.(*entry).value, true
|
return ent.Value.(*entry).value, true
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@@ -142,6 +145,19 @@ func (c *LRU) Len() int {
|
|||||||
return c.evictList.Len()
|
return c.evictList.Len()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Resize changes the cache size.
|
||||||
|
func (c *LRU) Resize(size int) (evicted int) {
|
||||||
|
diff := c.Len() - size
|
||||||
|
if diff < 0 {
|
||||||
|
diff = 0
|
||||||
|
}
|
||||||
|
for i := 0; i < diff; i++ {
|
||||||
|
c.removeOldest()
|
||||||
|
}
|
||||||
|
c.size = size
|
||||||
|
return diff
|
||||||
|
}
|
||||||
|
|
||||||
// removeOldest removes the oldest item from the cache.
|
// removeOldest removes the oldest item from the cache.
|
||||||
func (c *LRU) removeOldest() {
|
func (c *LRU) removeOldest() {
|
||||||
ent := c.evictList.Back()
|
ent := c.evictList.Back()
|
||||||
|
|||||||
7
vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go
generated
vendored
7
vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go
generated
vendored
@@ -10,7 +10,7 @@ type LRUCache interface {
|
|||||||
// updates the "recently used"-ness of the key. #value, isFound
|
// updates the "recently used"-ness of the key. #value, isFound
|
||||||
Get(key interface{}) (value interface{}, ok bool)
|
Get(key interface{}) (value interface{}, ok bool)
|
||||||
|
|
||||||
// Check if a key exsists in cache without updating the recent-ness.
|
// Checks if a key exists in cache without updating the recent-ness.
|
||||||
Contains(key interface{}) (ok bool)
|
Contains(key interface{}) (ok bool)
|
||||||
|
|
||||||
// Returns key's value without updating the "recently used"-ness of the key.
|
// Returns key's value without updating the "recently used"-ness of the key.
|
||||||
@@ -31,6 +31,9 @@ type LRUCache interface {
|
|||||||
// Returns the number of items in the cache.
|
// Returns the number of items in the cache.
|
||||||
Len() int
|
Len() int
|
||||||
|
|
||||||
// Clear all cache entries
|
// Clears all cache entries.
|
||||||
Purge()
|
Purge()
|
||||||
|
|
||||||
|
// Resizes cache, returning number evicted
|
||||||
|
Resize(int) int
|
||||||
}
|
}
|
||||||
|
|||||||
27
vendor/github.com/keybase/go-keybase-chat-bot/LICENSE
generated
vendored
Normal file
27
vendor/github.com/keybase/go-keybase-chat-bot/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
Copyright (c) 2017, Keybase
|
||||||
|
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.
|
||||||
|
|
||||||
|
* Neither the name of keybase nor the names of its
|
||||||
|
contributors may 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 HOLDER 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.
|
||||||
693
vendor/github.com/keybase/go-keybase-chat-bot/kbchat/kbchat.go
generated
vendored
Normal file
693
vendor/github.com/keybase/go-keybase-chat-bot/kbchat/kbchat.go
generated
vendored
Normal file
@@ -0,0 +1,693 @@
|
|||||||
|
package kbchat
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// API is the main object used for communicating with the Keybase JSON API
|
||||||
|
type API struct {
|
||||||
|
sync.Mutex
|
||||||
|
apiInput io.Writer
|
||||||
|
apiOutput *bufio.Reader
|
||||||
|
apiCmd *exec.Cmd
|
||||||
|
username string
|
||||||
|
runOpts RunOptions
|
||||||
|
}
|
||||||
|
|
||||||
|
func getUsername(runOpts RunOptions) (username string, err error) {
|
||||||
|
p := runOpts.Command("status")
|
||||||
|
output, err := p.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if err = p.Start(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
doneCh := make(chan error)
|
||||||
|
go func() {
|
||||||
|
scanner := bufio.NewScanner(output)
|
||||||
|
if !scanner.Scan() {
|
||||||
|
doneCh <- errors.New("unable to find Keybase username")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
toks := strings.Fields(scanner.Text())
|
||||||
|
if len(toks) != 2 {
|
||||||
|
doneCh <- errors.New("invalid Keybase username output")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
username = toks[1]
|
||||||
|
doneCh <- nil
|
||||||
|
}()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case err = <-doneCh:
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
case <-time.After(5 * time.Second):
|
||||||
|
return "", errors.New("unable to run Keybase command")
|
||||||
|
}
|
||||||
|
|
||||||
|
return username, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type OneshotOptions struct {
|
||||||
|
Username string
|
||||||
|
PaperKey string
|
||||||
|
}
|
||||||
|
|
||||||
|
type RunOptions struct {
|
||||||
|
KeybaseLocation string
|
||||||
|
HomeDir string
|
||||||
|
Oneshot *OneshotOptions
|
||||||
|
StartService bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r RunOptions) Location() string {
|
||||||
|
if r.KeybaseLocation == "" {
|
||||||
|
return "keybase"
|
||||||
|
}
|
||||||
|
return r.KeybaseLocation
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r RunOptions) Command(args ...string) *exec.Cmd {
|
||||||
|
var cmd []string
|
||||||
|
if r.HomeDir != "" {
|
||||||
|
cmd = append(cmd, "--home", r.HomeDir)
|
||||||
|
}
|
||||||
|
cmd = append(cmd, args...)
|
||||||
|
return exec.Command(r.Location(), cmd...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start fires up the Keybase JSON API in stdin/stdout mode
|
||||||
|
func Start(runOpts RunOptions) (*API, error) {
|
||||||
|
api := &API{
|
||||||
|
runOpts: runOpts,
|
||||||
|
}
|
||||||
|
if err := api.startPipes(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return api, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) auth() (string, error) {
|
||||||
|
username, err := getUsername(a.runOpts)
|
||||||
|
if err == nil {
|
||||||
|
return username, nil
|
||||||
|
}
|
||||||
|
if a.runOpts.Oneshot == nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
username = ""
|
||||||
|
// If a paper key is specified, then login with oneshot mode (logout first)
|
||||||
|
if a.runOpts.Oneshot != nil {
|
||||||
|
if username == a.runOpts.Oneshot.Username {
|
||||||
|
// just get out if we are on the desired user already
|
||||||
|
return username, nil
|
||||||
|
}
|
||||||
|
if err := a.runOpts.Command("logout", "-f").Run(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if err := a.runOpts.Command("oneshot", "--username", a.runOpts.Oneshot.Username, "--paperkey",
|
||||||
|
a.runOpts.Oneshot.PaperKey).Run(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
username = a.runOpts.Oneshot.Username
|
||||||
|
return username, nil
|
||||||
|
}
|
||||||
|
return "", errors.New("unable to auth")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) startPipes() (err error) {
|
||||||
|
a.Lock()
|
||||||
|
defer a.Unlock()
|
||||||
|
if a.apiCmd != nil {
|
||||||
|
a.apiCmd.Process.Kill()
|
||||||
|
}
|
||||||
|
a.apiCmd = nil
|
||||||
|
|
||||||
|
if a.runOpts.StartService {
|
||||||
|
a.runOpts.Command("service").Start()
|
||||||
|
}
|
||||||
|
|
||||||
|
if a.username, err = a.auth(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
a.apiCmd = a.runOpts.Command("chat", "api")
|
||||||
|
if a.apiInput, err = a.apiCmd.StdinPipe(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
output, err := a.apiCmd.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := a.apiCmd.Start(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
a.apiOutput = bufio.NewReader(output)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var errAPIDisconnected = errors.New("chat API disconnected")
|
||||||
|
|
||||||
|
func (a *API) getAPIPipesLocked() (io.Writer, *bufio.Reader, error) {
|
||||||
|
// this should only be called inside a lock
|
||||||
|
if a.apiCmd == nil {
|
||||||
|
return nil, nil, errAPIDisconnected
|
||||||
|
}
|
||||||
|
return a.apiInput, a.apiOutput, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetConversations reads all conversations from the current user's inbox.
|
||||||
|
func (a *API) GetConversations(unreadOnly bool) ([]Conversation, error) {
|
||||||
|
apiInput := fmt.Sprintf(`{"method":"list", "params": { "options": { "unread_only": %v}}}`, unreadOnly)
|
||||||
|
output, err := a.doFetch(apiInput)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var inbox Inbox
|
||||||
|
if err := json.Unmarshal(output, &inbox); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return inbox.Result.Convs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTextMessages fetches all text messages from a given channel. Optionally can filter
|
||||||
|
// ont unread status.
|
||||||
|
func (a *API) GetTextMessages(channel Channel, unreadOnly bool) ([]Message, error) {
|
||||||
|
channelBytes, err := json.Marshal(channel)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
apiInput := fmt.Sprintf(`{"method": "read", "params": {"options": {"channel": %s}}}`, string(channelBytes))
|
||||||
|
output, err := a.doFetch(apiInput)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var thread Thread
|
||||||
|
|
||||||
|
if err := json.Unmarshal(output, &thread); err != nil {
|
||||||
|
return nil, fmt.Errorf("unable to decode thread: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
var res []Message
|
||||||
|
for _, msg := range thread.Result.Messages {
|
||||||
|
if msg.Msg.Content.Type == "text" {
|
||||||
|
res = append(res, msg.Msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type sendMessageBody struct {
|
||||||
|
Body string
|
||||||
|
}
|
||||||
|
|
||||||
|
type sendMessageOptions struct {
|
||||||
|
Channel Channel `json:"channel,omitempty"`
|
||||||
|
ConversationID string `json:"conversation_id,omitempty"`
|
||||||
|
Message sendMessageBody `json:",omitempty"`
|
||||||
|
Filename string `json:"filename,omitempty"`
|
||||||
|
Title string `json:"title,omitempty"`
|
||||||
|
MsgID int `json:"message_id,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type sendMessageParams struct {
|
||||||
|
Options sendMessageOptions
|
||||||
|
}
|
||||||
|
|
||||||
|
type sendMessageArg struct {
|
||||||
|
Method string
|
||||||
|
Params sendMessageParams
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) doSend(arg interface{}) (response SendResponse, err error) {
|
||||||
|
a.Lock()
|
||||||
|
defer a.Unlock()
|
||||||
|
|
||||||
|
bArg, err := json.Marshal(arg)
|
||||||
|
if err != nil {
|
||||||
|
return SendResponse{}, err
|
||||||
|
}
|
||||||
|
input, output, err := a.getAPIPipesLocked()
|
||||||
|
if err != nil {
|
||||||
|
return SendResponse{}, err
|
||||||
|
}
|
||||||
|
if _, err := io.WriteString(input, string(bArg)); err != nil {
|
||||||
|
return SendResponse{}, err
|
||||||
|
}
|
||||||
|
responseRaw, err := output.ReadBytes('\n')
|
||||||
|
if err != nil {
|
||||||
|
return SendResponse{}, err
|
||||||
|
}
|
||||||
|
if err := json.Unmarshal(responseRaw, &response); err != nil {
|
||||||
|
return SendResponse{}, fmt.Errorf("failed to decode API response: %s", err)
|
||||||
|
}
|
||||||
|
return response, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) doFetch(apiInput string) ([]byte, error) {
|
||||||
|
a.Lock()
|
||||||
|
defer a.Unlock()
|
||||||
|
|
||||||
|
input, output, err := a.getAPIPipesLocked()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if _, err := io.WriteString(input, apiInput); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
byteOutput, err := output.ReadBytes('\n')
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return byteOutput, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) SendMessage(channel Channel, body string) (SendResponse, error) {
|
||||||
|
arg := sendMessageArg{
|
||||||
|
Method: "send",
|
||||||
|
Params: sendMessageParams{
|
||||||
|
Options: sendMessageOptions{
|
||||||
|
Channel: channel,
|
||||||
|
Message: sendMessageBody{
|
||||||
|
Body: body,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return a.doSend(arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) SendMessageByConvID(convID string, body string) (SendResponse, error) {
|
||||||
|
arg := sendMessageArg{
|
||||||
|
Method: "send",
|
||||||
|
Params: sendMessageParams{
|
||||||
|
Options: sendMessageOptions{
|
||||||
|
ConversationID: convID,
|
||||||
|
Message: sendMessageBody{
|
||||||
|
Body: body,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return a.doSend(arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendMessageByTlfName sends a message on the given TLF name
|
||||||
|
func (a *API) SendMessageByTlfName(tlfName string, body string) (SendResponse, error) {
|
||||||
|
arg := sendMessageArg{
|
||||||
|
Method: "send",
|
||||||
|
Params: sendMessageParams{
|
||||||
|
Options: sendMessageOptions{
|
||||||
|
Channel: Channel{
|
||||||
|
Name: tlfName,
|
||||||
|
},
|
||||||
|
Message: sendMessageBody{
|
||||||
|
Body: body,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return a.doSend(arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) SendMessageByTeamName(teamName string, body string, inChannel *string) (SendResponse, error) {
|
||||||
|
channel := "general"
|
||||||
|
if inChannel != nil {
|
||||||
|
channel = *inChannel
|
||||||
|
}
|
||||||
|
arg := sendMessageArg{
|
||||||
|
Method: "send",
|
||||||
|
Params: sendMessageParams{
|
||||||
|
Options: sendMessageOptions{
|
||||||
|
Channel: Channel{
|
||||||
|
MembersType: "team",
|
||||||
|
Name: teamName,
|
||||||
|
TopicName: channel,
|
||||||
|
},
|
||||||
|
Message: sendMessageBody{
|
||||||
|
Body: body,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return a.doSend(arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) SendAttachmentByTeam(teamName string, filename string, title string, inChannel *string) (SendResponse, error) {
|
||||||
|
channel := "general"
|
||||||
|
if inChannel != nil {
|
||||||
|
channel = *inChannel
|
||||||
|
}
|
||||||
|
arg := sendMessageArg{
|
||||||
|
Method: "attach",
|
||||||
|
Params: sendMessageParams{
|
||||||
|
Options: sendMessageOptions{
|
||||||
|
Channel: Channel{
|
||||||
|
MembersType: "team",
|
||||||
|
Name: teamName,
|
||||||
|
TopicName: channel,
|
||||||
|
},
|
||||||
|
Filename: filename,
|
||||||
|
Title: title,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return a.doSend(arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
type reactionOptions struct {
|
||||||
|
ConversationID string `json:"conversation_id"`
|
||||||
|
Message sendMessageBody
|
||||||
|
MsgID int `json:"message_id"`
|
||||||
|
Channel Channel `json:"channel"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type reactionParams struct {
|
||||||
|
Options reactionOptions
|
||||||
|
}
|
||||||
|
|
||||||
|
type reactionArg struct {
|
||||||
|
Method string
|
||||||
|
Params reactionParams
|
||||||
|
}
|
||||||
|
|
||||||
|
func newReactionArg(options reactionOptions) reactionArg {
|
||||||
|
return reactionArg{
|
||||||
|
Method: "reaction",
|
||||||
|
Params: reactionParams{Options: options},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) ReactByChannel(channel Channel, msgID int, reaction string) (SendResponse, error) {
|
||||||
|
arg := newReactionArg(reactionOptions{
|
||||||
|
Message: sendMessageBody{Body: reaction},
|
||||||
|
MsgID: msgID,
|
||||||
|
Channel: channel,
|
||||||
|
})
|
||||||
|
return a.doSend(arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) ReactByConvID(convID string, msgID int, reaction string) (SendResponse, error) {
|
||||||
|
arg := newReactionArg(reactionOptions{
|
||||||
|
Message: sendMessageBody{Body: reaction},
|
||||||
|
MsgID: msgID,
|
||||||
|
ConversationID: convID,
|
||||||
|
})
|
||||||
|
return a.doSend(arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
type advertiseParams struct {
|
||||||
|
Options Advertisement
|
||||||
|
}
|
||||||
|
|
||||||
|
type advertiseMsgArg struct {
|
||||||
|
Method string
|
||||||
|
Params advertiseParams
|
||||||
|
}
|
||||||
|
|
||||||
|
func newAdvertiseMsgArg(ad Advertisement) advertiseMsgArg {
|
||||||
|
return advertiseMsgArg{
|
||||||
|
Method: "advertisecommands",
|
||||||
|
Params: advertiseParams{
|
||||||
|
Options: ad,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) AdvertiseCommands(ad Advertisement) (SendResponse, error) {
|
||||||
|
return a.doSend(newAdvertiseMsgArg(ad))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) Username() string {
|
||||||
|
return a.username
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubscriptionMessage contains a message and conversation object
|
||||||
|
type SubscriptionMessage struct {
|
||||||
|
Message Message
|
||||||
|
Conversation Conversation
|
||||||
|
}
|
||||||
|
|
||||||
|
type SubscriptionWalletEvent struct {
|
||||||
|
Payment Payment
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSubscription has methods to control the background message fetcher loop
|
||||||
|
type NewSubscription struct {
|
||||||
|
newMsgsCh <-chan SubscriptionMessage
|
||||||
|
newWalletCh <-chan SubscriptionWalletEvent
|
||||||
|
errorCh <-chan error
|
||||||
|
shutdownCh chan struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read blocks until a new message arrives
|
||||||
|
func (m NewSubscription) Read() (SubscriptionMessage, error) {
|
||||||
|
select {
|
||||||
|
case msg := <-m.newMsgsCh:
|
||||||
|
return msg, nil
|
||||||
|
case err := <-m.errorCh:
|
||||||
|
return SubscriptionMessage{}, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read blocks until a new message arrives
|
||||||
|
func (m NewSubscription) ReadWallet() (SubscriptionWalletEvent, error) {
|
||||||
|
select {
|
||||||
|
case msg := <-m.newWalletCh:
|
||||||
|
return msg, nil
|
||||||
|
case err := <-m.errorCh:
|
||||||
|
return SubscriptionWalletEvent{}, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shutdown terminates the background process
|
||||||
|
func (m NewSubscription) Shutdown() {
|
||||||
|
m.shutdownCh <- struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type ListenOptions struct {
|
||||||
|
Wallet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListenForNewTextMessages proxies to Listen without wallet events
|
||||||
|
func (a *API) ListenForNewTextMessages() (NewSubscription, error) {
|
||||||
|
opts := ListenOptions{Wallet: false}
|
||||||
|
return a.Listen(opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Listen fires of a background loop and puts chat messages and wallet
|
||||||
|
// events into channels
|
||||||
|
func (a *API) Listen(opts ListenOptions) (NewSubscription, error) {
|
||||||
|
newMsgCh := make(chan SubscriptionMessage, 100)
|
||||||
|
newWalletCh := make(chan SubscriptionWalletEvent, 100)
|
||||||
|
errorCh := make(chan error, 100)
|
||||||
|
shutdownCh := make(chan struct{})
|
||||||
|
done := make(chan struct{})
|
||||||
|
|
||||||
|
sub := NewSubscription{
|
||||||
|
newMsgsCh: newMsgCh,
|
||||||
|
newWalletCh: newWalletCh,
|
||||||
|
shutdownCh: shutdownCh,
|
||||||
|
errorCh: errorCh,
|
||||||
|
}
|
||||||
|
pause := 2 * time.Second
|
||||||
|
readScanner := func(boutput *bufio.Scanner) {
|
||||||
|
for {
|
||||||
|
boutput.Scan()
|
||||||
|
t := boutput.Text()
|
||||||
|
var typeHolder TypeHolder
|
||||||
|
if err := json.Unmarshal([]byte(t), &typeHolder); err != nil {
|
||||||
|
errorCh <- err
|
||||||
|
break
|
||||||
|
}
|
||||||
|
switch typeHolder.Type {
|
||||||
|
case "chat":
|
||||||
|
var holder MessageHolder
|
||||||
|
if err := json.Unmarshal([]byte(t), &holder); err != nil {
|
||||||
|
errorCh <- err
|
||||||
|
break
|
||||||
|
}
|
||||||
|
subscriptionMessage := SubscriptionMessage{
|
||||||
|
Message: holder.Msg,
|
||||||
|
Conversation: Conversation{
|
||||||
|
ID: holder.Msg.ConversationID,
|
||||||
|
Channel: holder.Msg.Channel,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
newMsgCh <- subscriptionMessage
|
||||||
|
case "wallet":
|
||||||
|
var holder PaymentHolder
|
||||||
|
if err := json.Unmarshal([]byte(t), &holder); err != nil {
|
||||||
|
errorCh <- err
|
||||||
|
break
|
||||||
|
}
|
||||||
|
subscriptionPayment := SubscriptionWalletEvent{
|
||||||
|
Payment: holder.Payment,
|
||||||
|
}
|
||||||
|
newWalletCh <- subscriptionPayment
|
||||||
|
default:
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
done <- struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
attempts := 0
|
||||||
|
maxAttempts := 1800
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
if attempts >= maxAttempts {
|
||||||
|
panic("Listen: failed to auth, giving up")
|
||||||
|
}
|
||||||
|
attempts++
|
||||||
|
if _, err := a.auth(); err != nil {
|
||||||
|
log.Printf("Listen: failed to auth: %s", err)
|
||||||
|
time.Sleep(pause)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
cmdElements := []string{"chat", "api-listen"}
|
||||||
|
if opts.Wallet {
|
||||||
|
cmdElements = append(cmdElements, "--wallet")
|
||||||
|
}
|
||||||
|
p := a.runOpts.Command(cmdElements...)
|
||||||
|
output, err := p.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Listen: failed to listen: %s", err)
|
||||||
|
time.Sleep(pause)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
boutput := bufio.NewScanner(output)
|
||||||
|
if err := p.Start(); err != nil {
|
||||||
|
log.Printf("Listen: failed to make listen scanner: %s", err)
|
||||||
|
time.Sleep(pause)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
attempts = 0
|
||||||
|
go readScanner(boutput)
|
||||||
|
<-done
|
||||||
|
p.Wait()
|
||||||
|
time.Sleep(pause)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
return sub, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) GetUsername() string {
|
||||||
|
return a.username
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) ListChannels(teamName string) ([]string, error) {
|
||||||
|
apiInput := fmt.Sprintf(`{"method": "listconvsonname", "params": {"options": {"topic_type": "CHAT", "members_type": "team", "name": "%s"}}}`, teamName)
|
||||||
|
output, err := a.doFetch(apiInput)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var channelsList ChannelsList
|
||||||
|
if err := json.Unmarshal(output, &channelsList); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var channels []string
|
||||||
|
for _, conv := range channelsList.Result.Convs {
|
||||||
|
channels = append(channels, conv.Channel.TopicName)
|
||||||
|
}
|
||||||
|
return channels, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) JoinChannel(teamName string, channelName string) (JoinChannelResult, error) {
|
||||||
|
empty := JoinChannelResult{}
|
||||||
|
|
||||||
|
apiInput := fmt.Sprintf(`{"method": "join", "params": {"options": {"channel": {"name": "%s", "members_type": "team", "topic_name": "%s"}}}}`, teamName, channelName)
|
||||||
|
output, err := a.doFetch(apiInput)
|
||||||
|
if err != nil {
|
||||||
|
return empty, err
|
||||||
|
}
|
||||||
|
|
||||||
|
joinChannel := JoinChannel{}
|
||||||
|
err = json.Unmarshal(output, &joinChannel)
|
||||||
|
if err != nil {
|
||||||
|
return empty, fmt.Errorf("failed to parse output from keybase team api: %v", err)
|
||||||
|
}
|
||||||
|
if joinChannel.Error.Message != "" {
|
||||||
|
return empty, fmt.Errorf("received error from keybase team api: %s", joinChannel.Error.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
return joinChannel.Result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) LeaveChannel(teamName string, channelName string) (LeaveChannelResult, error) {
|
||||||
|
empty := LeaveChannelResult{}
|
||||||
|
|
||||||
|
apiInput := fmt.Sprintf(`{"method": "leave", "params": {"options": {"channel": {"name": "%s", "members_type": "team", "topic_name": "%s"}}}}`, teamName, channelName)
|
||||||
|
output, err := a.doFetch(apiInput)
|
||||||
|
if err != nil {
|
||||||
|
return empty, err
|
||||||
|
}
|
||||||
|
|
||||||
|
leaveChannel := LeaveChannel{}
|
||||||
|
err = json.Unmarshal(output, &leaveChannel)
|
||||||
|
if err != nil {
|
||||||
|
return empty, fmt.Errorf("failed to parse output from keybase team api: %v", err)
|
||||||
|
}
|
||||||
|
if leaveChannel.Error.Message != "" {
|
||||||
|
return empty, fmt.Errorf("received error from keybase team api: %s", leaveChannel.Error.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
return leaveChannel.Result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) LogSend(feedback string) error {
|
||||||
|
feedback = "go-keybase-chat-bot log send\n" +
|
||||||
|
"username: " + a.GetUsername() + "\n" +
|
||||||
|
feedback
|
||||||
|
|
||||||
|
args := []string{
|
||||||
|
"log", "send",
|
||||||
|
"--no-confirm",
|
||||||
|
"--feedback", feedback,
|
||||||
|
}
|
||||||
|
|
||||||
|
// We're determining whether the service is already running by running status
|
||||||
|
// with autofork disabled.
|
||||||
|
if err := a.runOpts.Command("--no-auto-fork", "status"); err != nil {
|
||||||
|
// Assume that there's no service running, so log send as standalone
|
||||||
|
args = append([]string{"--standalone"}, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return a.runOpts.Command(args...).Run()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) Shutdown() error {
|
||||||
|
if a.runOpts.Oneshot != nil {
|
||||||
|
err := a.runOpts.Command("logout", "--force").Run()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if a.runOpts.StartService {
|
||||||
|
err := a.runOpts.Command("ctl", "stop", "--shutdown").Run()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user