// package client_serv -- клиент подключения к бото-серверу package client_serv import ( "fmt" "log" "net/rpc" "wartank/server/serv_rpc" ) // ClientServ -- клиент подключения к бото-серверу type ClientServ struct { client *rpc.Client url string login string // Логин на бото-ферму pass string // Логин на бото-ферму } // NewClientServ -- возвращает новый клиент к бото-серверу func NewClientServ() *ClientServ { sf := &ClientServ{} return sf } // Connect -- подключает клиента к бото-серверу func (sf *ClientServ) Connect(url_ string) error { sf.url = url_ var err error sf.client, err = rpc.DialHTTP("tcp", url_) if err != nil { return fmt.Errorf("ClientSrv.Connect(): in connect to bot-server, err=\n\t%w", err) } req := &serv_rpc.EchoReq{} resp := &serv_rpc.EchoResp{} err = sf.client.Call("ServRpc.Echo", req, &resp) if err != nil { return fmt.Errorf("ClientServ.Connect(): in make Echo-request to bot-server, err=\n\t%w", err) } if resp.Result != "WarTank!" { return fmt.Errorf("ClientServ.Connect(): bad response on Echo request(%v!='WarTank!')", resp.Result) } return nil } // Login -- логинится на сервер func (sf *ClientServ) Login(login, pass string) error { log.Println("ClientServ.Login()") req := &serv_rpc.LoginReq{ Login: login, Pass: pass, } resp := &serv_rpc.LoginResp{} err := sf.client.Call("ServRpc.Login", req, resp) if err != nil { return fmt.Errorf("ClientServ.Login(): err=\n\t%w", err) } if resp.Result != "ok" { return fmt.Errorf("ClientServ.Login(): resp=%q", resp.Result) } sf.login = login sf.pass = pass return nil } // AddBot -- добавляет бота на сервер func (sf *ClientServ) AddBot(login, pass string) error { log.Println("ClientServ.AddBot()") req := &serv_rpc.AddBotReq{ Login: sf.login, Pass: sf.pass, BotLogin: login, BotPass: pass, } resp := &serv_rpc.AddBotResp{} err := sf.client.Call("ServRpc.AddBot", req, resp) if err != nil { return fmt.Errorf("ClientServ.AddBot(): err=\n\t%w", err) } if resp.Result != "ok" { return fmt.Errorf("ClientServ.AddBot(): resp=%q", resp.Result) } return nil }