const {query} = require("../client") class Character { /** * @param {string} id * @param {string[]} nicks * @param {string} author * @param {string} name * @param {string} shortName * @param {string} description */ constructor(id, nicks, author, name, shortName, description) { this.id = id this.nicks = nicks this.nick = this.nicks[0] || null this.author = author this.name = name this.shortName = shortName this.description = description } /** * Create a character object from data. */ static fromData(data) { return new Character(data.id, data.nicks, data.author, data.name, data.shortName, data.description) } } class CharacterHeader { /** * @param {string} id * @param {string} author * @param {string} name */ constructor(id, author, name) { this.id = id this.author = author this.name = name } /** * Create a character object from data. */ static fromData(data) { return new CharacterHeader(data.id, data.author, data.name) } } class ChracterAPI { /** * Call `characters(filter)` query * * @param {{ids:string[], nicks:string[], names:string[], author:string, search:string, logged:boolean}} filter * @returns {Promise} */ list(filter = {}) { return query(` query ListCharacters($filter: CharactersFilter) { characters(filter: $filter) { id nicks author name shortName description } } `, {filter}).then(({characters}) => { return characters.map(d => Character.fromData(d)) }) } /** * Call `characters(filter)` query * * @param {{ids:string[], nicks:string[], names:string[], author:string, search:string, logged:boolean}} filter * @returns {Promise} */ listHeaders(filter = {}) { return query(` query ListCharacters($filter: CharactersFilter) { characters(filter: $filter) { id name author } } `, {filter}).then(({characters}) => { return characters.map(d => CharacterHeader.fromData(d)) }) } /** * Call `addCharacter(input)` mutation, returns addable fields. * * @param {{id:string, name:string, shortName:string, author:string, description:string}} input * @returns {Promise} */ add(input) { return query(` mutation AddCharacter($input: CharacterAddInput!) { addCharacter(input: $input) { id nicks author name shortName description } } `, {input}, {permissions: ["member", "character.add"]}).then(({addCharacter}) => { return Character.fromData(addCharacter) }) } /** * Call `editCharacter(input)` mutation, returns editable fields. * * @param {{id:string, name:string, shortName:string, description:string}} input * @returns {Promise<{id:string, name:string, shortName:string, description:string}>} */ edit(input) { return query(` mutation EditCharacters($input: CharacterEditInput!) { editCharacter(input: $input) { id name shortName description } } `, {input}, {permissions: ["member", "character.edit"]}).then(({editCharacter}) => { return editCharacter }) } /** * Call `addCharacterNick(input)` mutation, returns new nick list. * * @param {{id:string, nick:string}} input * @returns {Promise<{id:string, nicks:string[]}>} */ addNick(input) { return query(` mutation AddCharacterNick($input: CharacterNickInput!) { addCharacterNick(input: $input) { id nicks } } `, {input}, {permissions: ["member", "character.edit"]}).then(({addCharacterNick}) => { return addCharacterNick }) } /** * Call `removeCharacterNick(input)` mutation, returns new nick list. * * @param {{id:string, nick:string}} input * @returns {Promise<{id:string, nicks:string[]}>} */ removeNick(input) { return query(` mutation RemoveCharacterNick($input: CharacterNickInput!) { removeCharacterNick(input: $input) { id nicks } } `, {input}, {permissions: ["member", "character.edit"]}).then(({removeCharacterNick}) => { return removeCharacterNick }) } /** * Call `removeCharacter(input)` mutation * * @param {{id:string}} input * @returns {Promise<{id:string}>} */ remove(input) { return query(` mutation RemoveCharacters($input: CharacterRemoveInput!) { removeCharacter(input: $input) { id } } `, {input}, {permissions: ["member", "character.remove"]}).then(({removeCharacter}) => { return removeCharacter }) } unknownNicks(limit = 100) { return query(` query UnknownNicks($limit: Int!) { unknownNicks(filter: {limit: $limit}) { nick score } } `, {limit}).then(({unknownNicks}) => { return unknownNicks }) } } module.exports = { Character, charactersApi: new ChracterAPI }