A collection of worker programs for server tasks
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
To repozytorium jest zarchiwizowane. Możesz wyświetlać pliki i je sklonować, ale nie możesz do niego przepychać zmian lub otwierać zgłoszeń/Pull Requestów.

319 wiersze
6.4KB

  1. // NGnius 2020-02-12
  2. package main
  3. import (
  4. "crypto/rand"
  5. "crypto/sha512"
  6. "encoding/binary"
  7. "math/big"
  8. "strconv"
  9. // test
  10. //"fmt"
  11. )
  12. var (
  13. randomizeTokens bool
  14. )
  15. type Rower interface {
  16. Intake() []interface{}
  17. Output() []interface{}
  18. }
  19. type Board struct {
  20. ID int64
  21. Name string
  22. Description string
  23. }
  24. func LoadBoard(id int64) *Board {
  25. b := &Board{ID: id}
  26. loadErr := b.Load()
  27. if loadErr != nil {
  28. return nil
  29. }
  30. return b
  31. }
  32. func (b *Board) Load() error {
  33. return db.QueryRow(queryStrings[queryType][7], b.ID).Scan(b.Intake()...)
  34. }
  35. func (b *Board) Commit() error {
  36. tx, _ := db.Begin()
  37. statement, _ := tx.Prepare(queryStrings[queryType][8])
  38. _, err := statement.Exec(b.Output()...)
  39. if err != nil {
  40. tx.Rollback()
  41. return err
  42. }
  43. return tx.Commit()
  44. }
  45. func (b *Board) Entries() ([]*Entry, error) {
  46. var entries []*Entry
  47. rows, err := db.Query(queryStrings[queryType][9], b.ID)
  48. if err != nil {
  49. return entries, err
  50. }
  51. count := 0
  52. for rows.Next() {
  53. entries = append(entries, &Entry{})
  54. scanErr := rows.Scan(entries[count].Intake()...)
  55. if scanErr != nil {
  56. return entries, scanErr
  57. }
  58. count++
  59. }
  60. return entries, nil
  61. }
  62. func (b *Board) SomeEntries(start, end int64) ([]*Entry, error) {
  63. var entries []*Entry
  64. rows, err := db.Query(queryStrings[queryType][10], b.ID, start, end)
  65. if err != nil {
  66. return entries, err
  67. }
  68. count := 0
  69. for rows.Next() {
  70. entries = append(entries, &Entry{})
  71. scanErr := rows.Scan(entries[count].Intake()...)
  72. if scanErr != nil {
  73. return entries, scanErr
  74. }
  75. count++
  76. }
  77. return entries, nil
  78. }
  79. func (b *Board) Url() string {
  80. return "/board?name=" + b.Name
  81. }
  82. // implementation of Rower
  83. func (b *Board) Intake() []interface{} {
  84. return []interface{}{&b.ID, &b.Name, &b.Description}
  85. }
  86. func (b *Board) Output() []interface{} {
  87. return []interface{}{b.ID, b.Name, b.Description}
  88. }
  89. type Player struct {
  90. ID int64
  91. Name string
  92. }
  93. func LoadPlayer(id int64) *Player {
  94. p := &Player{ID: id}
  95. loadErr := p.Load()
  96. if loadErr != nil {
  97. return nil
  98. }
  99. return p
  100. }
  101. func (p *Player) Load() error {
  102. return db.QueryRow(queryStrings[queryType][11], p.ID).Scan(p.Intake()...)
  103. }
  104. func (p *Player) Commit() error {
  105. tx, _ := db.Begin()
  106. statement, _ := tx.Prepare(queryStrings[queryType][12])
  107. _, err := statement.Exec(p.Output()...)
  108. if err != nil {
  109. tx.Rollback()
  110. return err
  111. }
  112. return tx.Commit()
  113. }
  114. func (p *Player) Entries() ([]*Entry, error) {
  115. var entries []*Entry
  116. rows, err := db.Query(queryStrings[queryType][13], p.ID)
  117. if err != nil {
  118. return entries, err
  119. }
  120. count := 0
  121. for rows.Next() {
  122. entries = append(entries, &Entry{})
  123. scanErr := rows.Scan(entries[count].Intake()...)
  124. if scanErr != nil {
  125. return entries, scanErr
  126. }
  127. count++
  128. }
  129. return entries, nil
  130. }
  131. func (p *Player) SomeEntries(limit int64) ([]*Entry, error) {
  132. var entries []*Entry
  133. rows, err := db.Query(queryStrings[queryType][14], p.ID, limit)
  134. if err != nil {
  135. return entries, err
  136. }
  137. count := 0
  138. for rows.Next() {
  139. entries = append(entries, &Entry{})
  140. scanErr := rows.Scan(entries[count].Intake()...)
  141. if scanErr != nil {
  142. return entries, scanErr
  143. }
  144. count++
  145. }
  146. return entries, nil
  147. }
  148. func (p *Player) Url() string {
  149. return "/player?id=" + strconv.Itoa(int(p.ID))
  150. }
  151. // implementation of Rower
  152. func (p *Player) Intake() []interface{} {
  153. return []interface{}{&p.ID, &p.Name}
  154. }
  155. func (p *Player) Output() []interface{} {
  156. return []interface{}{p.ID, p.Name}
  157. }
  158. type Entry struct {
  159. ID int64
  160. Rank int64
  161. Score int64
  162. Player int64
  163. Board int64
  164. Time int64 // Created time (seconds since Unix epoch)
  165. Metadata []byte
  166. }
  167. func LoadEntry(id int64) *Entry {
  168. e := &Entry{ID: id}
  169. loadErr := e.Load()
  170. if loadErr != nil {
  171. return nil
  172. }
  173. return e
  174. }
  175. func (e *Entry) Load() error {
  176. return db.QueryRow(queryStrings[queryType][15], e.ID).Scan(e.Intake()...)
  177. }
  178. func (e *Entry) Commit() error {
  179. tx, _ := db.Begin()
  180. statement, _ := tx.Prepare(queryStrings[queryType][16])
  181. _, err := statement.Exec(e.Output()...)
  182. if err != nil {
  183. tx.Rollback()
  184. return err
  185. }
  186. return tx.Commit()
  187. }
  188. // implementation of Rower
  189. func (e *Entry) Intake() []interface{} {
  190. return []interface{}{&e.ID, &e.Rank, &e.Score, &e.Player, &e.Board, &e.Time, &e.Metadata}
  191. }
  192. func (e *Entry) Output() []interface{} {
  193. return []interface{}{e.ID, e.Rank, e.Score, e.Player, e.Board, e.Time, e.Metadata}
  194. }
  195. type Key struct {
  196. ID int64
  197. Token string
  198. Player int64
  199. Time int64 // Created time (seconds since Unix epoch)
  200. Metadata []byte
  201. }
  202. func LoadKey(id int64) *Key {
  203. k := &Key{ID: id}
  204. loadErr := k.Load()
  205. if loadErr != nil {
  206. return nil
  207. }
  208. return k
  209. }
  210. func (k *Key) Load() error {
  211. return db.QueryRow(queryStrings[queryType][17], k.ID).Scan(k.Intake()...)
  212. }
  213. func (k *Key) Commit() error {
  214. tx, _ := db.Begin()
  215. statement, _ := tx.Prepare(queryStrings[queryType][18])
  216. _, err := statement.Exec(k.Output()...)
  217. if err != nil {
  218. tx.Rollback()
  219. return err
  220. }
  221. return tx.Commit()
  222. }
  223. func (k *Key) IsEnabled() bool {
  224. return (k.Metadata[0] & 0b00000001) == 0
  225. }
  226. func (k *Key) Disable() {
  227. k.Metadata[0] = k.Metadata[0] | 0b00000001
  228. }
  229. func (k *Key) IsSuperuser() bool {
  230. return (k.Metadata[0] & 0b00000100) == 0
  231. }
  232. func (k *Key) Promote() {
  233. k.Metadata[0] = k.Metadata[0] | 0b00000100
  234. }
  235. func (k *Key) IsMultiuser() bool {
  236. return (k.Metadata[0] & 0b00010000) == 0
  237. }
  238. func (k *Key) Develop() {
  239. k.Metadata[0] = k.Metadata[0] | 0b00010000
  240. }
  241. func (k *Key) GenerateToken() error {
  242. buf_int64 := make([]byte, 10) // 8 bytes = 64 bits
  243. input := []byte{}
  244. if randomizeTokens {
  245. max := big.NewInt(2 ^ 16 - 1)
  246. for i := 0; i < 512; i++ {
  247. // generate randomness
  248. num, _ := rand.Int(rand.Reader, max)
  249. input = append(input, num.Bytes()...)
  250. }
  251. }
  252. binary.PutVarint(buf_int64, k.ID)
  253. input = append(input, buf_int64[0:8]...)
  254. binary.PutVarint(buf_int64, k.Player)
  255. input = append(input, buf_int64[0:8]...)
  256. binary.PutVarint(buf_int64, k.Time)
  257. input = append(input, buf_int64[0:8]...)
  258. bToken := sha512.Sum512(input)
  259. //k.Token = string(bToken)
  260. k.Token = ""
  261. for _, b := range bToken {
  262. tmp_b := b & 0b01111111 // Valid 7-bit ASCII values only
  263. for !((tmp_b > 47 && tmp_b < 58) || (tmp_b > 64 && tmp_b < 91) || (tmp_b > 96 && tmp_b < 123)) {
  264. tmp_b = sha512.Sum512([]byte{tmp_b})[1]
  265. tmp_b = tmp_b & 0b01111111
  266. }
  267. k.Token += string(tmp_b)
  268. }
  269. return nil
  270. }
  271. // Implementation of Rower
  272. func (k *Key) Intake() []interface{} {
  273. return []interface{}{&k.ID, &k.Token, &k.Player, &k.Time, &k.Metadata}
  274. }
  275. func (k *Key) Output() []interface{} {
  276. return []interface{}{k.ID, k.Token, k.Player, k.Time, k.Metadata}
  277. }