https://github.com/jxsl13/twapi
the twapi package is a framework to interact with Teeworlds servers and masterservers. It is slowly being developed to allow working with demos and maps as well as simulating a teeworlds client. Currently interacting with a server's external console(econ) and acting like the server browser(fetching server infos) is supported.
https://github.com/jxsl13/twapi
framework go golang module package teeworlds
Last synced: 7 months ago
JSON representation
the twapi package is a framework to interact with Teeworlds servers and masterservers. It is slowly being developed to allow working with demos and maps as well as simulating a teeworlds client. Currently interacting with a server's external console(econ) and acting like the server browser(fetching server infos) is supported.
- Host: GitHub
- URL: https://github.com/jxsl13/twapi
- Owner: jxsl13
- License: mit
- Created: 2020-01-18T22:49:20.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2024-07-05T20:03:17.000Z (over 1 year ago)
- Last Synced: 2024-07-06T01:05:40.099Z (over 1 year ago)
- Topics: framework, go, golang, module, package, teeworlds
- Language: Go
- Homepage:
- Size: 213 KB
- Stars: 3
- Watchers: 3
- Forks: 2
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# Teeworlds API written in Go
##   [](https://godoc.org/github.com/jxsl13/twapi) [](https://opensource.org/licenses/MIT) [](https://codecov.io/gh/jxsl13/twapi) [](https://lgtm.com/projects/g/jxsl13/twapi/alerts/) [](https://codebeat.co/projects/github-com-jxsl13-twapi-master) [](https://sourcegraph.com/github.com/jxsl13/twapi?badge) [](https://deepsource.io/gh/jxsl13/twapi/)
Currently this supports only the server browser api.
It is possible to retrieve data from the masterservers as well as the server information from the game servers.
In order to download the latest released version, execute:
```shell
go get github.com/jxsl13/twapi@latest
```
In order to download the latest development version, execute:
```shell
go get github.com/jxsl13/twapi@master
```
## Stable packages
- browser
- compression
- config
- econ
## Unstable packages
- network
- protocol
### Example - High Level Abstraction(Open for optimizing suggestions)
```Go
package main
import (
"fmt"
"github.com/jxsl13/twapi/browser"
)
func main() {
// fetch all server infos (that respond within 16 seconds)
// if no servers responded, this list will be empty.
infos, err := browser.ServerInfos()
if err != nil {
panic(err)
}
for _, info := range infos {
fmt.Println(info)
}
// fetches the specified server's players, server name, etc.
// if no answer is received within 16 seconds, this function returns
// an error
infos, err := browser.GetServerInfosOf("89.163.148.121:8305")
if err != nil {
panic(err)
} else {
fmt.Println(infos[0])
}
}
```
### Example - Slightly Higher Level Abstraction - Retrieve Serverlist
```Go
package main
import (
"fmt"
"net"
"time"
"github.com/jxsl13/twapi/browser"
)
func main() {
addr, err := net.ResolveUDPAddr("udp", "master1.teeworlds.com:8283")
if err != nil {
panic(err)
}
conn, err := net.DialUDP("udp", nil, addr)
if err != nil {
panic(err)
}
defer conn.Close()
err = browser.RequestToken(conn)
if err != nil {
panic(err)
}
conn.SetDeadline(time.Now().Add(5 * time.Second))
buffer := [1500]byte{}
bufSlice := buffer[:]
read, err := conn.Read(bufSlice)
if err != nil {
panic(err)
}
bufSlice = bufSlice[:read]
fmt.Printf("read: %d bytes from %s\n", read, conn.RemoteAddr().String())
// create toke from response
token, err := browser.ParseToken(bufSlice)
if err != nil {
panic(err)
}
// reset slice
bufSlice = bufSlice[:1500]
err = browser.Request("serverlist", token, conn)
if err != nil {
panic(err)
}
// timeout after 5 secods
// should not return an error
conn.SetDeadline(time.Now().Add(5 * time.Second))
// wait for response or time out
read, err = conn.Read(bufSlice)
bufSlice = bufSlice[:read]
fmt.Printf("read: %d bytes from %s\n", read, conn.RemoteAddr().String())
serverList, err := browser.ParseServerList(bufSlice)
if err != nil {
panic(err)
}
for _, server := range serverList {
fmt.Printf("Server: %s\n", server.String())
}
}
```
### Example - Low Level - Retrieve Serverlist
```Go
package main
import (
"fmt"
"net"
"time"
"github.com/jxsl13/twapi/browser"
)
func main() {
addr, err := net.ResolveUDPAddr("udp", "master1.teeworlds.com:8283")
if err != nil {
panic(err)
}
conn, err := net.DialUDP("udp", nil, addr)
if err != nil {
panic(err)
}
defer conn.Close()
// token request packet
tokenReq := browser.NewTokenRequestPacket()
// send request
written, err := conn.Write(tokenReq)
if err != nil {
panic(err)
}
fmt.Printf("written: %d bytes to %s\n", written, conn.RemoteAddr().String())
conn.SetDeadline(time.Now().Add(5 * time.Second))
buffer := [1500]byte{}
bufSlice := buffer[:]
read, err := conn.Read(bufSlice)
if err != nil {
panic(err)
}
bufSlice = bufSlice[:read]
fmt.Printf("read: %d bytes from %s\n", read, conn.RemoteAddr().String())
// create toke from response
token, err := browser.ParseToken(bufSlice)
if err != nil {
panic(err)
}
// reset slice
bufSlice = bufSlice[:1500]
// create a new request from token
serverListReq, err := browser.NewServerListRequestPacket(token)
// Send server list request
written, err = conn.Write(serverListReq)
if err != nil {
panic(err)
}
fmt.Printf("written: %d bytes to %s\n", written, conn.RemoteAddr().String())
// timeout after 5 secods
// should not return an error
conn.SetDeadline(time.Now().Add(5 * time.Second))
// wait for response or time out
read, err = conn.Read(bufSlice)
bufSlice = bufSlice[:read]
fmt.Printf("read: %d bytes from %s\n", read, conn.RemoteAddr().String())
serverList, err := browser.ParseServerList(bufSlice)
if err != nil {
panic(err)
}
for _, server := range serverList {
fmt.Printf("Server: %s\n", server.String())
}
}
```