serv_rpc.go 2.7 KB

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