Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 7.81 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "net"
  5.     "log"
  6.     "fmt"
  7.     "time"
  8.     //"strings"
  9. )
  10. import "database/sql"
  11. import _ "github.com/go-sql-driver/mysql"
  12. import (
  13.     "encoding/json"
  14.  
  15. )
  16.  
  17. const port = 1337
  18.  
  19.  
  20.  
  21. //CREATE TABLE `chat`.`chat` ( `id` INT(6) NOT NULL AUTO_INCREMENT ,
  22. // `login` VARCHAR(30) NULL DEFAULT NULL ,
  23. // `password` VARCHAR(30) NULL DEFAULT NULL ,
  24. // `IP` VARCHAR(30) NOT NULL DEFAULT '0.0.0.0:0' ,
  25. // PRIMARY KEY (`id`)) ENGINE = InnoDB;
  26.  
  27.  
  28. //INSERT INTO `chat` (`id`, `login`, `password`, `IP`) VALUES (NULL, 'login', 'password', '127.0.0.1:1337');
  29. //INSERT INTO `chat` (`id`, `login`, `password`, `IP`) VALUES (NULL, 'root', 'toor', '127.0.0.1:1447');
  30.  
  31. //var db, err = sql.Open("mysql", "root:546595@/chat")
  32.  
  33. type Answer struct {
  34.     ID     string `json:"id"`
  35.     Answer string `json:"answer"`
  36. }
  37.  
  38. type Messege struct {
  39.     Command string `json:"command"`
  40.     ID string `json:"id"`
  41.     Payload struct {
  42.         Login         string `json:"login"`
  43.         Password      string `json:"password"`
  44.         MyLogin       string `json:"my_login"`
  45.         FriendLogin   string `json:"friend_login"`
  46.         ToRemoveLogin string `json:"to_remove_login"`
  47.         IP            string `json:"IP"`
  48.     } `json:"payload"`
  49. }
  50.  
  51.  
  52. type Server struct {
  53.     connection *net.UDPConn
  54.     messages   chan string
  55.     client     *net.UDPAddr //or use map with an uuid
  56. }
  57.  
  58. var buffer = make([]byte, 1024)
  59.  
  60. func checkErr(err error) {
  61.     if err != nil {
  62.         panic(err)
  63.     }
  64. }
  65.  
  66. func errorCheck(err error, where string, kill bool) {
  67.     if err != nil {
  68.         log.Printf("‡‡‡ Error ‡‡‡ %s | %s", err.Error(), where)
  69.         if kill {
  70.             log.Fatalln("Script Terminated")
  71.         }
  72.     }
  73. }
  74.  
  75.  
  76.  
  77.  
  78. func (s *Server) handleMessage() {
  79.     var buf [512]byte
  80.  
  81.     n, addr, err := s.connection.ReadFromUDP(buf[0:])
  82.     errorCheck(err, "handleMessage", false)
  83.  
  84.     got := string(buf[0:n])
  85.     log.Printf("a client [%s] sent [%s]\n", addr, got)
  86.  
  87.     // respond with something ?
  88.     s.client = addr
  89.  
  90.     db, err := sql.Open("mysql", "root:@tcp(0.0.0.0:3306)/chat")
  91.     if err != nil {
  92.         log.Fatal(err)
  93.     }
  94.  
  95.  
  96.     defer db.Close()
  97.  
  98.     var msge  = []byte(got)
  99.  
  100.     //log.Printf("msge = " + string(msge))
  101.  
  102.     var IP  = addr.String()
  103.     var msg_struct = Messege{}
  104.     var msg_answer_FAIL = Answer{}
  105.  
  106.  
  107.  
  108.  
  109.     err1 := json.Unmarshal(msge, &msg_struct)
  110.     if err1 != nil {
  111.         log.Fatal("error")
  112.     }
  113.  
  114.     //log.Printf("msge = " + msg_struct.Payload.Password)
  115.  
  116.  
  117.     //log.Printf(msg_command)
  118.  
  119.     msg_answer_FAIL.Answer = "FAIL"
  120.     msg_answer_FAIL.ID = msg_struct.ID
  121.  
  122.     answer_to_client_json, err := json.Marshal(msg_answer_FAIL)
  123.     if err != nil {
  124.         fmt.Println(err)
  125.         return
  126.     }
  127.     //fmt.Print(string(answer_to_client_json))
  128.  
  129.     switch msg_struct.Command {
  130.  
  131.     case "user.register":
  132.  
  133.         //check is avalible
  134.         //SELECT `id` FROM `chat` WHERE `id` IS NOT NULL AND `login` LIKE 'root'
  135.  
  136.         var check_null sql.NullString
  137.         err  :=
  138.             db.QueryRow("select login from chat where id is not null and login = ?",
  139.                 msg_struct.Payload.Login).Scan(&check_null)
  140.  
  141.  
  142.  
  143.         if check_null.Valid {
  144.             s.messages <- string(answer_to_client_json)//string(`"{"id":"`+ msg_struct.ID +`","answer":"FAIL"}"`)
  145.             break
  146.         }
  147.         //INSERT INTO `chat` (`id`, `login`, `password`, `IP`) VALUES (NULL, 'login', 'passwd', '127.0.0.1:1447');
  148.         log.Printf("Cliet %s hawe ip = %s and password = %s", msg_struct.Payload.Login, IP, msg_struct.Payload.Password)
  149.  
  150.         insert ,err := db.Exec("INSERT INTO chat (login, password, IP) VALUES (?, ?, ?)",
  151.             string(msg_struct.Payload.Login), string(msg_struct.Payload.Password), IP)
  152.         if err != nil {
  153.             log.Fatal(err)
  154.             s.messages <- string(answer_to_client_json)//string(`"{"id":"`+ msg_struct.ID +`","answer":"FAIL"}"`)//"FAIL INSERT"
  155.             return
  156.         }
  157.         rowsAffected, err := insert.RowsAffected()
  158.         if err != nil {
  159.             log.Fatal(err)
  160.             s.messages <- string(answer_to_client_json)//string(`"{"id":"`+ msg_struct.ID +`","answer":"FAIL"}"`)//"FAIL INSERT"
  161.             return
  162.         }
  163.  
  164.         log.Printf("Cliet %s created successfully (%d row affected)\n", addr, rowsAffected)
  165.  
  166.         msg_answer_FAIL.Answer = "OK"
  167.  
  168.         answer_to_client_json, err := json.Marshal(msg_answer_FAIL)
  169.         if err != nil {
  170.             fmt.Println(err)
  171.             return
  172.         }
  173.  
  174.         s.messages <- string(answer_to_client_json)//string(`"{"id":"`+ msg_struct.ID +`","answer":"OK"}"`)
  175.  
  176.     case "user.login":
  177.         var check_null sql.NullString
  178.         _ = db.QueryRow("select login from chat where id is not null and login = ?",
  179.             msg_struct.Payload.Login).Scan(&check_null)
  180.         var check_user Messege
  181.  
  182.  
  183.         if check_null.Valid {
  184.  
  185.             _ = db.QueryRow("select password from chat where id is not null and login = ?",
  186.                 msg_struct.Payload.Login).Scan(&check_user.Payload.Password)
  187.  
  188.  
  189.             if msg_struct.Payload.Password == check_user.Payload.Password {
  190.  
  191.                 //UPDATE `chat` SET `IP` = '0.0.0.0:1' WHERE `chat`.`login` = root
  192.                 insert ,err := db.Exec("update set IP ? where  chat login = ?",
  193.                     IP, string(msg_struct.Payload.Login))
  194.                 if err != nil {
  195.                     log.Fatal(err)
  196.                     s.messages <- string(answer_to_client_json)//string(`"{"id":"`+ msg_struct.ID +`","answer":"FAIL"}"`)//"FAIL UPDATE IP"
  197.                     return
  198.                 }
  199.                 rowsAffected, err := insert.RowsAffected()
  200.                 if err != nil {
  201.                     log.Fatal(err)
  202.                     s.messages <- string(answer_to_client_json)//string(`"{"id":"`+ msg_struct.ID +`","answer":"FAIL"}"`)//"FAIL UPDATE IP"
  203.                     return
  204.                 }
  205.  
  206.                 log.Printf("Cliet %s created successfully (%d row affected)\n", addr, rowsAffected)
  207.                 msg_answer_FAIL.Answer = "OK"
  208.  
  209.                 answer_to_client_json, err := json.Marshal(msg_answer_FAIL)
  210.                 if err != nil {
  211.                     fmt.Println(err)
  212.                     return
  213.                 }
  214.  
  215.                 s.messages <- string(answer_to_client_json)//string(`"{"id":"`+ msg_struct.ID +`","answer":"OK"}"`)//"OK | " + check_user.Payload.IP
  216.  
  217.  
  218.             } else {
  219.                 s.messages <- string(answer_to_client_json)//string(`"{"id":"`+ msg_struct.ID +`","answer":"FAIL"}"`)//"FAIL WRONG PASSWORD"
  220.                 break
  221.             }
  222.  
  223.         } else {
  224.             s.messages <- string(answer_to_client_json)//string(`"{"id":"`+ msg_struct.ID +`","answer":"FAIL"}"`)//"FAIL USER MUST BE REGISTRATION"
  225.             break
  226.         }
  227.  
  228.  
  229.  
  230.  
  231.     case "user.add_friend":
  232.         var check_null sql.NullString
  233.         _ = db.QueryRow("select login from chat where id is not null and login = ?",
  234.             msg_struct.Payload.MyLogin).Scan(&check_null)
  235.         var check_user Messege
  236.  
  237.  
  238.         if check_null.Valid {
  239.  
  240.             _ = db.QueryRow("select IP from chat where id is not null and login = ?",
  241.                 msg_struct.Payload.FriendLogin).Scan(check_user.Payload.IP)
  242.  
  243.             msg_answer_FAIL.Answer = "OK"
  244.  
  245.             answer_to_client_json, err := json.Marshal(msg_answer_FAIL)
  246.             if err != nil {
  247.                 fmt.Println(err)
  248.                 return
  249.             }
  250.  
  251.             s.messages <- string(answer_to_client_json) //string(`"{"id":"`+ msg_struct.ID +`","answer":"OK"}"`)//"OK | " + check_user.Payload.IP
  252.  
  253.         } else {
  254.             s.messages <- string(answer_to_client_json) //string(`"{"id":"`+ msg_struct.ID +`","answer":"FAIL"}"`)//"FAIL USER MUST BE REGISTRATION"
  255.             break
  256.         }
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.     default:
  264.         //s.messages <- "FAIL" + time.Now().Format("15:04:05")
  265.         s.messages <- string(answer_to_client_json) //string(`"{"id":"`+ msg_struct.ID +`","answer":"FAIL"}"`)//"FAIL 666"
  266.         break
  267.     }
  268.     //s.messages <- "server says hello at " + time.Now().Format("15:04:05")
  269. }
  270.  
  271. func (s *Server) sendMessage() {
  272.     for {
  273.         msg := <-s.messages
  274.         err := s.connection.SetWriteDeadline(time.Now().Add(1 * time.Second))
  275.         if err != nil {
  276.             log.Printf("Seems like this client %s is gone.\n", s.client)
  277.  
  278.         }
  279.         _, err = s.connection.WriteTo([]byte(msg), s.client)
  280.         errorCheck(err, "sendMessage", false)
  281.     }
  282. }
  283.  
  284. func main() {
  285.  
  286.     var s Server
  287.     s.messages = make(chan string, 20)
  288.  
  289.     serverAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%d", port))
  290.     errorCheck(err, "main", true)
  291.  
  292.     s.connection, err = net.ListenUDP("udp", serverAddr)
  293.     errorCheck(err, "main", true)
  294.  
  295.     defer s.connection.Close()
  296.  
  297.     log.Printf("Starting UDP Server, listening at %s", s.connection.LocalAddr())
  298.  
  299.  
  300.     go s.sendMessage()
  301.  
  302.     for {
  303.         s.handleMessage()
  304.     }
  305.  
  306. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement