Commit d02ca5d9 authored by nanahira's avatar nanahira

some apis

parent 47584fc8
Pipeline #1491 passed with stages
in 7 minutes and 48 seconds
......@@ -2014,6 +2014,19 @@
"babel-preset-current-node-syntax": "^1.0.0"
}
},
"bad-words-chinese": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bad-words-chinese/-/bad-words-chinese-1.0.2.tgz",
"integrity": "sha1-VuVFL2SeZbK3kc0bSTjoL1scqrU=",
"requires": {
"badwords-list": "^1.0.0"
}
},
"badwords-list": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/badwords-list/-/badwords-list-1.0.0.tgz",
"integrity": "sha1-XphW2/E0gqKVw7CzBK+51M/FxXk="
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
......
......@@ -118,3 +118,18 @@ export const CardInfo = {
'1074': 'Pendulum',
},
};
export function getStringValueByMysticalNumber(
lang: string,
offset: number,
num: number,
) {
for (let i = 0; i < 32; i++) {
if (num & (1 << i)) {
const index = offset + i;
const key = index.toString();
return CardInfo[lang][key];
}
}
return '';
}
import { Controller, Get, Query } from '@nestjs/common';
import {Controller, Get, Query, Res} from '@nestjs/common';
import express from 'express';
import { AppService } from './app.service';
import { UserInfo } from './entities/mycard/UserInfo';
......@@ -10,4 +11,19 @@ export class AppController {
async getUsers(@Query('o') orderByWhat: string) {
return await this.appService.getUsersRaw(orderByWhat === 'pt');
}
@Get('cardinfo')
async getCardInfo(@Query('lang') language: string, @Query('id')id: string, @Res() res: express.Response) {
const cardId = parseInt(id);
if(!cardId) {
res.status(404).end("card id is required!");
return;
}
const result = await this.appService.getCardInfo(cardId, language);
if(!result) {
res.status(404).end("card info not found!");
return;
}
res.json(result);
}
}
......@@ -13,9 +13,6 @@ import { Count } from './entities/mycard/Count';
import { DeckInfo } from './entities/mycard/DeckInfo';
import { BhAccount } from './entities/mycard/BhAccount';
import { RatingIndex } from './entities/mycard/RatingIndex';
import { Userinfo201812backup } from './entities/mycard/Userinfo201812backup';
import { Userinfo201902backup } from './entities/mycard/Userinfo201902backup';
import { Userinfo15backup } from './entities/mycard/Userinfo15backup';
import { Counter } from './entities/mycard/Counter';
import { UserBanHistory } from './entities/mycard/UserBanHistory';
import { DeckDemo } from './entities/mycard/DeckDemo';
......@@ -35,7 +32,6 @@ import { Deck } from './entities/mycard/Deck';
import { PlayerCards } from './entities/mycard/PlayerCards';
import { SiteConfig } from './entities/mycard/SiteConfig';
import { SingleHalfmonth } from './entities/mycard/SingleHalfmonth';
import { Userinfo201901backup } from './entities/mycard/Userinfo201901backup';
import { VoteResult } from './entities/mycard/VoteResult';
import { BattleHistory } from './entities/mycard/BattleHistory';
import { MessageHistory } from './entities/mycard/MessageHistory';
......@@ -44,7 +40,6 @@ import { SingleWeek } from './entities/mycard/SingleWeek';
import { Single } from './entities/mycard/Single';
import { TagMonth } from './entities/mycard/TagMonth';
import { DeckDay } from './entities/mycard/DeckDay';
import { RatingIndexBackup } from './entities/mycard/RatingIndexBackup';
import { TagSeason } from './entities/mycard/TagSeason';
import { Tag } from './entities/mycard/Tag';
import { DeckSeason } from './entities/mycard/DeckSeason';
......@@ -72,7 +67,6 @@ const mycardEntities = [
MessageHistory,
PlayerCards,
PlayerStatus,
RatingIndexBackup,
RatingIndex,
SafeAk,
SingleDay,
......@@ -91,10 +85,6 @@ const mycardEntities = [
UnknownDecks,
UserBanHistory,
UserHistoricalRecord,
Userinfo15backup,
Userinfo201812backup,
Userinfo201901backup,
Userinfo201902backup,
UserInfo,
VoteResult,
Votes,
......
......@@ -3,8 +3,17 @@ import { InjectConnection, InjectEntityManager } from '@nestjs/typeorm';
import { Connection, EntityManager } from 'typeorm';
import bunyan, { createLogger } from 'bunyan';
import { UserInfo } from './entities/mycard/UserInfo';
import * as Filter from 'bad-words-chinese';
import { ChineseDirtyWords } from './dirtyWordsChinese';
import { YGOProDatabaseDatas } from './entities/ygodb/YGOProDatabaseDatas';
import { YGOProDatabaseTexts } from './entities/ygodb/YGOProDatabaseTexts';
import { getStringValueByMysticalNumber } from './CardInfo';
const constants = {
const attrOffset = 1010;
const raceOffset = 1020;
const typeOffset = 1050;
const ygoproConstants = {
TYPES: {
TYPE_MONSTER: 1,
TYPE_SPELL: 2,
......@@ -47,6 +56,7 @@ const constants = {
@Injectable()
export class AppService {
log: bunyan;
chineseDirtyFilter: Filter;
constructor(
@InjectConnection('ygoproChinese')
private cndb: Connection,
......@@ -56,6 +66,9 @@ export class AppService {
private mcdb: Connection,
) {
this.log = createLogger({ name: 'ygopro-arena-revive' });
this.chineseDirtyFilter = new Filter({
chineseList: ChineseDirtyWords,
});
}
private async transaction(
......@@ -89,4 +102,88 @@ export class AppService {
.limit(100)
.getRawMany();
}
async getCardInfo(id: number, lang: string) {
lang ||= 'cn';
const db = (lang === 'cn' ? this.cndb : this.endb).manager;
try {
const cardDatas = await db.findOne(YGOProDatabaseDatas, id);
const cardTexts = await db.findOne(YGOProDatabaseTexts, id);
const result: any = {};
result.id = id;
result.name = cardTexts.name;
result.desc = cardTexts.desc;
result.str1 = cardTexts.str1;
result.str2 = cardTexts.str2;
result.str3 = cardTexts.str3;
result.ot = cardDatas.ot;
result.alias = cardDatas.alias;
result.setcode = cardDatas.setcode;
result.atk = cardDatas.atk;
result.def = cardDatas.def;
if (cardDatas.level <= 12) {
result.level = cardDatas.level;
} else {
//转化为16位,0x01010004,前2位是左刻度,2-4是右刻度,末2位是等级
const levelHex = cardDatas.level;
const cardLevel = levelHex & 0xff;
const cardLScale = (levelHex >> 6) & 0xff;
const cardRScale = (levelHex >> 4) & 0xff;
result.level = cardLevel;
result.cardLScale = cardLScale;
result.cardRScale = cardRScale;
}
if (!(cardDatas.type & ygoproConstants.TYPES.TYPE_LINK)) {
result.name += ' ';
result.name += ' ';
} else {
// result.name+="[LINK-" + cardLevel + "]";
// result.name += " " + (result.atk < 0 ? "?" : result.atk) + "/- ";
if (result.def & ygoproConstants.LINK_MARKERS.LINK_MARKER_TOP_LEFT)
result.name += '[↖]';
if (result.def & ygoproConstants.LINK_MARKERS.LINK_MARKER_TOP)
result.name += '[↑]';
if (result.def & ygoproConstants.LINK_MARKERS.LINK_MARKER_TOP_RIGHT)
result.name += '[↗]';
if (result.def & ygoproConstants.LINK_MARKERS.LINK_MARKER_LEFT)
result.name += '[←]';
if (result.def & ygoproConstants.LINK_MARKERS.LINK_MARKER_RIGHT)
result.name += '[→]';
if (result.def & ygoproConstants.LINK_MARKERS.LINK_MARKER_BOTTOM_LEFT)
result.name += '[↙]';
if (result.def & ygoproConstants.LINK_MARKERS.LINK_MARKER_BOTTOM)
result.name += '[↓]';
if (result.def & ygoproConstants.LINK_MARKERS.LINK_MARKER_BOTTOM_RIGHT)
result.name += '[↘]';
result.def = '-';
}
result.category = cardDatas.category;
result.type = getStringValueByMysticalNumber(
lang,
typeOffset,
cardDatas.type,
);
result.race = getStringValueByMysticalNumber(
lang,
raceOffset,
cardDatas.race,
);
result.attribute = getStringValueByMysticalNumber(
lang,
attrOffset,
cardDatas.attribute,
);
return result;
} catch (e) {
this.log.warn(`Failed fetching card with id ${id}: ${e.toString()}`);
return null;
}
}
}
This diff is collapsed.
import { Column, Entity, Index } from 'typeorm';
import { Column, Entity, Index, PrimaryColumn } from 'typeorm';
@Index('battle_history_end_time_index', ['endTime'], {})
@Index('battle_history_usernamea_index', ['usernamea'], {})
@Index('battle_history_usernameb_index', ['usernameb'], {})
@Entity('battle_history', { schema: 'public' })
export class BattleHistory {
@Column('character varying', { name: 'usernamea', length: 100 })
@PrimaryColumn('character varying', { name: 'usernamea', length: 100 })
usernamea: string;
@Column('character varying', { name: 'usernameb', length: 100 })
@PrimaryColumn('character varying', { name: 'usernameb', length: 100 })
usernameb: string;
@Column('integer', { name: 'userscorea', default: 0 })
......@@ -87,7 +87,9 @@ export class BattleHistory {
@Column('timestamp without time zone', { name: 'start_time', nullable: true })
startTime: Date;
@Column('timestamp without time zone', { name: 'end_time', nullable: true })
@PrimaryColumn('timestamp without time zone', {
name: 'end_time',
})
endTime: Date;
@Column('text', { name: 'winner', nullable: true })
......
import { Column, Entity } from 'typeorm';
import { Column, Entity, PrimaryColumn } from 'typeorm';
@Entity('message_history', { schema: 'public' })
export class MessageHistory {
@Column('timestamp without time zone', { name: 'time', nullable: true })
@Column('timestamp without time zone', {
name: 'time',
nullable: true,
})
time: Date;
@Column('character varying', { name: 'sender', nullable: true })
@PrimaryColumn('character varying', { name: 'sender' })
sender: string;
@Column('character varying', { name: 'content', nullable: true })
@PrimaryColumn('character varying', { name: 'content' })
content: string;
@Column('integer', { name: 'level', nullable: true })
......
import {Column, Entity, PrimaryColumn} from 'typeorm';
import { Column, Entity, PrimaryColumn } from 'typeorm';
@Entity('rating_index', { schema: 'public' })
export class RatingIndex {
......
import { Column, Entity } from 'typeorm';
@Entity('rating_index_backup', { schema: 'public' })
export class RatingIndexBackup {
@Column('character varying', { name: 'username', nullable: true, length: 50 })
username: string;
@Column('integer', { name: 'exp', nullable: true })
exp: number;
@Column('character varying', { name: 'o', nullable: true, length: 6 })
o: string;
@Column('character varying', { name: 'u', nullable: true, length: 6 })
u: string;
@Column('double precision', { name: 'pt', nullable: true, precision: 53 })
pt: number;
@Column('character varying', { name: 'game', nullable: true, length: 6 })
game: string;
@Column('character varying', { name: 'win', nullable: true, length: 6 })
win: string;
@Column('character varying', { name: 'lose', nullable: true, length: 6 })
lose: string;
@Column('character varying', { name: 'last', nullable: true, length: 6 })
last: string;
@Column('character varying', { name: 'status', nullable: true, length: 6 })
status: string;
}
import { Column, Entity } from 'typeorm';
import { Column, Entity, PrimaryColumn } from 'typeorm';
@Entity('user_ban_history', { schema: 'public' })
export class UserBanHistory {
......@@ -14,7 +14,7 @@ export class UserBanHistory {
@Column('timestamp without time zone', { name: 'from', nullable: true })
from: Date;
@Column('integer', { name: 'id', nullable: true })
@PrimaryColumn('integer', { name: 'id' })
id: number;
@Column('character varying', { name: 'reason', nullable: true })
......
import { Column, Entity, Index } from 'typeorm';
import { Column, Entity, Index, PrimaryColumn } from 'typeorm';
@Index('user_historical_record_pk', ['season', 'username'], { unique: true })
@Entity('user_historical_record', { schema: 'public' })
export class UserHistoricalRecord {
@Column('character varying', { primary: true, name: 'username' })
@PrimaryColumn('character varying', { primary: true, name: 'username' })
username: string;
@Column('character varying', { primary: true, name: 'season' })
......
import { Column, Entity } from 'typeorm';
@Entity('userinfo15backup', { schema: 'public' })
export class Userinfo15backup {
@Column('character varying', {
name: 'username',
nullable: true,
length: 100,
})
username: string;
@Column('double precision', { name: 'exp', nullable: true, precision: 53 })
exp: number;
@Column('double precision', { name: 'pt', nullable: true, precision: 53 })
pt: number;
@Column('integer', { name: 'entertain_win', nullable: true })
entertainWin: number;
@Column('integer', { name: 'entertain_lose', nullable: true })
entertainLose: number;
@Column('integer', { name: 'entertain_draw', nullable: true })
entertainDraw: number;
@Column('integer', { name: 'entertain_all', nullable: true })
entertainAll: number;
@Column('integer', { name: 'athletic_win', nullable: true })
athleticWin: number;
@Column('integer', { name: 'athletic_lose', nullable: true })
athleticLose: number;
@Column('integer', { name: 'athletic_draw', nullable: true })
athleticDraw: number;
@Column('integer', { name: 'athletic_all', nullable: true })
athleticAll: number;
@Column('integer', { name: 'id', nullable: true })
id: number;
}
import { Column, Entity } from 'typeorm';
@Entity('userinfo201812backup', { schema: 'public' })
export class Userinfo201812backup {
@Column('character varying', {
name: 'username',
nullable: true,
length: 100,
})
username: string;
@Column('double precision', { name: 'exp', nullable: true, precision: 53 })
exp: number;
@Column('double precision', { name: 'pt', nullable: true, precision: 53 })
pt: number;
@Column('integer', { name: 'entertain_win', nullable: true })
entertainWin: number;
@Column('integer', { name: 'entertain_lose', nullable: true })
entertainLose: number;
@Column('integer', { name: 'entertain_draw', nullable: true })
entertainDraw: number;
@Column('integer', { name: 'entertain_all', nullable: true })
entertainAll: number;
@Column('integer', { name: 'athletic_win', nullable: true })
athleticWin: number;
@Column('integer', { name: 'athletic_lose', nullable: true })
athleticLose: number;
@Column('integer', { name: 'athletic_draw', nullable: true })
athleticDraw: number;
@Column('integer', { name: 'athletic_all', nullable: true })
athleticAll: number;
@Column('integer', { name: 'id', nullable: true })
id: number;
}
import { Column, Entity } from 'typeorm';
@Entity('userinfo201901backup', { schema: 'public' })
export class Userinfo201901backup {
@Column('character varying', {
name: 'username',
nullable: true,
length: 100,
})
username: string;
@Column('double precision', { name: 'exp', nullable: true, precision: 53 })
exp: number;
@Column('double precision', { name: 'pt', nullable: true, precision: 53 })
pt: number;
@Column('integer', { name: 'entertain_win', nullable: true })
entertainWin: number;
@Column('integer', { name: 'entertain_lose', nullable: true })
entertainLose: number;
@Column('integer', { name: 'entertain_draw', nullable: true })
entertainDraw: number;
@Column('integer', { name: 'entertain_all', nullable: true })
entertainAll: number;
@Column('integer', { name: 'athletic_win', nullable: true })
athleticWin: number;
@Column('integer', { name: 'athletic_lose', nullable: true })
athleticLose: number;
@Column('integer', { name: 'athletic_draw', nullable: true })
athleticDraw: number;
@Column('integer', { name: 'athletic_all', nullable: true })
athleticAll: number;
@Column('integer', { name: 'id', nullable: true })
id: number;
}
import { Column, Entity } from 'typeorm';
@Entity('userinfo201902backup', { schema: 'public' })
export class Userinfo201902backup {
@Column('character varying', {
name: 'username',
nullable: true,
length: 100,
})
username: string;
@Column('double precision', { name: 'exp', nullable: true, precision: 53 })
exp: number;
@Column('double precision', { name: 'pt', nullable: true, precision: 53 })
pt: number;
@Column('integer', { name: 'entertain_win', nullable: true })
entertainWin: number;
@Column('integer', { name: 'entertain_lose', nullable: true })
entertainLose: number;
@Column('integer', { name: 'entertain_draw', nullable: true })
entertainDraw: number;
@Column('integer', { name: 'entertain_all', nullable: true })
entertainAll: number;
@Column('integer', { name: 'athletic_win', nullable: true })
athleticWin: number;
@Column('integer', { name: 'athletic_lose', nullable: true })
athleticLose: number;
@Column('integer', { name: 'athletic_draw', nullable: true })
athleticDraw: number;
@Column('integer', { name: 'athletic_all', nullable: true })
athleticAll: number;
@Column('integer', { name: 'id', nullable: true })
id: number;
}
......@@ -2,7 +2,7 @@ import { Column, Entity } from 'typeorm';
@Entity('datas')
export class YGOProDatabaseDatas {
@Column('integer', { primary: true, name: 'id', nullable: true })
@Column('integer', { primary: true, name: 'id' })
id: number | null;
@Column('integer', { name: 'ot', nullable: true })
......
......@@ -2,8 +2,8 @@ import { Column, Entity } from 'typeorm';
@Entity('texts')
export class YGOProDatabaseTexts {
@Column('integer', { primary: true, name: 'id', nullable: true })
id: number | null;
@Column('integer', { primary: true, name: 'id' })
id: number;
@Column('text', { name: 'name', nullable: true })
name: string | null;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment