Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/koni/dev/issue-157' into koni/de…
Browse files Browse the repository at this point in the history
…v/mythical-dev
  • Loading branch information
saltict committed Oct 25, 2024
2 parents 3c81058 + 9999aab commit 835ee77
Show file tree
Hide file tree
Showing 2 changed files with 187 additions and 2 deletions.
71 changes: 69 additions & 2 deletions packages/extension-koni-ui/src/connector/booka/sdk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { GameState } from '@playnation/game-sdk/dist/types';
import { SWStorage } from '@subwallet/extension-base/storage';
import { createPromiseHandler, detectTranslate } from '@subwallet/extension-base/utils';
import { AppMetadata, MetadataHandler } from '@subwallet/extension-koni-ui/connector/booka/metadata';
import { AccountRankType, AirdropCampaign, AirdropEligibility, AirdropRaffle, AirdropRewardHistoryLog, BookaAccount, EnergyConfig, Game, GameInventoryItem, GameItem, GamePlay, LeaderboardPerson, RankInfo, ReferralRecord, Task, TaskCategory } from '@subwallet/extension-koni-ui/connector/booka/types';
import { AccountRankType, Achievement, AirdropCampaign, AirdropEligibility, AirdropRaffle, AirdropRewardHistoryLog, BookaAccount, EnergyConfig, Game, GameEvent, GameInventoryItem, GameItem, GamePlay, LeaderboardPerson, RankInfo, ReferralRecord, Task, TaskCategory } from '@subwallet/extension-koni-ui/connector/booka/types';
import { TelegramConnector } from '@subwallet/extension-koni-ui/connector/telegram';
import { signRaw } from '@subwallet/extension-koni-ui/messaging';
import { populateTemplateString } from '@subwallet/extension-koni-ui/utils';
Expand All @@ -30,7 +30,9 @@ const CACHE_KEYS = {
energyConfig: 'data--energy-config-cache',
rankInfoMap: 'data--rank-info-map-cache',
leaderboardConfigSubject: 'data--leaderboard-config-list-cache',
airdropCampaignList: 'data--airdrop-campaign-list-cache'
airdropCampaignList: 'data--airdrop-campaign-list-cache',
achievementList: 'data--achievement-list-cache',
gameEventList: 'data--game-event-cache'
};

function parseCache<T> (key: string): T | undefined {
Expand All @@ -53,8 +55,10 @@ export class BookaSdk {
private syncHandler = createPromiseHandler<void>();
private accountSubject = new BehaviorSubject<BookaAccount | undefined>(undefined);
private taskListSubject = new BehaviorSubject<Task[]>([]);
private achievementListSubject = new BehaviorSubject<Achievement[]>([]);
private taskCategoryListSubject = new BehaviorSubject<TaskCategory[]>([]);
private gameListSubject = new BehaviorSubject<Game[]>([]);
private gameEventSubject = new BehaviorSubject<GameEvent[]>([]);
private currentGamePlaySubject = new BehaviorSubject<GamePlay | undefined>(undefined);
private leaderBoardSubject = new BehaviorSubject<LeaderboardPerson[]>([]);
private referralListSubject = new BehaviorSubject<ReferralRecord[]>([]);
Expand Down Expand Up @@ -85,6 +89,8 @@ export class BookaSdk {
const airdropCampaignList = parseCache<AirdropCampaign[]>(CACHE_KEYS.airdropCampaignList);
const rankInfoMap = parseCache<Record<AccountRankType, RankInfo>>(CACHE_KEYS.rankInfoMap);
const leaderboardConfigSubject = parseCache<Record<string, object>>(CACHE_KEYS.leaderboardConfigSubject);
const achievementList = parseCache<Achievement[]>(CACHE_KEYS.achievementList);
const gameEventList = parseCache<GameEvent[]>(CACHE_KEYS.gameEventList);

account && this.accountSubject.next(account);
taskCategoryList && this.taskCategoryListSubject.next(taskCategoryList);
Expand All @@ -94,6 +100,8 @@ export class BookaSdk {
rankInfoMap && this.rankInfoSubject.next(rankInfoMap);
airdropCampaignList && this.airdropCampaignSubject.next(airdropCampaignList);
leaderboardConfigSubject && this.leaderboardConfigSubject.next(leaderboardConfigSubject);
achievementList && this.achievementListSubject.next(achievementList);
gameEventList && this.gameEventSubject.next(gameEventList);
} else {
console.debug('Clearing cache');
storage.removeItems(Object.keys(CACHE_KEYS).concat(['cache-version'])).catch(console.error);
Expand Down Expand Up @@ -125,10 +133,18 @@ export class BookaSdk {
return this.taskCategoryListSubject.value;
}

public get achievementList () {
return this.taskCategoryListSubject.value;
}

public get gameList () {
return this.gameListSubject.value;
}

public get gameEventList () {
return this.gameListSubject.value;
}

public get gameItemMap () {
return this.gameItemMapSubject.value;
}
Expand Down Expand Up @@ -319,6 +335,57 @@ export class BookaSdk {
return this.taskCategoryListSubject;
}

/**
* Fetch game event list
* return GameEvent[] the list of game event
*/
async fetchGameEventList () {
await this.waitForSync;
const gameEventList = await this.getRequest<GameEvent[]>(`${GAME_API_HOST}/api/game-event/fetch`);

if (gameEventList) {
this.gameEventSubject.next(gameEventList);
localStorage.setItem(CACHE_KEYS.gameEventList, JSON.stringify(gameEventList));
}
}

subscribeGameEventList () {
return this.taskCategoryListSubject;
}

subscribeAchievementList () {
return this.achievementListSubject;
}

/**
* Fetch achievement list
* return Achievement[] the list of achievementList
*/
async fetchAchievementList () {
await this.waitForSync;
const achievementList = await this.getRequest<Achievement[]>(`${GAME_API_HOST}/api/achievement/fetch-v2`);

if (achievementList) {
this.achievementListSubject.next(achievementList);
localStorage.setItem(CACHE_KEYS.achievementList, JSON.stringify(achievementList));
}
}

/**
* Claim achievement
* Return {success: boolean} or throw error
* @param milestoneId
*/
async claimAchievement (milestoneId: number) {
const data = await this.postRequest(`${GAME_API_HOST}/api/achievement/claim`, { milestoneId });

await this.fetchAchievementList();

await this.reloadAccount();

return data as {success: boolean};
}

async fetchTaskList () {
await this.waitForSync;
const taskList = await this.getRequest<Task[]>(`${GAME_API_HOST}/api/task/history`);
Expand Down
118 changes: 118 additions & 0 deletions packages/extension-koni-ui/src/connector/booka/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,9 +137,94 @@ export interface Task {
achievement?: AchievementData | null;
}

export enum TaskCategoryType {
DAILY = 'daily',
WEEKLY = 'weekly',
FEATURED = 'featured',
}
export enum RepeatableType {
NON_REPEATABLE = 'non_repeatable',
DAILY = 'daily',
WEEKLY = 'weekly',
}

/**
* LogViewType
* - single: Show only 1 log, only show the log that can be completed most recently. For example: achievement has 2 tasks to complete 3 games and 5 games, then only show 3 games, and when 3 games are completed, show 5 games
* - multiple: show all logs
*/
export enum LogViewType {
SINGLE = 'single',
MULTIPLE = 'multiple',
}

/**
* task completion progress, consisting of an array of lists with the following data:
* - required: Number of tasks to be completed
* - completed: number of tasks completed
* - metricId: id of the corresponding metric
*/
export interface ProgressData {
required: number;
completed: number;
metricId: string;
}

export enum ComparisonOperator {
GT = 'gt',
GTE = 'gte',
LT = 'lt',
LTE = 'lte',
EQ = 'eq',
RANK_GT = 'rank_gt',
RANK_GTE = 'rank_gte',
RANK_LT = 'rank_lt',
RANK_LTE = 'rank_lte',
RANK_EQ = 'rank_eq'
}

/**
* AchievementLogStatus
* - pending: Initialization status, this log is not completed yet
* - claimable: log has completed the task, can claim to receive nps
* - claimed: Log has completed, account has received nps
*/
export enum AchievementLogStatus {
PENDING = 'pending',
CLAIMABLE = 'claimable',
CLAIMED = 'claimed',
}

export interface Condition {
metric: string;
comparison: ComparisonOperator;
value: number;
}

export interface Achievement {
categoryName: string;
categoryType: TaskCategoryType;
categoryId: number;
repeatable: RepeatableType;
logViewType: LogViewType;
conditions: Condition[];
progress: ProgressData[];
name: string;
id: number;
milestoneId: number;
milestoneName: string,
slug: string;
icon: string,
nps: number,
status: AchievementLogStatus,
createdAt: Date,
completedAt: Date,
}

export interface TaskCategory {
id: number; // id on db
contentId: number;
type: TaskCategoryType;
slug: string;
name?: string | null;
description?: string | null;
Expand Down Expand Up @@ -362,3 +447,36 @@ export interface AirdropRaffle {
export interface AirdropClaim {
airdropRecordLogId: number,
}

export interface GameEvent {
id: number;
documentId: string;
active: boolean;
name: string;
gameId: number;
icon: string;
description?: any;
startTime: string;
endTime: string;
tossUpInfo: TossUpInfo;
tossUpBonus: TossUpBonus[];
createdAt: string;
updatedAt: string;
}

interface TossUpBonus {
team?: string;
bonus: number;
bonusText: string;
program?: string;
position?: string;
}

interface TossUpInfo {
round: number;
stats: string[];
difficulty: number;
playDuration: number;
opponentTeams: string[];
gameplayPerEvent: number;
}

0 comments on commit 835ee77

Please sign in to comment.