Advertisement
MrFastDie

Untitled

Oct 15th, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.49 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "encoding/binary"
  6.     "net"
  7.     "github.com/kr/pretty"
  8.     "io/ioutil"
  9. )
  10.  
  11. type Initializer struct {
  12.     Host string
  13.     Port int
  14. }
  15.  
  16. func main() {
  17.     fmt.Println("Hello world")
  18.  
  19.     init := Initializer{"212.114.60.140", 25565}
  20.  
  21.     data, err := GetData(init)
  22.     if err != nil {
  23.         fmt.Println(err)
  24.     }
  25.  
  26.     pretty.Println(data)
  27. }
  28.  
  29. func pack_data(data []byte) []byte {
  30.     length := len(data)
  31.     var bs = make([]byte, 2)
  32.     binary.BigEndian.PutUint16(bs, uint16(length))
  33.  
  34.     newData := pack_variant(data)
  35.  
  36.     return append(bs, newData...)
  37. }
  38.  
  39. func pack_uint32(i int) []byte {
  40.     bs := make([]byte, 4)
  41.     binary.BigEndian.PutUint32(bs, uint32(i))
  42.  
  43.     return bs
  44. }
  45.  
  46. func pack_port(port int) []byte {
  47.     var bs = make([]byte, 2)
  48.     binary.BigEndian.PutUint16(bs, uint16(port))
  49.  
  50.     return bs
  51. }
  52.  
  53. func pack_variant(d []byte) []byte {
  54.     var bs = make([]byte, 2)
  55.     var o []byte
  56.  
  57.     for i := range(d){
  58.         b := d[i] & 0x7F
  59.         d[i] >>= 7
  60.  
  61.         if d[i] > 0 {
  62.             binary.BigEndian.PutUint16(bs, uint16(b) | 0x80)
  63.         } else {
  64.             bs[0] = 0
  65.         }
  66.  
  67.         o = append(o, bs...)
  68.     }
  69.  
  70.     return o
  71. }
  72.  
  73. func GetData(initializer Initializer) (interface{}, error) {
  74.     // Minecraft Server Handshake
  75.     // Two requests should be made
  76.     // first: 0x00 Packet ID + -1 as Protocol Version (VarInt) + ServerAddress as String + ServerPort as Unsigned Short, Next State should be 1 VarInt in this case
  77.     // second: 0x00
  78.  
  79.     hostport := append([]byte(initializer.Host), pack_port(initializer.Port)...)
  80.     hostport = append(hostport, 0x01)
  81.  
  82.     hostport = pack_data(hostport)
  83.  
  84.     first := []byte {0x00, 0x00}
  85.     first = append(first, pack_data(hostport)...)
  86.  
  87.     second := []byte {0x00}
  88.  
  89.     conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", initializer.Host, initializer.Port))
  90.     if err != nil {
  91.         return nil, err
  92.     }
  93.     defer conn.Close()
  94.  
  95.     _, err = conn.Write(pack_data(first))
  96.     if err != nil {
  97.         return nil, err
  98.     }
  99.  
  100.     _, err = conn.Write(pack_data(second))
  101.     if err != nil {
  102.         return nil, err
  103.     }
  104.  
  105.     //var buf bytes.Buffer
  106.     //io.Copy(&buf, conn)
  107.  
  108.     buf, err := ioutil.ReadAll(conn)
  109.     pretty.Println(buf)
  110.  
  111.     //unpack_variant(conn) // Packet length
  112.     //unpack_variant(conn) // Packet ID
  113.     //ret, err := unpack_variant(conn) // String length
  114.     //if err != nil {
  115.     //  return nil, err
  116.     //}
  117.     //
  118.     //var d []byte
  119.     //for len(d) < int(ret) {
  120.     //  data := make([]byte, 1024)
  121.     //  _, err := conn.Read(data)
  122.     //  if err != nil {
  123.     //      return nil, err
  124.     //  }
  125.     //
  126.     //  d = append(d, data...)
  127.     //}
  128.  
  129.     //returner, err := json.Marshal(&buf)
  130.     return buf, err
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement