Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

CharacterManager.ts 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import { RPCInterface } from "rpclibrary";
  2. import { Inject, Injectable } from "../../Injector/ServiceDecorator";
  3. import { TableDefiniton, Character, Spec, User, Class, _Rank, Rank } from "../../Types/Types";
  4. import { CharacterManagerIfc } from "./RPCInterface";
  5. import { FrontworkComponent } from "../../Types/FrontworkComponent";
  6. import { getSpecTableData, SpecT } from "../../Types/PlayerSpecs";
  7. import { IAdmin } from "../../Admin/Interface";
  8. import { IUserManager } from "../User/Interface";
  9. import { ICharacterManager } from "./Interface";
  10. import { getLogger } from "log4js";
  11. @Injectable(ICharacterManager)
  12. export class CharacterManager
  13. implements FrontworkComponent<CharacterManagerIfc, RPCInterface>, ICharacterManager{
  14. name = "CharacterManager" as "CharacterManager";
  15. @Inject(IAdmin)
  16. private admin: IAdmin
  17. @Inject(IUserManager)
  18. private loginManager : IUserManager
  19. RPCs = () => [
  20. this.getSpecId,
  21. this.getCharacterByName,
  22. this.getCharacters,
  23. this.getCharactersOfUser,
  24. this.createCharacter,
  25. this.getUserOfCharacter,
  26. this.getHeadCount
  27. ]
  28. RPCFeatures = () => [{
  29. name: 'manageCharacter' as 'manageCharacter',
  30. RPCs: [
  31. this.updateCharacter
  32. ]
  33. }]
  34. getTableDefinitions = (): TableDefiniton[] => [
  35. {
  36. name: 'characters',
  37. tableBuilder: (table) => {
  38. table.increments("id").primary()
  39. table.string("charactername").notNullable().unique()
  40. table.integer("specid").notNullable()
  41. table.foreign("specid").references("specs.id")
  42. table.integer("userid").notNullable()
  43. table.foreign("userid").references("users.id")
  44. table.string("race").notNullable()
  45. table.boolean('alt').defaultTo(false)
  46. }
  47. },{
  48. name: 'specs',
  49. tableBuilder: (table) => {
  50. table.increments("id")
  51. table.string('class')
  52. table.string('specname')
  53. table.unique(['class', 'specname'])
  54. }
  55. }
  56. ]
  57. private initialized = false
  58. initialize = async () => {
  59. if(this.initialized) return
  60. this.initialized = true
  61. await this.admin.knex('specs').insert(getSpecTableData()).catch(e => {
  62. getLogger('CharacterManager#createCharacter').debug("skipping spec insertion")
  63. })
  64. }
  65. updateCharacter = async (character: Character) : Promise<Character> => {
  66. await this.admin
  67. .knex('characters')
  68. .update(<Character>{
  69. race: character.race,
  70. specid: character.specid,
  71. charactername: character.charactername.toLowerCase(),
  72. userid: character.userid
  73. })
  74. .where({
  75. id: character.id
  76. })
  77. return await this.getCharacterByName(character.charactername) as Character
  78. }
  79. createCharacter = async (userToken: string, character : Character) : Promise<Character> => {
  80. try{
  81. character.charactername = character.charactername.toLowerCase()
  82. const user = this.loginManager.getUserRecordByToken(userToken)
  83. await this.admin.knex('characters').insert(character)
  84. const char : Character = await this.admin.knex.select('*').from('characters').where(character).first()
  85. return char
  86. }catch(e){
  87. getLogger('CharacterManager#createCharacter').error(e);
  88. }
  89. throw new Error('Unable to create character')
  90. }
  91. getCharacters = async() : Promise<(Character & Spec & User)[]> => {
  92. return this.admin.knex
  93. .select('*')
  94. .from('characters as c')
  95. .join('specs as sp', 'c.specid', 'sp.id')
  96. .join('users as u', 'c.userid', 'u.id')
  97. }
  98. getCharacterByName = async(charactername: string) : Promise<(Character & User & Spec) | void> => {
  99. charactername = charactername.toLowerCase()
  100. return await this.admin.knex('characters as c')
  101. .join('specs as s', 's.id', '=', 'c.specid')
  102. .join('users as u', 'u.id', '=', 'c.userid')
  103. .select('c.id as id', 'charactername', 'race', 'specid', 'class', 'specname', 'username', 'rank')
  104. .where('charactername', '=', charactername)
  105. .first()
  106. }
  107. getCharactersOfUser = async(username: string) : Promise<(Character & Spec)[]> => {
  108. username = username.toLowerCase()
  109. return await this.admin.knex('characters as c')
  110. .join('users as u', 'u.id', '=', 'c.userid')
  111. .join('specs as s', 's.id', '=', 'c.specid')
  112. .select('class', 'charactername', 'class', 'race', 'specname', 'userid', 'c.id as id', 'specid')
  113. .where('u.username', '=', username)
  114. }
  115. getUserOfCharacter = async(character: Character) : Promise<User> => {
  116. return await this.admin.knex('users').where({
  117. id: character.userid
  118. }).first()
  119. }
  120. getSpecId = async <c extends keyof SpecT>(clazz: c, name: SpecT[c]) => await this.admin.knex
  121. .from('specs')
  122. .select('id')
  123. .where(<Spec>{
  124. class: clazz,
  125. specname: name
  126. })
  127. .first()
  128. .then(spec => spec.id)
  129. getHeadCount = async(c:Class):Promise<number> => {
  130. const cnt = await this.admin
  131. .knex('characters as c')
  132. .join('users as u', 'c.userid', '=', 'u.id')
  133. .join('specs as s', 'c.specid', '=', 's.id')
  134. .where({
  135. class: c
  136. }).andWhere(function(){
  137. this.whereNotIn('u.rank', <Rank[]>[
  138. 'Guest'
  139. ])
  140. this.whereNot('c.alt', '1')
  141. })
  142. .count('*')
  143. return cnt[0]['count(*)'] as number
  144. }
  145. }