Advertisement
Guest User

Untitled

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