Skip to content

Commit b3c054e

Browse files
committed
新增查询队伍组队函数
历史战绩查询改为翻页查询
1 parent 0fb21f9 commit b3c054e

File tree

17 files changed

+8837
-13957
lines changed

17 files changed

+8837
-13957
lines changed

components.d.ts

Lines changed: 75 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -7,78 +7,79 @@ export {}
77

88
declare module 'vue' {
99
export interface GlobalComponents {
10-
ChampionImg: typeof import('./src/components/img/championImg.vue')['default']
11-
ChampionSelect: typeof import('./src/components/ChampionSelect.vue')['default']
12-
ConnectStatus: typeof import('./src/components/ConnectStatus.vue')['default']
13-
DBRuneCard: typeof import('./src/components/DBRuneCard.vue')['default']
14-
EpicLoading: typeof import('./src/components/EpicLoading.vue')['default']
15-
Footer: typeof import('./src/components/layout/Footer.vue')['default']
16-
GameAnalysis: typeof import('./src/components/gameFlow/gameAnalysis.vue')['default']
17-
GameDetailInfo: typeof import('./src/components/GameDetailInfo.vue')['default']
18-
GameInfo: typeof import('./src/components/GameInfo.vue')['default']
19-
GameInfoList: typeof import('./src/components/GameInfoList.vue')['default']
20-
GameModeSelect: typeof import('./src/components/GameModeSelect.vue')['default']
21-
HeaderBar: typeof import('./src/components/layout/HeaderBar.vue')['default']
22-
HistoryList: typeof import('./src/components/HistoryList.vue')['default']
23-
Index: typeof import('./src/components/Index.vue')['default']
24-
InGameFlow: typeof import('./src/components/gameFlow/inGameFlow.vue')['default']
25-
ItemImg: typeof import('./src/components/img/itemImg.vue')['default']
26-
LazyDeferred: typeof import('./src/components/LazyDeferred.vue')['default']
27-
LeagueOfLeagendsLoading: typeof import('./src/components/loading/LeagueOfLeagendsLoading.vue')['default']
28-
Logo: typeof import('./src/components/Logo.vue')['default']
29-
MatchmakingFlow: typeof import('./src/components/gameFlow/matchmakingFlow.vue')['default']
30-
Nav: typeof import('./src/components/layout/Nav.vue')['default']
31-
NAvatar: typeof import('naive-ui')['NAvatar']
32-
NButton: typeof import('naive-ui')['NButton']
33-
NCard: typeof import('naive-ui')['NCard']
34-
NCarousel: typeof import('naive-ui')['NCarousel']
35-
NCarouselItem: typeof import('naive-ui')['NCarouselItem']
36-
NCheckbox: typeof import('naive-ui')['NCheckbox']
37-
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
38-
NDialogProvider: typeof import('naive-ui')['NDialogProvider']
39-
NDivider: typeof import('naive-ui')['NDivider']
40-
NDrawer: typeof import('naive-ui')['NDrawer']
41-
NDrawerContent: typeof import('naive-ui')['NDrawerContent']
42-
NDropdown: typeof import('naive-ui')['NDropdown']
43-
NGi: typeof import('naive-ui')['NGi']
44-
NGlobalStyle: typeof import('naive-ui')['NGlobalStyle']
45-
NGrid: typeof import('naive-ui')['NGrid']
46-
NImage: typeof import('naive-ui')['NImage']
47-
NInput: typeof import('naive-ui')['NInput']
48-
NMessageProvider: typeof import('naive-ui')['NMessageProvider']
49-
NModal: typeof import('naive-ui')['NModal']
50-
NoneFlow: typeof import('./src/components/gameFlow/noneFlow.vue')['default']
51-
NPageHeader: typeof import('naive-ui')['NPageHeader']
52-
NPagination: typeof import('naive-ui')['NPagination']
53-
NPopconfirm: typeof import('naive-ui')['NPopconfirm']
54-
NRadio: typeof import('naive-ui')['NRadio']
55-
NRadioGroup: typeof import('naive-ui')['NRadioGroup']
56-
NScrollbar: typeof import('naive-ui')['NScrollbar']
57-
NSelect: typeof import('naive-ui')['NSelect']
58-
NSlider: typeof import('naive-ui')['NSlider']
59-
NSpace: typeof import('naive-ui')['NSpace']
60-
NSpin: typeof import('naive-ui')['NSpin']
61-
NSwitch: typeof import('naive-ui')['NSwitch']
62-
NTab: typeof import('naive-ui')['NTab']
63-
NTabPane: typeof import('naive-ui')['NTabPane']
64-
NTabs: typeof import('naive-ui')['NTabs']
65-
NTag: typeof import('naive-ui')['NTag']
66-
NTooltip: typeof import('naive-ui')['NTooltip']
67-
PerkImg: typeof import('./src/components/img/perkImg.vue')['default']
68-
Perks: typeof import('./src/components/img/Perks.vue')['default']
69-
PlayerGameInfo: typeof import('./src/components/PlayerGameInfo.vue')['default']
70-
PositionImg: typeof import('./src/components/img/positionImg.vue')['default']
71-
PositionSelect: typeof import('./src/components/PositionSelect.vue')['default']
72-
ProfileImg: typeof import('./src/components/img/profileImg.vue')['default']
73-
RoleSelect: typeof import('./src/components/RoleSelect.vue')['default']
74-
RouterLink: typeof import('vue-router')['RouterLink']
75-
RouterView: typeof import('vue-router')['RouterView']
76-
RuneCard: typeof import('./src/components/RuneCard.vue')['default']
77-
RuneCardImg: typeof import('./src/components/img/runeCardImg.vue')['default']
78-
RuneConfig: typeof import('./src/components/gameFlow/runeConfig.vue')['default']
79-
RuneEdit: typeof import('./src/components/RuneEdit.vue')['default']
80-
RuneImg: typeof import('./src/components/img/runeImg.vue')['default']
81-
SpellImg: typeof import('./src/components/img/spellImg.vue')['default']
82-
TeamAnalysis: typeof import('./src/components/gameFlow/teamAnalysis.vue')['default']
83-
}
10+
ChampionImg: (typeof import("./src/components/img/championImg.vue"))["default"];
11+
ChampionSelect: (typeof import("./src/components/ChampionSelect.vue"))["default"];
12+
ConnectStatus: (typeof import("./src/components/ConnectStatus.vue"))["default"];
13+
DBRuneCard: (typeof import("./src/components/DBRuneCard.vue"))["default"];
14+
EpicLoading: (typeof import("./src/components/EpicLoading.vue"))["default"];
15+
Footer: (typeof import("./src/components/layout/Footer.vue"))["default"];
16+
GameAnalysis: (typeof import("./src/components/gameFlow/gameAnalysis.vue"))["default"];
17+
GameDetailInfo: (typeof import("./src/components/GameDetailInfo.vue"))["default"];
18+
GameInfo: (typeof import("./src/components/GameInfo.vue"))["default"];
19+
GameInfoList: (typeof import("./src/components/GameInfoList.vue"))["default"];
20+
GameModeSelect: (typeof import("./src/components/GameModeSelect.vue"))["default"];
21+
HeaderBar: (typeof import("./src/components/layout/HeaderBar.vue"))["default"];
22+
HistoryList: (typeof import("./src/components/HistoryList.vue"))["default"];
23+
Index: (typeof import("./src/components/Index.vue"))["default"];
24+
InGameFlow: (typeof import("./src/components/gameFlow/inGameFlow.vue"))["default"];
25+
ItemImg: (typeof import("./src/components/img/itemImg.vue"))["default"];
26+
LazyDeferred: (typeof import("./src/components/LazyDeferred.vue"))["default"];
27+
LeagueOfLeagendsLoading: (typeof import("./src/components/loading/LeagueOfLeagendsLoading.vue"))["default"];
28+
Logo: (typeof import("./src/components/Logo.vue"))["default"];
29+
MatchmakingFlow: (typeof import("./src/components/gameFlow/matchmakingFlow.vue"))["default"];
30+
Nav: (typeof import("./src/components/layout/Nav.vue"))["default"];
31+
NAvatar: (typeof import("naive-ui"))["NAvatar"];
32+
NButton: (typeof import("naive-ui"))["NButton"];
33+
NButtonGroup: (typeof import("naive-ui"))["NButtonGroup"];
34+
NCard: (typeof import("naive-ui"))["NCard"];
35+
NCarousel: (typeof import("naive-ui"))["NCarousel"];
36+
NCarouselItem: (typeof import("naive-ui"))["NCarouselItem"];
37+
NCheckbox: (typeof import("naive-ui"))["NCheckbox"];
38+
NConfigProvider: (typeof import("naive-ui"))["NConfigProvider"];
39+
NDialogProvider: (typeof import("naive-ui"))["NDialogProvider"];
40+
NDivider: (typeof import("naive-ui"))["NDivider"];
41+
NDrawer: (typeof import("naive-ui"))["NDrawer"];
42+
NDrawerContent: (typeof import("naive-ui"))["NDrawerContent"];
43+
NDropdown: (typeof import("naive-ui"))["NDropdown"];
44+
NGi: (typeof import("naive-ui"))["NGi"];
45+
NGlobalStyle: (typeof import("naive-ui"))["NGlobalStyle"];
46+
NGrid: (typeof import("naive-u"naive-ui"d""NIcon"c;on: (typeof import("naive-ui"))["NIcon"];
47+
NImage: (typeof import("naive-ui"))["NImage"];
48+
NInput: (typeof import("naive-ui"))["NInput"];
49+
NMessageProvider: (typeof import("naive-ui"))["NMessageProvider"];
50+
NModal: (typeof import("naive-ui"))["NModal"];
51+
NoneFlow: (typeof import("./src/components/gameFlow/noneFlow.vue"))["default"];
52+
NPageHeader: (typeof import("naive-ui"))["NPageHeader"];
53+
NPagination: (typeof import("naive-ui"))["NPagination"];
54+
NPopconfirm: (typeof import("naive-ui"))["NPopconfirm"];
55+
NRadio: (typeof import("naive-ui"))["NRadio"];
56+
NRadioGroup: (typeof import("naive-ui"))["NRadioGroup"];
57+
NScrollbar: (typeof import("naive-ui"))["NScrollbar"];
58+
NSelect: (typeof import("naive-ui"))["NSelect"];
59+
NSlider: (typeof import("naive-ui"))["NSlider"];
60+
NSpace: (typeof import("naive-ui"))["NSpace"];
61+
NSpin: (typeof import("naive-ui"))["NSpin"];
62+
NSwitch: (typeof import("naive-ui"))["NSwitch"];
63+
NTab: (typeof import("naive-ui"))["NTab"];
64+
NTabPane: (typeof import("naive-ui"))["NTabPane"];
65+
NTabs: (typeof import("naive-ui"))["NTabs"];
66+
NTag: (typeof import("naive-ui"))["NTag"];
67+
NTooltip: (typeof import("naive-ui"))["NTooltip"];
68+
PerkImg: (typeof import("./src/components/img/perkImg.vue"))["default"];
69+
Perks: (typeof import("./src/components/img/Perks.vue"))["default"];
70+
PlayerGameInfo: (typeof import("./src/components/PlayerGameInfo.vue"))["default"];
71+
PositionImg: (typeof import("./src/components/img/positionImg.vue"))["default"];
72+
PositionSelect: (typeof import("./src/components/PositionSelect.vue"))["default"];
73+
ProfileImg: (typeof import("./src/components/img/profileImg.vue"))["default"];
74+
RoleSelect: (typeof import("./src/components/RoleSelect.vue"))["default"];
75+
RouterLink: (typeof import("vue-router"))["RouterLink"];
76+
RouterView: (typeof import("vue-router"))["RouterView"];
77+
RuneCard: (typeof import("./src/components/RuneCard.vue"))["default"];
78+
RuneCardImg: (typeof import("./src/components/img/runeCardImg.vue"))["default"];
79+
RuneConfig: (typeof import("./src/components/gameFlow/runeConfig.vue"))["default"];
80+
RuneEdit: (typeof import("./src/components/RuneEdit.vue"))["default"];
81+
RuneImg: (typeof import("./src/components/img/runeImg.vue"))["default"];
82+
SpellImg: (typeof import("./src/components/img/spellImg.vue"))["default"];
83+
TeamAnalysis: (typeof import("./src/components/gameFlow/teamAnalysis.vue"))["default"];
84+
}
8485
}

electron/lcu/lcuRequest.ts

Lines changed: 34 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,12 @@
1-
import {
2-
createHttp1Request,
3-
createHttp2Request,
4-
createHttpSession,
5-
EventCallback,
6-
HttpRequestOptions
7-
} from "../lib/league-connect";
1+
import { createHttp1Request, EventCallback, HttpRequestOptions } from "../lib/league-connect";
82
import { getCredentials, getLeagueWebSocket } from "./connector";
9-
import { ClientHttp2Session } from "http2";
103
import {
114
Action,
125
ChampSelectPhaseSession,
136
Conversation,
147
GameDetail,
158
GameSessionData,
169
MatchHistoryQueryResult,
17-
PageRange,
1810
RPC,
1911
SummonerInfo
2012
} from "../types/lcuType";
@@ -24,7 +16,8 @@ import { getChampData, getNoneRankRunes, getRankRunes } from "./opgg";
2416
import runesDB from "../db/runes";
2517
import { GameMode, PositionName } from "../types/opgg_rank_type";
2618
import { PerkRune } from "../types/rune";
27-
import { retryWrapper } from "../util/util";
19+
import { memoize } from "lodash";
20+
import { LRUCache } from "lru-cache";
2821

2922
const httpRequest = async <T>(option: HttpRequestOptions<any>) => {
3023
const response = await createHttp1Request(option, getCredentials());
@@ -161,45 +154,23 @@ export const sendChatMsgToRoom = async (conversationId: string, msg: string, typ
161154
});
162155
};
163156

164-
// 根据召唤师ID 游标查询战绩
165-
export const cursorQueryMatchHistory = async (
166-
session: ClientHttp2Session,
167-
puuid: string,
168-
begIndex: number,
169-
endIndex: number
170-
) => {
171-
const response = await createHttp2Request(
172-
{
173-
method: "GET",
174-
url: `/lol-match-history/v1/products/lol/${puuid}/matches?begIndex=${begIndex}&endIndex=${endIndex}`
175-
},
176-
session,
177-
getCredentials()
178-
);
179-
if (response.ok) {
180-
return response.json() as MatchHistoryQueryResult;
181-
} else {
182-
logger.error("QueryMatchHistory error", response.text(), puuid, begIndex, endIndex);
183-
throw new Error((response.json() as RPC).message);
184-
}
185-
};
186-
187-
// 根据召唤师ID查询战绩
188-
export const queryMatchHistory = async (puuid: string, page: PageRange = 1) => {
189-
let specialDict: MatchHistoryQueryResult[] = [];
190-
const session = await createHttpSession(getCredentials());
191-
try {
192-
for (let i = 0; i < page; i++) {
193-
const matchHistory = await retryWrapper(
194-
() => cursorQueryMatchHistory(session, puuid, 20 * i, 20 * (i + 1) - 1),
195-
5
196-
)();
197-
specialDict.push(matchHistory);
198-
}
199-
return specialDict;
200-
} finally {
201-
session.close();
202-
}
157+
/**
158+
*
159+
* @param puuid
160+
* @param page 页数,起始值1
161+
* @param pageSize 每页数量大小默认值8
162+
* 根据召唤师puuid分页查询战绩
163+
*/
164+
export const queryMatchHistory = async (puuid: string, page: number = 1, pageSize: number = 8) => {
165+
const begIndex = (page - 1) * pageSize;
166+
const endIndex = page * pageSize - 1;
167+
return await httpRequest<MatchHistoryQueryResult>({
168+
method: "GET",
169+
url: `/lol-match-history/v1/products/lol/${puuid}/matches?begIndex=${begIndex}&endIndex=${endIndex}`
170+
}).catch((e: any) => {
171+
logger.error("QueryMatchHistory error", e.message, puuid, begIndex, endIndex);
172+
throw e;
173+
});
203174
};
204175

205176
//获取一局游戏的详细数据
@@ -210,6 +181,10 @@ export const queryGameDetails = async (gameId: number) => {
210181
});
211182
};
212183

184+
//获取一局游戏的详细数据 带缓存
185+
const queryGameDetailsAndCache = memoize(queryGameDetails);
186+
queryGameDetailsAndCache.cache = new LRUCache({ max: 500 });
187+
213188
export const getCurrentQueue = async () => {
214189
const res = await httpRequest<GameSessionData>({
215190
method: "GET",
@@ -248,17 +223,16 @@ export const getOPGGRunes = async (champId: number, gameMode: GameMode, position
248223
};
249224

250225
//查询玩家最近20场游戏对局详情
251-
export const queryTeamMemberGameDetail = async (puuid: string) => {
252-
const gameHistory = (await queryMatchHistory(puuid)).flatMap((m) => m.games.games);
253-
const result = await Promise.allSettled(
254-
gameHistory.map(async (game) => {
255-
return await queryGameDetails(game.gameId);
256-
})
257-
);
258-
const isFulfilled = <T>(p: PromiseSettledResult<T>): p is PromiseFulfilledResult<T> => p.status === "fulfilled";
259-
return result.filter(isFulfilled<GameDetail>).map((p) => p.value);
260-
};
261-
226+
// export const queryTeamMemberGameDetail = async (puuid: string) => {
227+
// const gameHistory = (await queryMatchHistory(puuid)).flatMap((m) => m.games.games);
228+
// const result = await Promise.allSettled(
229+
// gameHistory.map(async (game) => {
230+
// return await queryGameDetails(game.gameId);
231+
// })
232+
// );
233+
// const isFulfilled = <T>(p: PromiseSettledResult<T>): p is PromiseFulfilledResult<T> => p.status === "fulfilled";
234+
// return result.filter(isFulfilled<GameDetail>).map((p) => p.value);
235+
// };
262236

263237
//再来一局(回到大厅)
264238
export const playAgain = async () => {

0 commit comments

Comments
 (0)