// package serv_rpc -- сервер RPC-запросов package serv_rpc import ( "fmt" "log" "net" "net/http" "net/rpc" "os" "wartank/pkg/types" ) type ServRpc struct { serv types.IServer } // NewServRpc -- возвращает новый сервер RPC-запросов func NewServRpc(serv types.IServer) (*ServRpc, error) { if serv == nil { return nil, fmt.Errorf("NewServRpc(): IServer==nil") } sf := &ServRpc{ serv: serv, } return sf, nil } // Run -- запускает сервис в работу func (sf *ServRpc) Run() { rpc.Register(sf) rpc.HandleHTTP() url := os.Getenv("SERVER_RPC_URL") if url == "" { log.Printf("ServRpc.Run(): env SERVER_RPC_URL not set\n") return } log.Printf("SERVER_RPC_URL=%v\n", url) lister, err := net.Listen("tcp", url) if err != nil { log.Printf("NewServRc(): listen error, err=\n\t%v\n", err) sf.serv.CancelApp() return } go http.Serve(lister, nil) } // EchoReq -- эхо запрос на сервер type EchoReq struct{} // EchoResp -- эхо ответ на запрос type EchoResp struct { Result string } // Echo -- эхо запрос для клиента func (sf *ServRpc) Echo(req *EchoReq, resp *EchoResp) error { log.Println("ServRpc.Echo()") resp.Result = "WarTank!" return nil } // LoginReq -- запрос на логин на сервер type LoginReq struct { Login string Pass string } // LoginResp -- ответ на запрос логина // // Вернёт ошибку если: // 1. Нужно создать админа // 2. Неверная пара логин/пароль type LoginResp struct { Result string } // Login -- запросвхода на сервер func (sf *ServRpc) Login(req *LoginReq, resp *LoginResp) error { log.Println("ServRpc.Login()") store := sf.serv.Store() _, err := store.Get("/users/admin") if err != nil { return fmt.Errorf("ServRpc.Login(): not have admin") } binData, err := store.Get("/users/" + req.Login) if err != nil { return fmt.Errorf("ServRpc.Login(): bad account") } strPass := string(binData) if req.Pass != strPass { return fmt.Errorf("ServRpc.Login(): bad account") } resp.Result = "ok" return nil } // MakeAdminReq -- запрос насоздание админа type MakeAdminReq struct { Pass string } // MakeAdminResp -- ответ на создание админа type MakeAdminResp struct { Result string } // MakeAdmin -- создание админа на бот-сервере func (sf *ServRpc) MakeAdmin(req *MakeAdminReq, resp *MakeAdminResp) error { log.Println("ServRpc.MakeAdmin()") store := sf.serv.Store() _, err := store.Get("/users/admin") if err == nil { return fmt.Errorf("ServRpc.Login(): admin already exists") } err = store.Put("/users/admin", req.Pass) if err != nil { return fmt.Errorf("ServRpc.Login(): in put admin to store, err=\n\t%w", err) } resp.Result = "ok" return nil }