web_api.go 22 KB

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