web_api.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. // package web_api -- веб-сервер для API
  2. package web_api
  3. import (
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "time"
  8. "github.com/gofiber/fiber/v2"
  9. "wartank/pkg/alias"
  10. "wartank/pkg/types"
  11. )
  12. // ВебАпи -- веб-сервер для API
  13. type ВебАпи struct {
  14. серв types.ИСервер
  15. файбер fiber.App
  16. }
  17. // НовВебАпи -- возвращает новый веб-сервер для API
  18. func НовВебАпи(вебСервер types.ИВебСервер) (*ВебАпи, error) {
  19. if вебСервер == nil {
  20. return nil, fmt.Errorf("НовВебАпи(): ИВебСервер==nil")
  21. }
  22. сам := &ВебАпи{
  23. серв: вебСервер.Сервер(),
  24. файбер: *вебСервер.Файбер(),
  25. }
  26. сам.файбер.Post("/api/login", сам.логин)
  27. сам.файбер.Post("/api/add_bot", сам.добавитьБота)
  28. сам.файбер.Get("/api/uptime", сам.аптаймСервер)
  29. сам.файбер.Get("/api/count_start", сам.стартНомер)
  30. сам.файбер.Get("/api/bot/:number/mine/level", сам.шахтаУровень)
  31. сам.файбер.Get("/api/bot/:number/mine/mode", сам.шахтаРежим)
  32. сам.файбер.Get("/api/bot/:number/mine/count_product", сам.шахтаРаботаКоличество)
  33. сам.файбер.Get("/api/bot/:number/mine/name_product", сам.шахтаРаботаИмя)
  34. сам.файбер.Get("/api/bot/:number/mine/back_time", сам.шахтаВремяОсталось)
  35. сам.файбер.Get("/api/bot/:number/tank/fuel", сам.танкТопливо)
  36. сам.файбер.Get("/api/bot/:number/angar/silver", сам.ангарСеребро)
  37. сам.файбер.Get("/api/bot/:number/polygon/level", сам.полигонУровень)
  38. сам.файбер.Get("/api/bot/:number/polygon/mode", сам.полигонРежим)
  39. сам.файбер.Get("/api/bot/:number/polygon/count_product", сам.полигонРаботаКоличество)
  40. сам.файбер.Get("/api/bot/:number/polygon/name_product", сам.полигонРаботаИмя)
  41. сам.файбер.Get("/api/bot/:number/polygon/back_time", сам.полигонВремяОсталось)
  42. сам.файбер.Get("/api/bot/:number/arsenal/level", сам.арсеналУровень)
  43. сам.файбер.Get("/api/bot/:number/arsenal/mode", сам.арсеналРежим)
  44. сам.файбер.Get("/api/bot/:number/arsenal/count_product", сам.полигонРаботаКоличество)
  45. сам.файбер.Get("/api/bot/:number/arsenal/name_product", сам.арсеналРаботаИмя)
  46. сам.файбер.Get("/api/bot/:number/arsenal/back_time", сам.ареналВремяОсталось)
  47. return сам, nil
  48. }
  49. // Возвращает имя производства снаряда на оружейке
  50. func (сам *ВебАпи) арсеналРаботаИмя(кнт *fiber.Ctx) error {
  51. номер, ош := кнт.ParamsInt("number")
  52. if ош != nil {
  53. сообщ := fmt.Sprintf("[Тип: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  54. return кнт.SendString(сообщ)
  55. }
  56. ботНомер := alias.БотНомер(номер)
  57. бот := сам.серв.ServBots().Get(ботНомер)
  58. if бот == nil {
  59. return кнт.SendString("[Тип: нет такого бота]")
  60. }
  61. имя := бот.Ангар().База().Арсенал().ПродуктИмяСейчас()
  62. if имя == "" {
  63. return кнт.SendString("[Тип: пустое имя]")
  64. }
  65. return кнт.SendString("[Тип: " + имя + "]")
  66. }
  67. // Возвращает режим оружейки
  68. func (сам *ВебАпи) арсеналРежим(кнт *fiber.Ctx) error {
  69. номер, ош := кнт.ParamsInt("number")
  70. if ош != nil {
  71. сообщ := fmt.Sprintf("[Режим: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  72. return кнт.SendString(сообщ)
  73. }
  74. ботНомер := alias.БотНомер(номер)
  75. бот := сам.серв.ServBots().Get(ботНомер)
  76. if бот == nil {
  77. return кнт.SendString("[Режим: нет такого бота]")
  78. }
  79. сценаРежим := бот.Ангар().База().Арсенал().СценаРежим()
  80. стрРежим := fmt.Sprint(сценаРежим.Режим())
  81. if стрРежим == "" {
  82. return кнт.SendString("[Режим: пустой режим]")
  83. }
  84. return кнт.SendString("[Режим: " + стрРежим + "]")
  85. }
  86. // Возвращает уровень арсенала
  87. func (сам *ВебАпи) арсеналУровень(кнт *fiber.Ctx) error {
  88. номер, ош := кнт.ParamsInt("number")
  89. if ош != nil {
  90. сообщ := fmt.Sprintf("[Уровень: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  91. return кнт.SendString(сообщ)
  92. }
  93. ботНомер := alias.БотНомер(номер)
  94. бот := сам.серв.ServBots().Get(ботНомер)
  95. if бот == nil {
  96. return кнт.SendString("[Уровень: нет такого бота]")
  97. }
  98. уровень := бот.Ангар().База().Арсенал().Уровень()
  99. стрУровень := fmt.Sprint(уровень.Получ())
  100. if стрУровень == "" {
  101. return кнт.SendString("[Уровень: пустой уровень]")
  102. }
  103. return кнт.SendString("[Уровень: " + стрУровень + "]")
  104. }
  105. // Возвращает время, которое осталось на арсенале
  106. func (сам *ВебАпи) ареналВремяОсталось(кнт *fiber.Ctx) error {
  107. номер, ош := кнт.ParamsInt("number")
  108. if ош != nil {
  109. сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  110. return кнт.SendString(сообщ)
  111. }
  112. ботНомер := alias.БотНомер(номер)
  113. бот := сам.серв.ServBots().Get(ботНомер)
  114. if бот == nil {
  115. return кнт.SendString("[Время: нет такого бота]")
  116. }
  117. время := бот.Ангар().База().Арсенал().ВремяОстат()
  118. стрВремя := время.String()
  119. if стрВремя == "" {
  120. return кнт.SendString("[Время: пустой остаток времени]")
  121. }
  122. return кнт.SendString("[Время: " + стрВремя + "]")
  123. }
  124. // Возвращает время, которое осталось на полигоне
  125. func (сам *ВебАпи) полигонВремяОсталось(кнт *fiber.Ctx) error {
  126. номер, ош := кнт.ParamsInt("number")
  127. if ош != nil {
  128. сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  129. return кнт.SendString(сообщ)
  130. }
  131. ботНомер := alias.БотНомер(номер)
  132. бот := сам.серв.ServBots().Get(ботНомер)
  133. if бот == nil {
  134. return кнт.SendString("[Время: нет такого бота]")
  135. }
  136. время := бот.Ангар().База().Полигон().ВремяОстат()
  137. стрВремя := время.String()
  138. if стрВремя == "" {
  139. return кнт.SendString("[Время: пустой остаток времени]")
  140. }
  141. return кнт.SendString("[Время: " + стрВремя + "]")
  142. }
  143. // Возвращает имя добычи ресурса на полигоне
  144. func (сам *ВебАпи) полигонРаботаИмя(кнт *fiber.Ctx) error {
  145. номер, ош := кнт.ParamsInt("number")
  146. if ош != nil {
  147. сообщ := fmt.Sprintf("[Тип: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  148. return кнт.SendString(сообщ)
  149. }
  150. ботНомер := alias.БотНомер(номер)
  151. бот := сам.серв.ServBots().Get(ботНомер)
  152. if бот == nil {
  153. return кнт.SendString("[Тип: нет такого бота]")
  154. }
  155. имя := бот.Ангар().База().Полигон().ПродуктИмяСейчас()
  156. if имя == "" {
  157. return кнт.SendString("[Тип: пустое имя]")
  158. }
  159. return кнт.SendString("[Тип: " + имя + "]")
  160. }
  161. // Возвращает количесто добычи на полигоне
  162. func (сам *ВебАпи) полигонРаботаКоличество(кнт *fiber.Ctx) error {
  163. номер, ош := кнт.ParamsInt("number")
  164. if ош != nil {
  165. сообщ := fmt.Sprintf("[Кол: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  166. return кнт.SendString(сообщ)
  167. }
  168. ботНомер := alias.БотНомер(номер)
  169. бот := сам.серв.ServBots().Get(ботНомер)
  170. if бот == nil {
  171. return кнт.SendString("[Кол: нет такого бота]")
  172. }
  173. колич := бот.Ангар().База().Полигон().ПродуктКолСейчас()
  174. стрКолич := fmt.Sprint(колич)
  175. if стрКолич == "" {
  176. return кнт.SendString("[Кол: пустое кол]")
  177. }
  178. return кнт.SendString("[Кол: +" + стрКолич + "]")
  179. }
  180. // Возвращает режим полигона
  181. func (сам *ВебАпи) полигонРежим(кнт *fiber.Ctx) error {
  182. номер, ош := кнт.ParamsInt("number")
  183. if ош != nil {
  184. сообщ := fmt.Sprintf("[Режим: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  185. return кнт.SendString(сообщ)
  186. }
  187. ботНомер := alias.БотНомер(номер)
  188. бот := сам.серв.ServBots().Get(ботНомер)
  189. if бот == nil {
  190. return кнт.SendString("[Режим: нет такого бота]")
  191. }
  192. сценаРежим := бот.Ангар().База().Полигон().СценаРежим()
  193. стрРежим := fmt.Sprint(сценаРежим.Режим())
  194. if стрРежим == "" {
  195. return кнт.SendString("[Режим: пустой режим]")
  196. }
  197. return кнт.SendString("[Режим: " + стрРежим + "]")
  198. }
  199. // Возвращает уровень полигона
  200. func (сам *ВебАпи) полигонУровень(кнт *fiber.Ctx) error {
  201. номер, ош := кнт.ParamsInt("number")
  202. if ош != nil {
  203. сообщ := fmt.Sprintf("[Уровень: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  204. return кнт.SendString(сообщ)
  205. }
  206. ботНомер := alias.БотНомер(номер)
  207. бот := сам.серв.ServBots().Get(ботНомер)
  208. if бот == nil {
  209. return кнт.SendString("[Уровень: нет такого бота]")
  210. }
  211. уровень := бот.Ангар().База().Полигон().Уровень()
  212. стрУровень := fmt.Sprint(уровень.Получ())
  213. if стрУровень == "" {
  214. return кнт.SendString("[Уровень: пустой уровень]")
  215. }
  216. return кнт.SendString("[Уровень: " + стрУровень + "]")
  217. }
  218. // Возвращает количество серебра в ангаре
  219. func (сам *ВебАпи) ангарСеребро(кнт *fiber.Ctx) error {
  220. номер, ош := кнт.ParamsInt("number")
  221. if ош != nil {
  222. сообщ := fmt.Sprintf("[Серебро: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  223. return кнт.SendString(сообщ)
  224. }
  225. ботНомер := alias.БотНомер(номер)
  226. бот := сам.серв.ServBots().Get(ботНомер)
  227. if бот == nil {
  228. return кнт.SendString("[Серебро: нет такого бота]")
  229. }
  230. серебро := бот.Ангар().СереброВсего().Получ()
  231. if серебро == 0 {
  232. return кнт.SendString("[Серебро: пустое кол]")
  233. }
  234. стрСеребро := fmt.Sprint(серебро)
  235. return кнт.SendString("[Серебро: " + стрСеребро + "]")
  236. }
  237. // Возвращает количество топлива в танке
  238. func (сам *ВебАпи) танкТопливо(кнт *fiber.Ctx) error {
  239. номер, ош := кнт.ParamsInt("number")
  240. if ош != nil {
  241. сообщ := fmt.Sprintf("[Топливо: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  242. return кнт.SendString(сообщ)
  243. }
  244. ботНомер := alias.БотНомер(номер)
  245. бот := сам.серв.ServBots().Get(ботНомер)
  246. if бот == nil {
  247. return кнт.SendString("[Топливо: нет такого бота]")
  248. }
  249. топливо := бот.Ангар().Топливо().Получ()
  250. if топливо == 0 {
  251. return кнт.SendString("[Топливо: пустое кол]")
  252. }
  253. стрТопливо := fmt.Sprint(топливо)
  254. return кнт.SendString("[Топливо: " + стрТопливо + "]")
  255. }
  256. // Возвращает имя добычи ресурса в шахте
  257. func (сам *ВебАпи) шахтаРаботаИмя(кнт *fiber.Ctx) error {
  258. номер, ош := кнт.ParamsInt("number")
  259. if ош != nil {
  260. сообщ := fmt.Sprintf("[Тип: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  261. return кнт.SendString(сообщ)
  262. }
  263. ботНомер := alias.БотНомер(номер)
  264. бот := сам.серв.ServBots().Get(ботНомер)
  265. if бот == nil {
  266. return кнт.SendString("[Тип: нет такого бота]")
  267. }
  268. имя := бот.Ангар().База().Шахта().ПродуктИмяСейчас()
  269. if имя == "" {
  270. return кнт.SendString("[Тип: пустое имя]")
  271. }
  272. return кнт.SendString("[Тип: " + имя + "]")
  273. }
  274. // Возвращает количесто добычи в шахте
  275. func (сам *ВебАпи) шахтаРаботаКоличество(кнт *fiber.Ctx) error {
  276. номер, ош := кнт.ParamsInt("number")
  277. if ош != nil {
  278. сообщ := fmt.Sprintf("[Кол: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  279. return кнт.SendString(сообщ)
  280. }
  281. ботНомер := alias.БотНомер(номер)
  282. бот := сам.серв.ServBots().Get(ботНомер)
  283. if бот == nil {
  284. return кнт.SendString("[Кол: нет такого бота]")
  285. }
  286. колич := бот.Ангар().База().Шахта().ПродуктКолСейчас()
  287. стрКолич := fmt.Sprint(колич)
  288. if стрКолич == "" {
  289. return кнт.SendString("[Кол: пустое кол]")
  290. }
  291. return кнт.SendString("[Кол: " + стрКолич + "]")
  292. }
  293. // Возвращает режим шахты
  294. func (сам *ВебАпи) шахтаРежим(кнт *fiber.Ctx) error {
  295. номер, ош := кнт.ParamsInt("number")
  296. if ош != nil {
  297. сообщ := fmt.Sprintf("[Режим: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  298. return кнт.SendString(сообщ)
  299. }
  300. ботНомер := alias.БотНомер(номер)
  301. бот := сам.серв.ServBots().Get(ботНомер)
  302. if бот == nil {
  303. return кнт.SendString("[Режим: нет такого бота]")
  304. }
  305. сценаРежим := бот.Ангар().База().Шахта().СценаРежим()
  306. стрРежим := fmt.Sprint(сценаРежим.Режим())
  307. if стрРежим == "" {
  308. return кнт.SendString("[Режим: пустой режим]")
  309. }
  310. return кнт.SendString("[Режим: " + стрРежим + "]")
  311. }
  312. // Возвращает уровень шахты
  313. func (сам *ВебАпи) шахтаУровень(кнт *fiber.Ctx) error {
  314. номер, ош := кнт.ParamsInt("number")
  315. if ош != nil {
  316. сообщ := fmt.Sprintf("[Уровень: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  317. return кнт.SendString(сообщ)
  318. }
  319. ботНомер := alias.БотНомер(номер)
  320. бот := сам.серв.ServBots().Get(ботНомер)
  321. if бот == nil {
  322. return кнт.SendString("[Уровень: нет такого бота]")
  323. }
  324. уровень := бот.Ангар().База().Шахта().Уровень()
  325. стрУровень := fmt.Sprint(уровень.Получ())
  326. if стрУровень == "" {
  327. return кнт.SendString("[Уровень: пустой уровень]")
  328. }
  329. return кнт.SendString("[Уровень: " + стрУровень + "]")
  330. }
  331. // Возвращает время, которое осталось на шахте
  332. func (сам *ВебАпи) шахтаВремяОсталось(кнт *fiber.Ctx) error {
  333. номер, ош := кнт.ParamsInt("number")
  334. if ош != nil {
  335. сообщ := fmt.Sprintf("[Время: неправильный номер бота(%q), err=%v]", номер, ош.Error())
  336. return кнт.SendString(сообщ)
  337. }
  338. ботНомер := alias.БотНомер(номер)
  339. бот := сам.серв.ServBots().Get(ботНомер)
  340. if бот == nil {
  341. return кнт.SendString("[Время: нет такого бота]")
  342. }
  343. время := бот.Ангар().База().Шахта().ВремяОстат()
  344. стрВремя := время.String()
  345. if стрВремя == "" {
  346. return кнт.SendString("[Время: пустой остаток времени]")
  347. }
  348. return кнт.SendString("[Время: " + стрВремя + "]")
  349. }
  350. // Возвращает счётчик запусков сервера
  351. func (сам *ВебАпи) стартНомер(кнт *fiber.Ctx) error {
  352. return кнт.SendString("[Старт: " + fmt.Sprint(сам.серв.Стат().СчётСтарт()) + "]")
  353. }
  354. // Возвращает аптайм сервера
  355. func (сам *ВебАпи) аптаймСервер(кнт *fiber.Ctx) error {
  356. return кнт.SendString("[Аптайм: " + сам.серв.Стат().ВремяВсего() + "]")
  357. }
  358. type AddBotRequest struct {
  359. Логин_ string `json:"login" form:"login_bot"`
  360. Пароль string `json:"password" form:"password_bot"`
  361. }
  362. // Запрос добавления нового бота на ботоферму
  363. func (сам *ВебАпи) добавитьБота(кнт *fiber.Ctx) error {
  364. запрос := &AddBotRequest{}
  365. if err := кнт.BodyParser(запрос); err != nil {
  366. return кнт.Render("add_bot", fiber.Map{
  367. "err": "ошибка в разборе формы",
  368. })
  369. }
  370. log.Printf("ВебАпи.добавитьБота(): : %#+v\n", запрос)
  371. if запрос.Логин_ == "" {
  372. return кнт.Render("add_bot", fiber.Map{
  373. "err": "пустой логин бота",
  374. })
  375. }
  376. if запрос.Пароль == "" {
  377. return кнт.Render("add_bot", fiber.Map{
  378. "err": "пустой пароль бота",
  379. })
  380. }
  381. if ош := сам.серв.ServBots().НовБот(запрос.Логин_, запрос.Пароль, true); ош != nil {
  382. return кнт.Render("add_bot", fiber.Map{
  383. "err": ош.Error(),
  384. })
  385. }
  386. return кнт.Redirect("/gui/list_bot")
  387. }
  388. type LoginRequest struct {
  389. Логин_ string `json:"login" form:"login"`
  390. Пароль_ string `json:"password" form:"password"`
  391. КонтрольноеСлово_ string `json:"control_word" form:"control_word"`
  392. }
  393. // Вызывается при попытке войти
  394. func (сам *ВебАпи) логин(кнт *fiber.Ctx) error {
  395. запрос := new(LoginRequest)
  396. if err := кнт.BodyParser(запрос); err != nil {
  397. return кнт.JSON(fiber.Map{
  398. "status": "ошибка в разборе формы",
  399. })
  400. }
  401. log.Printf("ВебАпи.логин(): : %#+v\n", *запрос)
  402. if запрос.Логин_ == "" || запрос.Пароль_ == "" {
  403. return кнт.Render("login", fiber.Map{
  404. "err": "пустой логин/пароль",
  405. })
  406. }
  407. if запрос.Логин_ != "svi" || запрос.Пароль_ != "Lera_07091978" {
  408. return кнт.Render("login", fiber.Map{
  409. "err": "ошибка логина/пароля",
  410. })
  411. }
  412. кнт.Cookie(&fiber.Cookie{
  413. Name: "login",
  414. Value: "svi",
  415. Expires: time.Now().Add(24 * time.Hour),
  416. HTTPOnly: true,
  417. })
  418. return кнт.Redirect("/gui/list_bot", http.StatusSeeOther)
  419. }