Advertisement
Guest User

Untitled

a guest
Aug 13th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 5.19 KB | None | 0 0
  1. import (
  2.     "fmt"
  3.     "log"
  4.     "strconv"
  5.     "strings"
  6.     "time"
  7.  
  8.     "github.com/xackery/discordeq/discord"
  9.     "github.com/xackery/eqemuconfig"
  10.     "github.com/ziutek/telnet"
  11. )
  12.  
  13. var newTelnet bool
  14.  
  15. var lastId int
  16. var channelID string
  17.  
  18. type UserMessage struct {
  19.     Id         int       `db:"id"`
  20.     From       string    `db:"from"`
  21.     To         string    `db:"to"`
  22.     Message    string    `db:"message"`
  23.     Type       int       `db:"type"`
  24.     CreateDate time.Time `db:"timerecorded"`
  25. }
  26.  
  27. var userMessages []UserMessage
  28. var config *eqemuconfig.Config
  29.  
  30. var t *telnet.Conn
  31.  
  32. func GetTelnet() (conn *telnet.Conn) {
  33.     conn = t
  34.     return
  35. }
  36.  
  37. func ListenToOOC(eqconfig *eqemuconfig.Config, disco *discord.Discord) {
  38.     var err error
  39.     config = eqconfig
  40.     channelID = config.Discord.ChannelID
  41.  
  42.     if err = connectTelnet(config); err != nil {
  43.         log.Println("[OOC] Warning while getting telnet connection:", err.Error())
  44.         return
  45.     }
  46.  
  47.     if err = checkForMessages(config, t, disco); err != nil {
  48.         log.Println("[OOC] Warning while checking for messages:", err.Error())
  49.     }
  50.     t.Close()
  51.     t = nil
  52.     return
  53. }
  54.  
  55. func connectTelnet(config *eqemuconfig.Config) (err error) {
  56.     if t != nil {
  57.         return
  58.     }
  59.     ip := config.World.Telnet.Ip
  60.     if ip == "" {
  61.         ip = config.World.Tcp.Ip
  62.     }
  63.     port := config.World.Telnet.Port
  64.     if port == "" {
  65.         port = config.World.Tcp.Port
  66.     }
  67.  
  68.     log.Printf("[OOC] Connecting to %s:%s...\n", ip, port)
  69.  
  70.     if t, err = telnet.Dial("tcp", fmt.Sprintf("%s:%s", ip, port)); err != nil {
  71.         return
  72.     }
  73.     t.SetReadDeadline(time.Now().Add(10 * time.Second))
  74.     t.SetWriteDeadline(time.Now().Add(10 * time.Second))
  75.     index := 0
  76.     skipAuth := false
  77.     if index, err = t.SkipUntilIndex("Username:", "Connection established from localhost, assuming admin"); err != nil {
  78.         return
  79.     }
  80.     if index != 0 {
  81.         skipAuth = true
  82.         log.Println("[OOC] Skipping auth")
  83.         newTelnet = true
  84.     }
  85.  
  86.     if !skipAuth {
  87.         if err = Sendln(config.Discord.TelnetUsername); err != nil {
  88.             return
  89.         }
  90.  
  91.         if err = t.SkipUntil("Password:"); err != nil {
  92.             return
  93.         }
  94.         if err = Sendln(config.Discord.TelnetPassword); err != nil {
  95.             return
  96.         }
  97.     }
  98.  
  99.     if err = Sendln("echo off"); err != nil {
  100.         return
  101.     }
  102.  
  103.     if err = Sendln("acceptmessages on"); err != nil {
  104.         return
  105.     }
  106.  
  107.     t.SetReadDeadline(time.Time{})
  108.     t.SetWriteDeadline(time.Time{})
  109.     log.Printf("[OOC] Connected\n")
  110.     return
  111. }
  112.  
  113. func Sendln(s string) (err error) {
  114.  
  115.     buf := make([]byte, len(s)+1)
  116.     copy(buf, s)
  117.     buf[len(s)] = '\n'
  118.     if t == nil {
  119.         for {
  120.             if err = connectTelnet(config); err != nil {
  121.                 return
  122.             }
  123.             fmt.Println("Telnet not connected, reconnecting...")
  124.             time.Sleep(config.Discord.RefreshRate)
  125.         }
  126.     }
  127.     _, err = t.Write(buf)
  128.     return
  129. }
  130.  
  131. func checkForMessages(config *eqemuconfig.Config, t *telnet.Conn, disco *discord.Discord) (err error) {
  132.     data := []byte{}
  133.     message := ""
  134.     for {
  135.         if data, err = t.ReadUntil("\n"); err != nil {
  136.             err = fmt.Errorf("Error reading: %s", err.Error())
  137.             return
  138.         }
  139.         message = string(data)
  140.         //log.Printf("[DEBUG OOC] %s", message)
  141.         if len(message) < 3 { //ignore small messages
  142.             continue
  143.         }
  144.         if !strings.Contains(message, "tells General:") { //ignore non-ooc
  145.             continue
  146.         }
  147.         if strings.Index(message, ">") > 0 && strings.Index(message, ">") < strings.Index(message, " ") { //ignore prompts
  148.             message = message[strings.Index(message, ">")+1:]
  149.         }
  150.         if message[0:1] == "*" { //ignore echo backs
  151.             continue
  152.         }
  153.  
  154.         sender := message[0:strings.Index(message, " tells General:")]
  155.  
  156.         //newTelnet added some odd garbage, this cleans it
  157.         sender = strings.Replace(sender, ">", "", -1) //remove duplicate prompts
  158.         sender = strings.Replace(sender, " ", "", -1) //clean up
  159.         sender = alphanumeric(sender)                 //purify name to be alphanumeric
  160.  
  161.         padOffset := 3
  162.         if newTelnet { //if new telnet, offsetis 2 off.
  163.             padOffset = 2
  164.         }
  165.         message = message[strings.Index(message, "tells General: '")+11 : len(message)-padOffset]
  166.  
  167.         sender = strings.Replace(sender, "_", " ", -1)
  168.  
  169.         message = convertLinks(config.Discord.ItemUrl, message)
  170.  
  171.         if _, err = disco.SendMessage(channelID, fmt.Sprintf("**%s OOC**: %s", sender, message)); err != nil {
  172.             errStr := err.Error()
  173.             if strings.Contains(err.Error(), "Unauthorized") {
  174.                 errStr = fmt.Sprintf("%s (try visiting: https://discordapp.com/oauth2/authorize?&client_id=%s&scope=bot&permissions=2146958591 to give access)", err.Error(), config.Discord.ClientID)
  175.             }
  176.             log.Printf("[OOC] Error sending message (%s: %s) %s", sender, message, errStr)
  177.             continue
  178.         }
  179.         log.Printf("[OOC] %s: %s\n", sender, message)
  180.     }
  181. }
  182.  
  183. func convertLinks(prefix string, message string) (messageFixed string) {
  184.     messageFixed = message
  185.     if strings.Count(message, "") > 1 {
  186.         sets := strings.SplitN(message, "", 3)
  187.  
  188.         itemid, err := strconv.ParseInt(sets[1][0:6], 16, 32)
  189.         if err != nil {
  190.             itemid = 0
  191.         }
  192.         itemname := sets[1][56:]
  193.         itemlink := prefix
  194.         if itemid > 0 && len(prefix) > 0 {
  195.             itemlink = fmt.Sprintf(" %s%d (%s)", itemlink, itemid, itemname)
  196.         } else {
  197.             itemlink = fmt.Sprintf(" *%s* ", itemname)
  198.         }
  199.         messageFixed = sets[0] + itemlink + sets[2]
  200.         if strings.Count(message, "") > 1 {
  201.             messageFixed = convertLinks(prefix, messageFixed)
  202.         }
  203.     }
  204.     return
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement