From b6b549d9e15f20ebafb21c279aeca6cd3f57cc02 Mon Sep 17 00:00:00 2001 From: Adam Koewler Date: Sat, 23 Mar 2024 23:01:08 -0500 Subject: [PATCH 1/8] removed workflows --- .github/workflows/{build.yml => build.yml.bak} | 0 .../workflows/{codeql-analysis.yml => codeql-analysis.yml.bak} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{build.yml => build.yml.bak} (100%) rename .github/workflows/{codeql-analysis.yml => codeql-analysis.yml.bak} (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml.bak similarity index 100% rename from .github/workflows/build.yml rename to .github/workflows/build.yml.bak diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml.bak similarity index 100% rename from .github/workflows/codeql-analysis.yml rename to .github/workflows/codeql-analysis.yml.bak From 3e9a507670b08b341e94725a892bd1abc418d958 Mon Sep 17 00:00:00 2001 From: Adam Koewler Date: Sat, 23 Mar 2024 23:01:23 -0500 Subject: [PATCH 2/8] fixed auto accept behavior --- src/electron/modules/auto-accept-queue.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/electron/modules/auto-accept-queue.ts b/src/electron/modules/auto-accept-queue.ts index afc7abc..c16146d 100644 --- a/src/electron/modules/auto-accept-queue.ts +++ b/src/electron/modules/auto-accept-queue.ts @@ -6,24 +6,28 @@ import { Endpoints, PlayerResponse } from '../enums'; import { ReadyCheck } from '../models'; import { ReadyCheckSubscription } from '../subscriptions'; +const SETTINGS_KEY = 'isAutoAcceptQueueEnabled'; + export class AutoAcceptQueueModule extends WebSocketModule { id = 'AutoAcceptQueue'; - checked = this.storage.get('checked', true); + enabled = this.storage.get(SETTINGS_KEY, false); async register(): Promise { connection.addSubscription( new ReadyCheckSubscription((event) => { - this.refresh(event); + if (this.storage.get(SETTINGS_KEY)) { + this.refresh(event); + } }) ); const menuItem = new MenuItem({ label: 'Auto-Accept Queue', type: 'checkbox', - checked: this.checked, + checked: this.enabled, click: (menuItem) => { - this.checked = menuItem.checked = !this.checked; - this.storage.set('checked', this.checked); + this.enabled = menuItem.checked = !this.enabled; + this.storage.set(SETTINGS_KEY, this.enabled); } }); @@ -34,10 +38,7 @@ export class AutoAcceptQueueModule extends WebSocketModule { const readyCheck = new ReadyCheck(event.data); if (readyCheck.playerResponse === PlayerResponse.NONE) { - const response = await connection.post(Endpoints.READY_CHECK_ACCEPT); - console.log(response.status); - const json = await response.json(); - console.log(json); + await connection.post(Endpoints.READY_CHECK_ACCEPT); } } } From e13865d03ee2424081d51250216888eb8cdb060a Mon Sep 17 00:00:00 2001 From: Adam Koewler Date: Sat, 23 Mar 2024 23:01:32 -0500 Subject: [PATCH 3/8] fix module order --- src/electron/modules/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/electron/modules/index.ts b/src/electron/modules/index.ts index fad8a6e..4496d33 100644 --- a/src/electron/modules/index.ts +++ b/src/electron/modules/index.ts @@ -21,8 +21,8 @@ const modules: Module[] = [ new DisenchantLootModule(), new FriendsListModule(), new SpoofProfileModule(), - new AutoAcceptQueueModule(), - new OpenBuildInBrowserModule() + new OpenBuildInBrowserModule(), + new AutoAcceptQueueModule() ]; export { modules }; From a88b1be00daa965cc1aaae54409ff345bc9e01e1 Mon Sep 17 00:00:00 2001 From: Adam Koewler Date: Sat, 23 Mar 2024 23:03:22 -0500 Subject: [PATCH 4/8] updated recently played format --- src/electron/modules/recently-played.ts | 37 +++++++++++++++++++------ 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/electron/modules/recently-played.ts b/src/electron/modules/recently-played.ts index 012a2a6..eae027b 100644 --- a/src/electron/modules/recently-played.ts +++ b/src/electron/modules/recently-played.ts @@ -8,7 +8,7 @@ import { GameflowPhaseSubscription } from '../subscriptions'; export class RecentlyPlayedModule extends WebSocketModule { id = 'RecentlyPlayed'; - recentSummonerLimit = 20; + recentSummonerLimit = 18; async register(): Promise { // TODO: Add subscription for call when client initially loads friends (ie. signing into different account) @@ -58,22 +58,43 @@ export class RecentlyPlayedModule extends WebSocketModule { // reverse order of games to show most recent game first Object.keys(summonersByGame).reverse().forEach((gameId, index, reversedGameIds) => { + const summoners: RecentlyPlayedSummoner[] = summonersByGame[gameId]; + submenu.append(new MenuItem({ + label: `Game #${gameId}`, + sublabel: `${summoners[0].gameCreationDate.fromNow()}`, + enabled: false + })); + let previousTeamId = -1; // append each unique player in game - summonersByGame[gameId].forEach((summoner: RecentlyPlayedSummoner) => { + const sortedSummoners = summoners.sort((summonerA: RecentlyPlayedSummoner, summonerB: RecentlyPlayedSummoner) => summonerA.teamId - summonerB.teamId); + sortedSummoners.forEach((summoner: RecentlyPlayedSummoner) => { const championNameMatch = champions.filter((champion: CSChampion) => { return champion.id == summoner.championId; }); + if (previousTeamId !== summoner.teamId) { + previousTeamId = summoner.teamId; + const currentSummonerTeamId = summoner.teamId; + const currentSummonerTeammates = sortedSummoners.filter((summoner: RecentlyPlayedSummoner) => summoner.teamId === currentSummonerTeamId); + const teamLabel = currentSummonerTeammates.length === 5 ? 'Enemy' : 'Ally'; + const sideName = summoner.teamId === 100 ? 'Blue' : 'Red'; + submenu.append(new MenuItem({ + label: `${teamLabel} Team`, + sublabel: `${sideName} Side`, + click: async() => { + for (const teammate of currentSummonerTeammates) { + await connection.inviteSummoners(teammate.summonerId); + } + } + })); + } const championName = championNameMatch ? championNameMatch[0].name : 'N/A'; submenu.append(new MenuItem({ - label: `${summoner.summonerName} (${championName})`, - sublabel: `Played: ${summoner.gameCreationDate.fromNow()}`, + label: ` ${championName}`, + sublabel: ` ${summoner.summonerName}`, click: async() => { - const response = await connection.inviteSummoners(summoner.summonerId); - console.log(response.status); - const json = await response.json(); - console.log(json); + await connection.inviteSummoners(summoner.summonerId); } })); }); From 58c443a490ce408daf9ea0ae4dfe3249e0aa65b9 Mon Sep 17 00:00:00 2001 From: Adam Koewler Date: Sat, 23 Mar 2024 23:25:51 -0500 Subject: [PATCH 5/8] cleaned up readme and added screenshots --- CHANGELOG.md | 0 contributing.md | 34 +++++++++++++++++++++++ images/OpenBuildIn-1.2.1.png | Bin 0 -> 9314 bytes images/RecentlyPlayed-1.2.1.png | Bin 0 -> 17942 bytes images/SpoofProfileIcon-1.2.1.png | Bin 0 -> 15704 bytes images/SpoofProfileRank-1.2.1.png | Bin 0 -> 15351 bytes readme.md | 44 +++++------------------------- 7 files changed, 41 insertions(+), 37 deletions(-) delete mode 100644 CHANGELOG.md create mode 100644 contributing.md create mode 100644 images/OpenBuildIn-1.2.1.png create mode 100644 images/RecentlyPlayed-1.2.1.png create mode 100644 images/SpoofProfileIcon-1.2.1.png create mode 100644 images/SpoofProfileRank-1.2.1.png diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index e69de29..0000000 diff --git a/contributing.md b/contributing.md new file mode 100644 index 0000000..990d97e --- /dev/null +++ b/contributing.md @@ -0,0 +1,34 @@ +# Development +### Install Dependencies +``` +npm i +``` +### Running the Application +#### Serving Angular Live +This builds the Angular and Electron portions of the code and runs the Electron application. The Angular portion of the code is served live (i.e. from a server). Changes to both the Angular portion and the Electron portion of the code are watched and will trigger the code to be recompiled. When the Angular portion of the code is recompiled, any open Electron windows will be reloaded. When the Electron portion of the code is recompiled, a new Electron process will be spawned. +``` +npm run start +``` +#### Serving Angular Locally +This builds the Angular and Electron portions of the code and runs the Electron application. The Angular portion of the code is served locally (i.e. from a file). This is how the application would be ran once built into an executable. +``` +npm run build[:] +npm run electron -- ./ +``` +#### Skipping Angular Build +If the Angular portion of the code has not changed, or if the Angular window is not being displayed, then (re)compiling the Angular portion may be skipped. +``` +npm run electron:build +npm run electron -- ./ +``` +Alternatively, changes to the Electron portion of the code can be watched. When the Electron portion of the code is recompiled, a new Electron process will be spawned. +``` +npm run electron:watch +``` +### Building Executable +``` +npm run package +``` + +### CI/CD Pipeline +Commits trigger CodeQL analysis that build the application and add a status check to pull requests. Commits to master with a version tag (format v#.#.#) trigger the release job to build and create a release draft. The release draft requires manual review. Disabled atm \ No newline at end of file diff --git a/images/OpenBuildIn-1.2.1.png b/images/OpenBuildIn-1.2.1.png new file mode 100644 index 0000000000000000000000000000000000000000..43efec094308aeeb4094530521ab6aecb8fbc018 GIT binary patch literal 9314 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 KMNUMnLSTY)26aXN literal 0 HcmV?d00001 diff --git a/images/SpoofProfileRank-1.2.1.png b/images/SpoofProfileRank-1.2.1.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9c674001b85ffad292dab26767b54b9d7a61bb GIT binary patch literal 15351 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 +- Quick invite recently played players
Screenshot
- Quick invite players by friend group - Advanced loot disenchantment for owned & unowned resources including: - Champion Capsules @@ -27,46 +32,11 @@ Running as a background application, found in your system tray, LCU Enhancement - Availability (Friends List) - Icon (Friends List) - Rank (Friends List) +
Screenshot
- Auto accept queue prompt -## Download -[Download Link](https://github.com/xadamxk/LCU-Enhancement-Suite/releases/latest) - -# Development -### Install Dependencies -``` -npm i -``` -### Running the Application -#### Serving Angular Live -This builds the Angular and Electron portions of the code and runs the Electron application. The Angular portion of the code is served live (i.e. from a server). Changes to both the Angular portion and the Electron portion of the code are watched and will trigger the code to be recompiled. When the Angular portion of the code is recompiled, any open Electron windows will be reloaded. When the Electron portion of the code is recompiled, a new Electron process will be spawned. -``` -npm run start -``` -#### Serving Angular Locally -This builds the Angular and Electron portions of the code and runs the Electron application. The Angular portion of the code is served locally (i.e. from a file). This is how the application would be ran once built into an executable. -``` -npm run build[:] -npm run electron -- ./ -``` -#### Skipping Angular Build -If the Angular portion of the code has not changed, or if the Angular window is not being displayed, then (re)compiling the Angular portion may be skipped. -``` -npm run electron:build -npm run electron -- ./ -``` -Alternatively, changes to the Electron portion of the code can be watched. When the Electron portion of the code is recompiled, a new Electron process will be spawned. -``` -npm run electron:watch -``` -### Building Executable -``` -npm run package -``` -### CI/CD Pipeline -Commits trigger CodeQL analysis that build the application and add a status check to pull requests. Commits to master with a version tag (format v#.#.#) trigger the release job to build and create a release draft. The release draft requires manual review. ## Riot Games From a1e75c9957d20463524d1e4c40c16d99dcab93ca Mon Sep 17 00:00:00 2001 From: Adam Koewler Date: Sun, 24 Mar 2024 17:21:07 -0500 Subject: [PATCH 6/8] added gamemode specific logic to open build in browser --- src/electron/core/connection.ts | 9 +- src/electron/enums/endpoints.ts | 1 + src/electron/enums/game-modes.ts | 5 + src/electron/enums/index.ts | 1 + src/electron/models/index.ts | 1 + src/electron/models/lollobby-lobby.ts | 151 ++++++++++++++++++ .../open-build-in-browser.ts | 16 +- 7 files changed, 177 insertions(+), 7 deletions(-) create mode 100644 src/electron/enums/game-modes.ts create mode 100644 src/electron/models/lollobby-lobby.ts diff --git a/src/electron/core/connection.ts b/src/electron/core/connection.ts index 3f3b747..05715ae 100644 --- a/src/electron/core/connection.ts +++ b/src/electron/core/connection.ts @@ -32,6 +32,7 @@ declare module '../../connector' { getCurrentVersion(): Promise; getChampionIcon(championId: number): Promise; getChampionSelectChampions(): Promise; + getLobbyV2Lobby(): Promise; } } @@ -63,11 +64,11 @@ LeagueConnection.prototype.forgeLoot = async function(this, recipeName, componen return await this.post(`${Endpoints.LOOT_RECIPES}/${recipeName}/craft?repeat=${repeatCount}`, componentLootIds); }; -LeagueConnection.prototype.getBalance = async function(this) : Promise { +LeagueConnection.prototype.getBalance = async function(this): Promise { return await this.get(Endpoints.WALLET); }; -LeagueConnection.prototype.getFriends = async function(this) : Promise { +LeagueConnection.prototype.getFriends = async function(this): Promise { return await this.get(Endpoints.FRIENDS); }; @@ -98,3 +99,7 @@ LeagueConnection.prototype.getChampionIcon = async function(championId): Promise LeagueConnection.prototype.getChampionSelectChampions = async function(): Promise { return await this.get(Endpoints.CHAMPION_SELECT_ALL_CHAMPS); }; + +LeagueConnection.prototype.getLobbyV2Lobby = async function(): Promise { + return await this.get(Endpoints.LOBBY); +}; diff --git a/src/electron/enums/endpoints.ts b/src/electron/enums/endpoints.ts index abbada4..b6925a0 100644 --- a/src/electron/enums/endpoints.ts +++ b/src/electron/enums/endpoints.ts @@ -5,6 +5,7 @@ export enum Endpoints { TEAM_BUILDER_CURRENT_CHAMPION = '/lol-lobby-team-builder/champ-select/v1/current-champion', END_OF_GAME_STATS = '/lol-end-of-game/v1/eog-stats-block', INVITATIONS = '/lol-lobby/v2/lobby/invitations', + LOBBY = '/lol-lobby/v2/lobby', FRIEND_GROUPS = '/lol-chat/v1/friend-groups', FRIENDS = '/lol-chat/v1/friends', FRIEND_REQUESTS = '/lol-chat/v1/friend-requests', diff --git a/src/electron/enums/game-modes.ts b/src/electron/enums/game-modes.ts new file mode 100644 index 0000000..8c39de7 --- /dev/null +++ b/src/electron/enums/game-modes.ts @@ -0,0 +1,5 @@ +// Source: https://static.developer.riotgames.com/docs/lol/gameModes.json +export enum GameModes { + ARAM = 'ARAM', + CLASSIC = 'CLASSIC' +} diff --git a/src/electron/enums/index.ts b/src/electron/enums/index.ts index 4adb0be..35e319c 100644 --- a/src/electron/enums/index.ts +++ b/src/electron/enums/index.ts @@ -5,3 +5,4 @@ export * from './loot-item-status'; export * from './loot-redeemable-status'; export * from './loot-types'; export * from './player-response'; +export * from './game-modes'; diff --git a/src/electron/models/index.ts b/src/electron/models/index.ts index 1dae2d0..8c58dee 100644 --- a/src/electron/models/index.ts +++ b/src/electron/models/index.ts @@ -12,3 +12,4 @@ export * from './eog-player'; export * from './eog-stats'; export * from './eog-team'; export * from './cs-champion'; +export * from './lollobby-lobby'; diff --git a/src/electron/models/lollobby-lobby.ts b/src/electron/models/lollobby-lobby.ts new file mode 100644 index 0000000..75da9f0 --- /dev/null +++ b/src/electron/models/lollobby-lobby.ts @@ -0,0 +1,151 @@ +import { Model } from '../api'; + +export class LOLLobbyV2Lobby extends Model { + canStartActivity: boolean; + gameConfig: GameConfig; + invitations: any[]; + localMember: LocalMember; + members: Member[]; + mucJwtDto: MucJwtDto; + multiUserChatId: string; + multiUserChatPassword: string; + partyId: string; + partyType: string; + restrictions: any; + scarcePositions: any[]; + warnings: any; +} + +export interface GameConfig { + allowablePremadeSizes: any[] + customLobbyName: string + customMutatorName: string + customRewardsDisabledReasons: any[] + customSpectatorPolicy: string + customSpectators: any[] + customTeam100: CustomTeam[] + customTeam200: CustomTeam[] + gameMode: string + isCustom: boolean + isLobbyFull: boolean + isTeamBuilderManaged: boolean + mapId: number + maxHumanPlayers: number + maxLobbySize: number + maxTeamSize: number + pickType: string + premadeSizeAllowed: boolean + queueId: number + shouldForceScarcePositionSelection: boolean + showPositionSelector: boolean + showQuickPlaySlotSelection: boolean +} + +export interface CustomTeam { + allowedChangeActivity: boolean + allowedInviteOthers: boolean + allowedKickOthers: boolean + allowedStartActivity: boolean + allowedToggleInvite: boolean + autoFillEligible: boolean + autoFillProtectedForPromos: boolean + autoFillProtectedForSoloing: boolean + autoFillProtectedForStreaking: boolean + botChampionId: number + botDifficulty: string + botId: string + firstPositionPreference: string + intraSubteamPosition: any + isBot: boolean + isLeader: boolean + isSpectator: boolean + playerSlots: any[] + puuid: string + quickplayPlayerState: any + ready: boolean + secondPositionPreference: string + showGhostedBanner: boolean + subteamIndex: any + summonerIconId: number + summonerId: number + summonerInternalName: string + summonerLevel: number + summonerName: string + teamId: number + tftNPEQueueBypass: any +} + +export interface LocalMember { + allowedChangeActivity: boolean + allowedInviteOthers: boolean + allowedKickOthers: boolean + allowedStartActivity: boolean + allowedToggleInvite: boolean + autoFillEligible: boolean + autoFillProtectedForPromos: boolean + autoFillProtectedForSoloing: boolean + autoFillProtectedForStreaking: boolean + botChampionId: number + botDifficulty: string + botId: string + firstPositionPreference: string + intraSubteamPosition: any + isBot: boolean + isLeader: boolean + isSpectator: boolean + playerSlots: any[] + puuid: string + quickplayPlayerState: any + ready: boolean + secondPositionPreference: string + showGhostedBanner: boolean + subteamIndex: any + summonerIconId: number + summonerId: number + summonerInternalName: string + summonerLevel: number + summonerName: string + teamId: number + tftNPEQueueBypass: any +} + +export interface Member { + allowedChangeActivity: boolean + allowedInviteOthers: boolean + allowedKickOthers: boolean + allowedStartActivity: boolean + allowedToggleInvite: boolean + autoFillEligible: boolean + autoFillProtectedForPromos: boolean + autoFillProtectedForSoloing: boolean + autoFillProtectedForStreaking: boolean + botChampionId: number + botDifficulty: string + botId: string + firstPositionPreference: string + intraSubteamPosition: any + isBot: boolean + isLeader: boolean + isSpectator: boolean + playerSlots: any[] + puuid: string + quickplayPlayerState: any + ready: boolean + secondPositionPreference: string + showGhostedBanner: boolean + subteamIndex: any + summonerIconId: number + summonerId: number + summonerInternalName: string + summonerLevel: number + summonerName: string + teamId: number + tftNPEQueueBypass: any +} + +export interface MucJwtDto { + channelClaim: string + domain: string + jwt: string + targetRegion: string +} diff --git a/src/electron/modules/open-build-in-browser/open-build-in-browser.ts b/src/electron/modules/open-build-in-browser/open-build-in-browser.ts index 800a9dc..98f7527 100644 --- a/src/electron/modules/open-build-in-browser/open-build-in-browser.ts +++ b/src/electron/modules/open-build-in-browser/open-build-in-browser.ts @@ -3,6 +3,8 @@ import { WebSocketModule } from '../../api'; import { connection } from '../../core'; import { CSCurrentChampionSubscription, TBCurrentChampionSubscription } from '../../subscriptions'; import { BlitzProvider, IProvider, LolalyticsProvider, MobalyticsProvider, OPGGProvider, PROVIDERS, UGGProvider } from './providers'; +import { GameModes } from '../../enums'; +import { LOLLobbyV2Lobby } from '../../models'; const SETTINGS_KEY = 'openIn'; @@ -76,24 +78,28 @@ export class OpenBuildInBrowserModule extends WebSocketModule { const openInKey = this.storage.get(SETTINGS_KEY, ''); if (openInKey === '') return; + // Get game mode from lobby + const lobbyData: LOLLobbyV2Lobby = await (await connection.getLobbyV2Lobby()).json(); + const isAram = lobbyData.gameConfig.gameMode === GameModes.ARAM; + // Initialize provider let provider: IProvider; switch (openInKey) { default: case PROVIDERS.Mobalytics: - provider = new MobalyticsProvider(connection, true); + provider = new MobalyticsProvider(connection, isAram); break; case PROVIDERS.Blitz: - provider = new BlitzProvider(connection, true); + provider = new BlitzProvider(connection, isAram); break; case PROVIDERS.OPGG: - provider = new OPGGProvider(connection, true); + provider = new OPGGProvider(connection, isAram); break; case PROVIDERS.Lolalytics: - provider = new LolalyticsProvider(connection, true); + provider = new LolalyticsProvider(connection, isAram); break; case PROVIDERS.UGG: - provider = new UGGProvider(connection, true); + provider = new UGGProvider(connection, isAram); break; } From e91eb9a78e48b623c8d19ce737ce2e06ddea0b94 Mon Sep 17 00:00:00 2001 From: Adam Koewler Date: Sun, 24 Mar 2024 17:21:23 -0500 Subject: [PATCH 7/8] version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3dd5ef9..a18baeb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lcu-enhancement-suite", - "version": "1.2.0", + "version": "1.2.1", "description": "Enhancements for the League of Legends client.", "author": "xadamxk", "contributors": [ From 619c5bc1f01608b3f8fbd0ced95a1b70e107a472 Mon Sep 17 00:00:00 2001 From: Adam Koewler Date: Sun, 24 Mar 2024 17:22:22 -0500 Subject: [PATCH 8/8] Updated readme --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 1ed07a0..c8a7031 100644 --- a/readme.md +++ b/readme.md @@ -10,7 +10,7 @@ Running as a background application, found in your system tray, LCU Enhancement [Download Link](https://github.com/xadamxk/LCU-Enhancement-Suite/releases/latest) ## Features -- Open recommended build in browser during champion select (ARAM ONLY - SR coming soon) for the following providers: +- Open recommended build in browser during champion select (SR & ARAM ONLY) for the following providers: - Blitz.gg - Lolalytics - Mobalytics