serv_rpc.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // package serv_rpc -- сервер RPC-запросов
  2. package serv_rpc
  3. import (
  4. "fmt"
  5. "log"
  6. "net"
  7. "net/http"
  8. "net/rpc"
  9. "os"
  10. "wartank/pkg/types"
  11. )
  12. type ServRpc struct {
  13. serv types.IServer
  14. }
  15. // NewServRpc -- возвращает новый сервер RPC-запросов
  16. func NewServRpc(serv types.IServer) (*ServRpc, error) {
  17. if serv == nil {
  18. return nil, fmt.Errorf("NewServRpc(): IServer==nil")
  19. }
  20. sf := &ServRpc{
  21. serv: serv,
  22. }
  23. return sf, nil
  24. }
  25. // Run -- запускает сервис в работу
  26. func (sf *ServRpc) Run() {
  27. rpc.Register(sf)
  28. rpc.HandleHTTP()
  29. url := os.Getenv("SERVER_RPC_URL")
  30. if url == "" {
  31. log.Printf("ServRpc.Run(): env SERVER_RPC_URL not set\n")
  32. return
  33. }
  34. log.Printf("SERVER_RPC_URL=%v\n", url)
  35. lister, err := net.Listen("tcp", url)
  36. if err != nil {
  37. log.Printf("NewServRc(): listen error, err=\n\t%v\n", err)
  38. sf.serv.CancelApp()
  39. return
  40. }
  41. go http.Serve(lister, nil)
  42. }
  43. // EchoReq -- эхо запрос на сервер
  44. type EchoReq struct{}
  45. // EchoResp -- эхо ответ на запрос
  46. type EchoResp struct {
  47. Result string
  48. }
  49. // Echo -- эхо запрос для клиента
  50. func (sf *ServRpc) Echo(req *EchoReq, resp *EchoResp) error {
  51. log.Println("ServRpc.Echo()")
  52. resp.Result = "WarTank!"
  53. return nil
  54. }
  55. // LoginReq -- запрос на логин на сервер
  56. type LoginReq struct {
  57. Login string
  58. Pass string
  59. }
  60. // LoginResp -- ответ на запрос логина
  61. //
  62. // Вернёт ошибку если:
  63. // 1. Нужно создать админа
  64. // 2. Неверная пара логин/пароль
  65. type LoginResp struct {
  66. Result string
  67. }
  68. // Login -- запросвхода на сервер
  69. func (sf *ServRpc) Login(req *LoginReq, resp *LoginResp) error {
  70. log.Println("ServRpc.Login()")
  71. store := sf.serv.Store()
  72. _, err := store.Get("/users/admin")
  73. if err != nil {
  74. return fmt.Errorf("ServRpc.Login(): not have admin")
  75. }
  76. binData, err := store.Get("/users/" + req.Login)
  77. if err != nil {
  78. return fmt.Errorf("ServRpc.Login(): bad account")
  79. }
  80. strPass := string(binData)
  81. if req.Pass != strPass {
  82. return fmt.Errorf("ServRpc.Login(): bad account")
  83. }
  84. resp.Result = "ok"
  85. return nil
  86. }
  87. // MakeAdminReq -- запрос насоздание админа
  88. type MakeAdminReq struct {
  89. Pass string
  90. }
  91. // MakeAdminResp -- ответ на создание админа
  92. type MakeAdminResp struct {
  93. Result string
  94. }
  95. // MakeAdmin -- создание админа на бот-сервере
  96. func (sf *ServRpc) MakeAdmin(req *MakeAdminReq, resp *MakeAdminResp) error {
  97. log.Println("ServRpc.MakeAdmin()")
  98. store := sf.serv.Store()
  99. _, err := store.Get("/users/admin")
  100. if err == nil {
  101. return fmt.Errorf("ServRpc.Login(): admin already exists")
  102. }
  103. err = store.Put("/users/admin", req.Pass)
  104. if err != nil {
  105. return fmt.Errorf("ServRpc.Login(): in put admin to store, err=\n\t%w", err)
  106. }
  107. resp.Result = "ok"
  108. return nil
  109. }