diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..1ff0c423 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore index 2700eac3..b7bdf2b8 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,11 @@ speed-measure-plugin*.json !.vscode/extensions.json .history/* +# IDE - VS +*.vs/ +**/obj/ +**/bin/ + # release /release diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a8b4565..8dc03e57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,56 @@ # Changelog +## 1.0.8 (2020-07-09) + +- added support for the new cluster jewels stats +- added a new hotkey (default on F10) to manually capture replays +- added a toggle to disable the leaving of a party via kick using the trade finished action (#774) +- added a audio button at the trade settings to customize the notification sound (#786) +- added a lower opacity for market results once they have been requested (#780) +- added the seller name for items and bulk exchanges at the market (#773) +- fixed an issue at the market type filter resulting in a unknown category error (#793) + +## 1.0.7 (2020-07-01) + +- added the version number at the evaluate, inspect and settings window +- update trade action still interested to be always shown for incoming requests +- update the market history to only show unique requests +- fixed an focus issue occurring when using the trade whisper button +- fixed an issue accessing the clipboard +- fixed an issue querying the map tier + +## 1.0.6 (2020-06-25) + +- added a history for the market search +- added a received timer at the trade message +- added the player name at the trade message +- added a new action to go to the hideout for outgoing trades +- added support for the new harvest seeds +- update the height of the trade window to be configurable +- fixed an issue parsing unicode item data +- fixed an issue at the market which resulted in crashing the app + +## 1.0.5 (2020-06-23) + +- added support page with discord and GitHub issues +- added colors for life, mana and energy shield pseudo stats +- added trade filter setting (Incoming & Outgoing, Incoming) +- added trade layout setting (Top To Bottom, Bottom To Top) +- added trade window to be transparent if no active trades and the window is pinned +- update trade action finished to be always shown even if no trade have been initialized +- fixed an focus issue occurring when using the trade whisper button +- fixed an sorting issue at the market result list +- fixed an issue at the inspect frame not showing dps + +## 1.0.4 (2020-06-19) + +- added 3.11 data +- added `Character Name` setting as fallback + +## 1.0.3 (2020-06-18) + +- fixed a unhandled error if no event data is available + ## 1.0.2 (2020-06-16) - added misc module diff --git a/README.md b/README.md index 57be5ea0..667b08cb 100644 --- a/README.md +++ b/README.md @@ -24,10 +24,8 @@ The complete guide with pictures can be found [here](INSTALLING.md). | Market | Search History | 🚧 | | Market | Save Queries | 📚 | | Market | Sort Results | 📚 | -| Stash | Highlight Item | 📚 | | Stash | Filter Category | 📚 | | Stash | Navigation | ⚡ | Waiting 🐺 -| Trade | Parsing Offers | ⚡ | Waiting 🐺 | Commands | @latest_whisper | ⚡ | Waiting 🐺 🚧 In Progress 📚 Backlog ⚡ Blocked 🐺 Overwolf diff --git a/angular.json b/angular.json index 24524c80..03cdf2ab 100644 --- a/angular.json +++ b/angular.json @@ -24,8 +24,7 @@ "tsConfig": "tsconfig.app.json", "aot": true, "assets": [ - "src/assets/images", - "src/assets/audio" + "src/assets/images" ], "styles": [ "src/styles.scss", diff --git a/manifest.json b/manifest.json index 7b4caaac..4bde8066 100644 --- a/manifest.json +++ b/manifest.json @@ -4,7 +4,7 @@ "meta": { "name": "PoE Overlay", "author": "Kyusung4698", - "version": "1.0.2", + "version": "1.0.8", "minimum-overwolf-version": "0.147.0", "description": "Search the market and send trade offers. Get current market values for your item. View insights for maps and items.", "dock_button_title": "PoE Overlay", @@ -38,11 +38,11 @@ "transparent": true, "show_in_taskbar": false, "size": { - "width": 1212, + "width": 1242, "height": 699 }, "min_size": { - "width": 1212, + "width": 1242, "height": 699 } }, @@ -146,9 +146,10 @@ "disable_rightclick": true, "transparent": true, "resizable": true, + "ignore_keyboard_events": true, "size": { - "width": 1212, - "height": 699 + "width": 310, + "height": 400 } }, "tradehighlight": { @@ -159,6 +160,7 @@ "disable_rightclick": true, "transparent": true, "resizable": true, + "ignore_keyboard_events": true, "size": { "width": 1212, "height": 699 @@ -180,8 +182,11 @@ "event_data": { "game_ids": [ 7212 - ] + ], + "wait_for_stable_framerate": 30 }, + "tracked": false, + "include_launchers": false, "start_minimized": false } ], @@ -265,9 +270,14 @@ "action-type": "custom" }, "misc-stash-highlight": { - "title": "Highlight Item in Stash", + "title": "Highlight a item in stash", "action-type": "custom", "default": "Alt+F" + }, + "replay-manually": { + "title": "Capture a replay manually", + "action-type": "custom", + "default": "F10" } }, "externally_connectable": { @@ -287,6 +297,12 @@ "enable_auto_refresh": true, "reload_delay": 1000, "filter": "dist/*.*" + }, + "extra-objects": { + "clipboard-plugin": { + "file": "plugins/dist/clipboard.dll", + "class": "overwolf.plugins.clipboard" + } } } } \ No newline at end of file diff --git a/overlay.babel b/overlay.babel index f762651c..7be3ca94 100644 --- a/overlay.babel +++ b/overlay.babel @@ -129,6 +129,117 @@ + + changelog-1-0-8 + + + message + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + title + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + commands @@ -2957,6 +3068,117 @@ + + support + + + message + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + title + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + thanks @@ -8223,10 +8445,10 @@ - help + footer - browser + support false @@ -8253,19 +8475,19 @@ false - pt-BR + pl-PL false - ru-RU + pt-BR false - th-TH + ru-RU false - pl-PL + th-TH false @@ -8278,8 +8500,13 @@ + + + + help + - browser-title + browser false @@ -8332,7 +8559,7 @@ - bug + browser-title false @@ -8385,7 +8612,7 @@ - bug-title + bug false @@ -8438,7 +8665,7 @@ - donate + bug-title false @@ -8491,7 +8718,7 @@ - donate-title + donate false @@ -8544,7 +8771,7 @@ - dwm + donate-title false @@ -8597,7 +8824,7 @@ - dwm-title + dwm false @@ -8650,7 +8877,7 @@ - faq + dwm-title false @@ -8703,7 +8930,7 @@ - graph + faq false @@ -8756,7 +8983,7 @@ - graph-title + graph false @@ -8809,7 +9036,60 @@ - graph-url + graph-title + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + pl-PL + false + + + zh-CHS + false + + + zh-CHT + false + + + + + graph-url false @@ -9992,6 +10272,59 @@ bar + + history + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + reset false @@ -11571,6 +11904,59 @@ + + manually + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + name false @@ -12106,6 +12492,59 @@ + + character-name + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + dialog false @@ -13497,13 +13936,13 @@ - trade + support - action + developer - finished + open false @@ -13556,7 +13995,7 @@ - interested + text false @@ -13609,7 +14048,7 @@ - invite + title false @@ -13661,46 +14100,591 @@ - - item-gone - false - - - - - - de-DE - false - - - en-US - false - - - es-ES - false - - - fr-FR - false - - - ko-KR - false - - - pl-PL - false - - - pt-BR - false - - - ru-RU - false - - + + + + name + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + question + + + discord + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + github + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + text + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + title + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + + + + + trade + + + action + + + finished + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + hideout + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + interested + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + invite + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + item-gone + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + item-highlight + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + th-TH false @@ -13715,7 +14699,7 @@ - item-highlight + resend false @@ -13768,7 +14752,7 @@ - resend + trade false @@ -13821,7 +14805,60 @@ - trade + wait + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + whisper false @@ -13873,8 +14910,278 @@ + + + + actions + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + analyzing + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + empty + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + enabled + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + error + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + pl-PL + false + + + zh-CHS + false + + + zh-CHT + false + + + + + errors + - wait + http false @@ -13927,7 +15234,7 @@ - whisper + rate false @@ -13982,7 +15289,7 @@ - analyzing + fetching false @@ -14035,7 +15342,7 @@ - empty + filter false @@ -14087,8 +15394,119 @@ + + filters + + + incoming + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + incomingoutgoing + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + + + - enabled + height false @@ -14141,7 +15559,7 @@ - error + layout false @@ -14168,19 +15586,19 @@ false - pt-BR + pl-PL false - ru-RU + pt-BR false - th-TH + ru-RU false - pl-PL + th-TH false @@ -14194,10 +15612,10 @@ - errors + layouts - http + bottomtotop false @@ -14250,7 +15668,7 @@ - rate + toptobottom false @@ -14305,7 +15723,7 @@ - fetching + leave-party false @@ -14574,6 +15992,59 @@ + + messages + false + + + + + + de-DE + false + + + en-US + false + + + es-ES + false + + + fr-FR + false + + + ko-KR + false + + + pl-PL + false + + + pt-BR + false + + + ru-RU + false + + + th-TH + false + + + zh-CHS + false + + + zh-CHT + false + + + name false @@ -15154,7 +16625,7 @@ - true + false {{'%1' | translate}} [label]="'%1' | translate" diff --git a/pack.js b/pack.js index 6580b82f..068eb074 100644 --- a/pack.js +++ b/pack.js @@ -10,12 +10,14 @@ fs.rmdirSync(dir, { }); fs.mkdirSync(dir); fs.mkdirSync(`${dir}/app`); +fs.mkdirSync(`${dir}/app/plugins`); copyRecursiveSync('./store', `${dir}/store`) fs.copyFileSync('./CHANGELOG.md', `${dir}/CHANGELOG.md`); fs.copyFileSync('./manifest.json', `${dir}/app/manifest.json`); copyRecursiveSync('./assets', `${dir}/app/assets`); copyRecursiveSync('./dist', `${dir}/app/dist`); +copyRecursiveSync('./plugins/dist', `${dir}/app/plugins/dist`); zipDirectory(dir, `./release/poe-overlay-overwolf ${manifest.meta.version}.zip`).then(() => { fs.rmdirSync(dir, { diff --git a/package-lock.json b/package-lock.json index 6a7fa0d9..3158b92e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "poe-overlay-overwolf", - "version": "1.0.1", + "version": "1.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 06d2ff38..90bc55ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "poe-overlay-overwolf", - "version": "1.0.2", + "version": "1.0.8", "scripts": { "watch": "ng build --watch", "watch:prod": "ng build --watch --prod", diff --git a/plugins/dist/clipboard.dll b/plugins/dist/clipboard.dll new file mode 100644 index 00000000..cbf06060 Binary files /dev/null and b/plugins/dist/clipboard.dll differ diff --git a/plugins/src/clipboard/Clipboard.cs b/plugins/src/clipboard/Clipboard.cs new file mode 100644 index 00000000..ce57d85b --- /dev/null +++ b/plugins/src/clipboard/Clipboard.cs @@ -0,0 +1,85 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace overwolf.plugins +{ + public sealed class clipboard + { + public void placeOnClipboard(string content, Action callback) + { + startSTATask(() => + { + try + { + if (!string.IsNullOrWhiteSpace(content)) + { + var obj = new DataObject(); + obj.SetText(content); + Clipboard.SetDataObject(obj, true); + } + else + { + Clipboard.Clear(); + } + callback(new + { + success = true + }); + } + catch (Exception ex) + { + callback(new + { + success = false, + error = ex.ToString() + }); + } + }); + } + + public void getFromClipboard(Action callback) + { + startSTATask(() => + { + try + { + var content = Clipboard.GetText(); + callback(new + { + success = true, + content + }); + } + catch (Exception ex) + { + callback(new + { + success = false, + error = ex.ToString() + }); + } + }); + } + + private static void startSTATask(Action func) + { + var tcs = new TaskCompletionSource(); + var thread = new Thread(() => + { + try + { + func(); + tcs.SetResult(null); + } + catch (Exception e) + { + tcs.SetException(e); + } + }); + thread.SetApartmentState(ApartmentState.STA); + thread.Start(); + } + } +} diff --git a/plugins/src/clipboard/Properties/AssemblyInfo.cs b/plugins/src/clipboard/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..a67cbbd3 --- /dev/null +++ b/plugins/src/clipboard/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die einer Assembly zugeordnet sind. +[assembly: AssemblyTitle("clipboard")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("clipboard")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly +// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von +// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("927e817e-7977-43d2-b6fe-cd95846c1444")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, +// indem Sie "*" wie unten gezeigt eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/plugins/src/clipboard/clipboard.csproj b/plugins/src/clipboard/clipboard.csproj new file mode 100644 index 00000000..9d2303a2 --- /dev/null +++ b/plugins/src/clipboard/clipboard.csproj @@ -0,0 +1,54 @@ + + + + + Debug + AnyCPU + {927E817E-7977-43D2-B6FE-CD95846C1444} + Library + Properties + overwolf.plugins.clipboard + clipboard + v4.5 + 512 + true + + + + true + ..\..\dist\ + DEBUG;TRACE + full + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + ..\..\dist\ + TRACE + true + none + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + Off + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/src/plugins.sln b/plugins/src/plugins.sln new file mode 100644 index 00000000..bf6daa7f --- /dev/null +++ b/plugins/src/plugins.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29613.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "clipboard", "clipboard\clipboard.csproj", "{927E817E-7977-43D2-B6FE-CD95846C1444}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {927E817E-7977-43D2-B6FE-CD95846C1444}.Debug|x64.ActiveCfg = Debug|x64 + {927E817E-7977-43D2-B6FE-CD95846C1444}.Debug|x64.Build.0 = Debug|x64 + {927E817E-7977-43D2-B6FE-CD95846C1444}.Release|x64.ActiveCfg = Release|x64 + {927E817E-7977-43D2-B6FE-CD95846C1444}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {39C6446F-AC73-49CB-B8EE-7EBFE90E4C2B} + EndGlobalSection +EndGlobal diff --git a/src/app/app-error-handler.ts b/src/app/app-error-handler.ts index 1a67499c..f0b87f0a 100644 --- a/src/app/app-error-handler.ts +++ b/src/app/app-error-handler.ts @@ -7,7 +7,7 @@ export class AppErrorHandler implements ErrorHandler { StackTrace.fromError(error).then(stackframes => { const message = error.message ?? error; const stack = stackframes.splice(0, 20).map(x => x.toString()).join('\n'); - console.error('An unexpected application error occured.', JSON.stringify({ message, stack })); + console.error(`An unexpected application error occured. ${JSON.stringify({ message, stack })}`); }); throw error; } diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 7ee96da8..dfce405c 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -47,7 +47,7 @@ export class AppComponent implements OnInit, OnDestroy { flatMap(() => OWWindows.getCurrentWindow()), retryWhen(errors => errors.pipe( flatMap(error => { - console.warn('An unexpected error occured while loading PoE Overlay.', error.message ?? JSON.stringify(error)); + console.warn(`An unexpected error occured while loading PoE Overlay. ${error?.message ?? JSON.stringify(error)}`); return OWWindows.displayMessageBox({ message_title: 'PoE Overlay could not be loaded.', message_body: 'An unexpected error occured while loading PoE Overlay.\n' + diff --git a/src/app/core/annotation/annotation.service.ts b/src/app/core/annotation/annotation.service.ts index ae0b09a8..4bd3ae30 100644 --- a/src/app/core/annotation/annotation.service.ts +++ b/src/app/core/annotation/annotation.service.ts @@ -44,16 +44,11 @@ const ANNOTATIONS: Annotation[] = [ } ] }, - { - id: 'trade', - children: [ - { id: 'init' }, - { id: 'incoming' }, - { id: 'highlight' }, - { id: 'outgoing' }, - { id: 'settings' } - ] - }, + { id: 'trade.init' }, + { id: 'trade.incoming' }, + { id: 'trade.highlight' }, + { id: 'trade.outgoing' }, + { id: 'trade.settings' }, { id: 'evaluate', hotkey: Hotkey.Evaluate, @@ -81,8 +76,7 @@ const ANNOTATIONS: Annotation[] = [ }, { id: 'replay', - hotkey: Hotkey.SettingsToggle, - skippable: true, + hotkey: Hotkey.SettingsToggle }, { id: 'misc', @@ -96,7 +90,12 @@ const ANNOTATIONS: Annotation[] = [ expressions: [AnnotationCondition.BookmarkOpened], skippable: true }, - { id: 'thanks' } + { + id: 'support', + hotkey: Hotkey.SettingsToggle + }, + { id: 'thanks' }, + { id: 'changelog-1-0-8' }, ]; @Injectable({ diff --git a/src/app/core/audio/audio.service.ts b/src/app/core/audio/audio.service.ts index 88805a64..641c592a 100644 --- a/src/app/core/audio/audio.service.ts +++ b/src/app/core/audio/audio.service.ts @@ -1,10 +1,9 @@ import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; import { tap, throttleTime } from 'rxjs/operators'; -import { AudioFile } from './audio'; interface AudioPlayEvent { - file: AudioFile; + file: string; volume: number; } @@ -20,7 +19,7 @@ export class AudioService { this.init(); } - public play(file: AudioFile, volume: number = 1): void { + public play(file: string, volume: number = 1): void { this.queue$.next({ file, volume }); } diff --git a/src/app/core/audio/audio.ts b/src/app/core/audio/audio.ts index 82889547..38f51d55 100644 --- a/src/app/core/audio/audio.ts +++ b/src/app/core/audio/audio.ts @@ -1,3 +1,4 @@ export enum AudioFile { - Notification = '/dist/poe-overlay-overwolf/assets/audio/notification.wav' + // tslint:disable-next-line:max-line-length + Notification = 'data:audio/wav;base64,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' } diff --git a/src/app/core/config/app.ts b/src/app/core/config/app.ts new file mode 100644 index 00000000..f8852ec9 --- /dev/null +++ b/src/app/core/config/app.ts @@ -0,0 +1,2 @@ +export const APP_UID = 'cijcjjcjilpooaeppicpfibopeefaglkefjaeofl'; +export const APP_SUB_ID = 32; diff --git a/src/app/core/config/hotkey.ts b/src/app/core/config/hotkey.ts index bf741f3e..97dd1855 100644 --- a/src/app/core/config/hotkey.ts +++ b/src/app/core/config/hotkey.ts @@ -16,5 +16,6 @@ export enum Hotkey { Bookmark4 = 'bookmark4', Bookmark5 = 'bookmark5', Bookmark6 = 'bookmark6', - MiscStashHighlight = 'misc-stash-highlight' + MiscStashHighlight = 'misc-stash-highlight', + ReplayManually = 'replay-manually' } diff --git a/src/app/core/config/index.ts b/src/app/core/config/index.ts index fd133515..744d3a40 100644 --- a/src/app/core/config/index.ts +++ b/src/app/core/config/index.ts @@ -1,3 +1,5 @@ +export * from './app'; export * from './hotkey'; export * from './ui-language'; export * from './window-name'; + diff --git a/src/app/core/event/event-emitter.ts b/src/app/core/event/event-emitter.ts index fea01c5e..d2356505 100644 --- a/src/app/core/event/event-emitter.ts +++ b/src/app/core/event/event-emitter.ts @@ -21,7 +21,10 @@ export class EventEmitter { public next(event: TEvent): void { Object.getOwnPropertyNames(this.registry).forEach(key => { - this.registry[key](event); + const fn = this.registry[key]; + if (fn) { + fn(event); + } }); this.latest = event; } diff --git a/src/app/core/feature/feature-settings.ts b/src/app/core/feature/feature-settings.ts index d1038879..58cd9838 100644 --- a/src/app/core/feature/feature-settings.ts +++ b/src/app/core/feature/feature-settings.ts @@ -6,4 +6,5 @@ export interface FeatureSettings { leagueId?: string; uiLanguage?: UiLanguage; dialogOpacity?: number; + characterName?: string; } diff --git a/src/app/core/helper/base64.ts b/src/app/core/helper/base64.ts new file mode 100644 index 00000000..c5a2cd90 --- /dev/null +++ b/src/app/core/helper/base64.ts @@ -0,0 +1,11 @@ +export function b64EncodeUnicode(str: string): string { + return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (_, p1) => { + return String.fromCharCode(parseInt(p1, 16)); + })); +} + +export function b64DecodeUnicode(str: string): string { + return decodeURIComponent(Array.prototype.map.call(atob(str), (c: string) => { + return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); + }).join('')); +} diff --git a/src/app/core/helper/index.ts b/src/app/core/helper/index.ts index 75b11dcc..1159a6fc 100644 --- a/src/app/core/helper/index.ts +++ b/src/app/core/helper/index.ts @@ -1 +1,2 @@ +export * from './base64'; export * from './roman'; diff --git a/src/app/core/odk/index.ts b/src/app/core/odk/index.ts index be563ec8..2c2d8776 100644 --- a/src/app/core/odk/index.ts +++ b/src/app/core/odk/index.ts @@ -1,4 +1,5 @@ export * from './ow-audio'; +export * from './ow-clipboard'; export * from './ow-file-listener'; export * from './ow-game-listener'; export * from './ow-games'; diff --git a/src/app/core/odk/ow-audio.ts b/src/app/core/odk/ow-audio.ts index 0d234867..509764e0 100644 --- a/src/app/core/odk/ow-audio.ts +++ b/src/app/core/odk/ow-audio.ts @@ -5,7 +5,6 @@ export class OWAudio { public static create(url: string): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.audio.create(url, result => { - console.log(result); if (result.success) { resolve(result.id); } else { @@ -19,7 +18,6 @@ export class OWAudio { public static play(id: string): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.audio.play(id, result => { - console.log(result); if (result.success) { resolve(); } else { @@ -33,7 +31,6 @@ export class OWAudio { public static stop(id: string): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.audio.stopById(id, result => { - console.log(result); if (result.success) { resolve(); } else { @@ -47,7 +44,6 @@ export class OWAudio { public static resume(id: string): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.audio.resumeById(id, result => { - console.log(result); if (result.success) { resolve(); } else { @@ -61,7 +57,6 @@ export class OWAudio { public static setVolume(volume: number): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.audio.setVolume(volume, result => { - console.log(result); if (result.success) { resolve(); } else { diff --git a/src/app/core/odk/ow-clipboard.ts b/src/app/core/odk/ow-clipboard.ts new file mode 100644 index 00000000..05a0325f --- /dev/null +++ b/src/app/core/odk/ow-clipboard.ts @@ -0,0 +1,72 @@ +import { from, Observable } from 'rxjs'; +import { flatMap, shareReplay } from 'rxjs/operators'; + +interface Result { + success: boolean; + error?: string; +} + +interface GetFromClipboardResult extends Result { + content?: string; +} + +interface ClipboardExtension { + placeOnClipboard: (content: string, callback: (result: Result) => void) => void; + getFromClipboard: (callback: (result: GetFromClipboardResult) => void) => void; +} + +export class OWClipboard { + private static extension$: Observable; + + public static placeOnClipboard(content: string): Observable { + return this.getExtension().pipe( + flatMap(extension => { + const promise = new Promise((resolve, reject) => { + extension.placeOnClipboard(content, result => { + if (result.success) { + resolve(); + } else { + reject(result.error); + } + }); + }); + return from(promise); + }) + ); + } + + public static getFromClipboard(): Observable { + return this.getExtension().pipe( + flatMap(extension => { + const promise = new Promise((resolve, reject) => { + extension.getFromClipboard(result => { + if (result.success) { + resolve(result.content); + } else { + reject(result.error); + } + }); + }); + return from(promise); + }) + ); + } + + private static getExtension(): Observable { + if (!this.extension$) { + const promise = new Promise((resolve, reject) => { + overwolf.extensions.current.getExtraObject('clipboard-plugin', result => { + if (result.success) { + resolve(result.object); + } else { + reject(result.error); + } + }); + }); + this.extension$ = from(promise).pipe( + shareReplay(1) + ); + } + return this.extension$; + } +} diff --git a/src/app/core/odk/ow-games-events-listener.ts b/src/app/core/odk/ow-games-events-listener.ts index e463038d..3b553d0b 100644 --- a/src/app/core/odk/ow-games-events-listener.ts +++ b/src/app/core/odk/ow-games-events-listener.ts @@ -45,7 +45,8 @@ export class OWGamesEventsListener { )), map(features => !!features?.length), catchError(error => { - console.error(`Could not set required features.`, this.requiredFeatures, error); + console.error(`Could not set required features: ${JSON.stringify(this.requiredFeatures)}, ` + + `error: ${error?.message ?? JSON.stringify(error)}`); return of(false); }) ); diff --git a/src/app/core/odk/ow-replay.ts b/src/app/core/odk/ow-replay.ts index c794fb9a..3e60c9eb 100644 --- a/src/app/core/odk/ow-replay.ts +++ b/src/app/core/odk/ow-replay.ts @@ -30,7 +30,6 @@ export class OWReplay { public static getHighlightsFeatures(gameId: number): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.replays.getHighlightsFeatures(gameId, result => { - console.log(result); if (result.success) { resolve(); } else { @@ -44,14 +43,12 @@ export class OWReplay { public static capture(pastDuration: number, futureDuration: number): Observable { const promise = new Promise((resolve, reject) => { overwolf.media.replays.capture(pastDuration, futureDuration, result => { - console.log('finished', result); if (result.success) { resolve(result.url); } else { reject(result.error); } }, result => { - console.log('called', result, pastDuration, futureDuration); if (!result.success) { reject(result); } diff --git a/src/app/core/odk/ow-utils.ts b/src/app/core/odk/ow-utils.ts index 5683f213..84c08c69 100644 --- a/src/app/core/odk/ow-utils.ts +++ b/src/app/core/odk/ow-utils.ts @@ -1,3 +1,4 @@ +import { APP_UID } from '@app/config'; import { from, Observable } from 'rxjs'; import { SystemInfo } from './ow-types'; @@ -6,19 +7,6 @@ export class OWUtils { overwolf.utils.sendKeyStroke(key); } - public static placeOnClipboard(content: string): void { - overwolf.utils.placeOnClipboard(content); - } - - public static getFromClipboard(): Observable { - const promise = new Promise((resolve) => { - overwolf.utils.getFromClipboard(content => { - resolve(content); - }); - }); - return from(promise); - } - public static openUrl(url: string, external: boolean): void { if (external) { return this.openUrlInDefaultBrowser(url); @@ -26,6 +14,13 @@ export class OWUtils { return this.openUrlInOverwolfBrowser(url); } + public static openSubscriptionPage(): void { + overwolf.utils.openStore({ + page: overwolf.utils.enums.eStorePage.SubscriptionPage, + uid: APP_UID + }); + } + public static openUrlInOverwolfBrowser(url: string): void { overwolf.utils.openUrlInOverwolfBrowser(url); } diff --git a/src/app/data/poe-prices/service/item-price-prediction-http.service.ts b/src/app/data/poe-prices/service/item-price-prediction-http.service.ts index 42fd9903..a2ac4f95 100644 --- a/src/app/data/poe-prices/service/item-price-prediction-http.service.ts +++ b/src/app/data/poe-prices/service/item-price-prediction-http.service.ts @@ -1,5 +1,6 @@ import { HttpClient, HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; +import { b64EncodeUnicode } from '@app/helper'; import { environment } from '@env/environment'; import { Observable, of, throwError } from 'rxjs'; import { delay, flatMap, retryWhen } from 'rxjs/operators'; @@ -19,7 +20,7 @@ export class ItemPricePredictionHttpService { } public get(leagueId: string, stringifiedItem: string): Observable { - const base64Item = btoa(stringifiedItem); + const base64Item = b64EncodeUnicode(stringifiedItem); const encodedLeagueId = encodeURIComponent(leagueId); const encodedItem = encodeURIComponent(base64Item); @@ -52,7 +53,7 @@ export class ItemPricePredictionHttpService { form.set('max', `${max}`); form.set('selector', selector); form.set('currency', currencyId); - form.set('qitem_text', btoa(stringifiedItem)); + form.set('qitem_text', b64EncodeUnicode(stringifiedItem)); form.set('debug', `${environment.production ? 0 : 1}`); form.set('source', SOURCE); diff --git a/src/app/layout/component/index.ts b/src/app/layout/component/index.ts index d9e53a35..d0737a6d 100644 --- a/src/app/layout/component/index.ts +++ b/src/app/layout/component/index.ts @@ -1,4 +1,4 @@ export * from './settings-feature-container/settings-feature-container.component'; export * from './settings-form/settings-form.component'; -export * from './settings-help/settings-help.component'; +export * from './settings-support/settings-support.component'; diff --git a/src/app/layout/component/settings-form/settings-form.component.html b/src/app/layout/component/settings-form/settings-form.component.html index 7bb3023a..50f1c379 100644 --- a/src/app/layout/component/settings-form/settings-form.component.html +++ b/src/app/layout/component/settings-form/settings-form.component.html @@ -1,6 +1,6 @@
-
+
{{'app.language' | translate}} @@ -10,7 +10,7 @@
-
+
{{'settings.league' | translate}} @@ -20,6 +20,12 @@
+
+ + {{'settings.character-name' | translate}} + + +
diff --git a/src/app/layout/component/settings-form/settings-form.component.ts b/src/app/layout/component/settings-form/settings-form.component.ts index a7346edc..3e495a46 100644 --- a/src/app/layout/component/settings-form/settings-form.component.ts +++ b/src/app/layout/component/settings-form/settings-form.component.ts @@ -13,8 +13,6 @@ import { BehaviorSubject } from 'rxjs'; changeDetection: ChangeDetectionStrategy.OnPush }) export class SettingsFormComponent implements OnInit { - private language: Language; - public languages = new EnumValues(Language); public uiLanguages = new EnumValues(UiLanguage); @@ -32,11 +30,7 @@ export class SettingsFormComponent implements OnInit { private readonly leagues: TradeLeaguesService) { } public ngOnInit(): void { - const { language } = this.settings; - if (language && this.language !== language) { - this.language = language; - this.updateLeagues(); - } + this.updateLeagues(); } public onChange(): void { @@ -49,8 +43,8 @@ export class SettingsFormComponent implements OnInit { } private updateLeagues(): void { - const { leagueId } = this.settings; - this.leagues.get(this.language).subscribe(leagues => { + const { leagueId, language } = this.settings; + this.leagues.get(language).subscribe(leagues => { const selectedLeague = leagues.find(league => league.id === leagueId); if (!selectedLeague) { this.settings.leagueId = leagues[0].id; diff --git a/src/app/layout/component/settings-help/settings-help.component.html b/src/app/layout/component/settings-help/settings-help.component.html deleted file mode 100644 index 7f28515e..00000000 --- a/src/app/layout/component/settings-help/settings-help.component.html +++ /dev/null @@ -1,28 +0,0 @@ - - {{'help.faq' | translate}} - - - - {{'help.bug-title' | translate}} - - - - - - - {{'help.donate-title' | translate}} - - - - - - - \ No newline at end of file diff --git a/src/app/layout/component/settings-help/settings-help.component.spec.ts b/src/app/layout/component/settings-help/settings-help.component.spec.ts deleted file mode 100644 index cd7eeaf0..00000000 --- a/src/app/layout/component/settings-help/settings-help.component.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { BrowserModule } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { TranslateFakeLoader, TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { MaterialModule } from '@shared/module/material/material.module'; -import { SettingsHelpComponent } from './settings-help.component'; - - -describe('SettingsHelpComponent', () => { - let component: SettingsHelpComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - MaterialModule, - BrowserAnimationsModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: () => new TranslateFakeLoader() - } - }) - ], - declarations: [SettingsHelpComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(SettingsHelpComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/layout/component/settings-help/settings-help.component.ts b/src/app/layout/component/settings-help/settings-help.component.ts deleted file mode 100644 index b4d9f921..00000000 --- a/src/app/layout/component/settings-help/settings-help.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; - -@Component({ - selector: 'app-settings-help', - templateUrl: './settings-help.component.html', - changeDetection: ChangeDetectionStrategy.OnPush -}) -export class SettingsHelpComponent { - // constructor(private readonly browser: BrowserService) { } - - public openUrl(url: string): void { - alert(url); - } -} diff --git a/src/app/layout/component/settings-support/settings-support.component.html b/src/app/layout/component/settings-support/settings-support.component.html new file mode 100644 index 00000000..afcb0866 --- /dev/null +++ b/src/app/layout/component/settings-support/settings-support.component.html @@ -0,0 +1,28 @@ +
+
+ +

{{'support.developer.text' | translate}}

+
+ +
+
+
+
+
+
+ +

{{'support.question.text' | translate}}

+
+ + +
+
+
+
\ No newline at end of file diff --git a/src/app/layout/component/settings-support/settings-support.component.scss b/src/app/layout/component/settings-support/settings-support.component.scss new file mode 100644 index 00000000..fd216ab0 --- /dev/null +++ b/src/app/layout/component/settings-support/settings-support.component.scss @@ -0,0 +1,15 @@ +@import "./../../../../styles/variables"; + +p { + color: $label-color; + font-size: 13px; + margin: 0 0 $gutter * 2 0; +} + +button { + color: $white !important; + + & + button { + margin-left: $gutter-half; + } +} diff --git a/src/app/layout/component/settings-support/settings-support.component.spec.ts b/src/app/layout/component/settings-support/settings-support.component.spec.ts new file mode 100644 index 00000000..38c8e804 --- /dev/null +++ b/src/app/layout/component/settings-support/settings-support.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SettingsSupportComponent } from './settings-support.component'; + +describe('SettingsSupportComponent', () => { + let component: SettingsSupportComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SettingsSupportComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SettingsSupportComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/layout/component/settings-support/settings-support.component.ts b/src/app/layout/component/settings-support/settings-support.component.ts new file mode 100644 index 00000000..3ce93c86 --- /dev/null +++ b/src/app/layout/component/settings-support/settings-support.component.ts @@ -0,0 +1,18 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { OWUtils } from '@app/odk/ow-utils'; + +@Component({ + selector: 'app-settings-support', + templateUrl: './settings-support.component.html', + styleUrls: ['./settings-support.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class SettingsSupportComponent { + public onOpenUrl(url: string): void { + OWUtils.openUrl(url, true); + } + + public onOpenSubscription(): void { + OWUtils.openSubscriptionPage(); + } +} diff --git a/src/app/layout/layout.module.ts b/src/app/layout/layout.module.ts index a71d9606..33a5e9ea 100644 --- a/src/app/layout/layout.module.ts +++ b/src/app/layout/layout.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { SharedModule } from '../shared/shared.module'; -import { SettingsFeatureContainerComponent, SettingsFormComponent, SettingsHelpComponent } from './component'; +import { SettingsFeatureContainerComponent, SettingsFormComponent, SettingsSupportComponent } from './component'; import { AnnotationWindowComponent, BackgroundWindowComponent, LauncherWindowComponent, NotificationWindowComponent, SettingsWindowComponent } from './window'; const WINDOWS = [ @@ -16,8 +16,8 @@ const WINDOWS = [ ...WINDOWS, SettingsFeatureContainerComponent, SettingsFormComponent, - SettingsHelpComponent, AnnotationWindowComponent, + SettingsSupportComponent, ], exports: [ ...WINDOWS diff --git a/src/app/layout/service/launcher-window.service.ts b/src/app/layout/service/launcher-window.service.ts index 43571e27..55569f33 100644 --- a/src/app/layout/service/launcher-window.service.ts +++ b/src/app/layout/service/launcher-window.service.ts @@ -26,7 +26,7 @@ export class LauncherWindowService { if (monitor) { const [x, y] = monitor.Location.split(',').map(loc => +loc.trim()); const [width, height] = monitor.Resolution.split(',').map(res => +res.trim()); - console.log('monitor', x, y, width, height); + console.log(`monitor x: ${x}, y: ${y}, w: ${width}, h: ${height}`, x, y, width, height); const left = x + (width / 2) - (WIN_WIDTH / 2); const top = y + (height / 2) - (WIN_HEIGHT / 2); diff --git a/src/app/layout/service/settings-window.service.ts b/src/app/layout/service/settings-window.service.ts index 92a56698..2966d986 100644 --- a/src/app/layout/service/settings-window.service.ts +++ b/src/app/layout/service/settings-window.service.ts @@ -7,8 +7,17 @@ import { Observable } from 'rxjs'; const WINDOW_DATA_KEY = 'SETTINGS_WINDOW_DATA'; +export enum SettingsFeature { + Evaluate = 'evaluate.name', + Inspect = 'inspect.name', + Market = 'market.name', + Replay = 'replay.name', + Trade = 'trade.name', + Support = 'support.name' +} + export interface SettingsWindowData { - activeFeature?: string; + activeFeature?: SettingsFeature; } @Injectable({ @@ -25,10 +34,13 @@ export class SettingsWindowService { return this.storage.get(WINDOW_DATA_KEY, () => new EventEmitter()); } - public toggle(activeFeature?: string): Observable { - this.data$.next({ - activeFeature - }); + public open(activeFeature?: SettingsFeature): Observable { + this.data$.next({ activeFeature }); + return this.window.restore(); + } + + public toggle(activeFeature?: SettingsFeature): Observable { + this.data$.next({ activeFeature }); return this.window.toggle(true); } diff --git a/src/app/layout/window/annotation-window/annotation-window.component.html b/src/app/layout/window/annotation-window/annotation-window.component.html index 95a1d98f..4ebca161 100644 --- a/src/app/layout/window/annotation-window/annotation-window.component.html +++ b/src/app/layout/window/annotation-window/annotation-window.component.html @@ -1,5 +1,5 @@
- +
diff --git a/src/app/layout/window/background-window/background-window.component.ts b/src/app/layout/window/background-window/background-window.component.ts index 5dfbfb81..2f4f0835 100644 --- a/src/app/layout/window/background-window/background-window.component.ts +++ b/src/app/layout/window/background-window/background-window.component.ts @@ -74,7 +74,6 @@ export class BackgroundWindowComponent implements OnInit, OnDestroy { }); }); }); - this.hotkeys.start(); this.game.start(); }); } @@ -118,11 +117,6 @@ export class BackgroundWindowComponent implements OnInit, OnDestroy { this.shouldQuit = false; this.launcherWindow.close(); - const path = info.executionPath.split('/'); - path.pop(); - const log = `${path.join('/')}/logs/Client.txt`; - this.log.start(log); - forkJoin([ this.annotationWindow.open(info.width, info.height), this.notificationWindow.open(info.width, info.height) @@ -135,6 +129,13 @@ export class BackgroundWindowComponent implements OnInit, OnDestroy { module.onInfo(info, settings); } }); + + const path = info.executionPath.split('/'); + path.pop(); + const log = `${path.join('/')}/logs/Client.txt`; + this.log.start(log); + + this.hotkeys.start(); }); if (!result) { this.notification.show('event.start-error'); @@ -246,6 +247,6 @@ export class BackgroundWindowComponent implements OnInit, OnDestroy { } public onLogError(error: string): void { - console.error('An unexpected error occured while listening to the Client.txt file.', error); + console.error(`An unexpected error occured while listening to the Client.txt file. ${error}`, error); } } diff --git a/src/app/layout/window/settings-window/settings-window.component.html b/src/app/layout/window/settings-window/settings-window.component.html index 8e977b97..8773dfd7 100644 --- a/src/app/layout/window/settings-window/settings-window.component.html +++ b/src/app/layout/window/settings-window/settings-window.component.html @@ -1,28 +1,34 @@ - -
- - -
- - -
-
- - - - {{feature.name | translate}} - - {{feature.name | translate}} - -
- - -
-
-
-
+ + + +
+ + +
+
+ + + + {{feature.name | translate}} + + {{feature.name | translate}} + +
+ + +
+
+ + + {{'support.name' | translate}} + +
+ +
+
+
\ No newline at end of file diff --git a/src/app/layout/window/settings-window/settings-window.component.scss b/src/app/layout/window/settings-window/settings-window.component.scss index 9ed81eb2..cc605cff 100644 --- a/src/app/layout/window/settings-window/settings-window.component.scss +++ b/src/app/layout/window/settings-window/settings-window.component.scss @@ -1,11 +1,7 @@ @import "../../../../styles/variables"; -.content { - padding-bottom: 36px; - - .tab-content { - padding: 12px 12px 0px 12px; - } +.tab-content { + padding: 12px; } ::ng-deep { diff --git a/src/app/layout/window/settings-window/settings-window.component.ts b/src/app/layout/window/settings-window/settings-window.component.ts index 3b0e0cca..bed37939 100644 --- a/src/app/layout/window/settings-window/settings-window.component.ts +++ b/src/app/layout/window/settings-window/settings-window.component.ts @@ -5,7 +5,7 @@ import { FeatureSettingsService } from '@app/feature/feature-settings.service'; import { BehaviorSubject, Observable, Subject, Subscription } from 'rxjs'; import { flatMap, throttleTime } from 'rxjs/operators'; import { SettingsFeatureContainerComponent } from '../../component'; -import { SettingsWindowService } from '../../service'; +import { SettingsFeature, SettingsWindowService } from '../../service'; @Component({ selector: 'app-settings-window', @@ -67,8 +67,14 @@ export class SettingsWindowComponent implements OnInit, AfterViewInit, OnDestroy } } - private updateTab(activeFeature: string): void { - const feature = this.features.findIndex(x => x.name === activeFeature); + public onSupportToggle(): void { + this.window.open(SettingsFeature.Support).subscribe(); + } + + private updateTab(activeFeature: SettingsFeature): void { + const feature = activeFeature !== SettingsFeature.Support + ? this.features.findIndex(x => x.name === activeFeature) + : this.features.length + 1; const index = feature + 1; if (index > 0) { this.selectedIndex$.next(0); diff --git a/src/app/modules/bookmarks/component/bookmarks-settings/bookmarks-settings.component.html b/src/app/modules/bookmarks/component/bookmarks-settings/bookmarks-settings.component.html index b6f10004..3494eb78 100644 --- a/src/app/modules/bookmarks/component/bookmarks-settings/bookmarks-settings.component.html +++ b/src/app/modules/bookmarks/component/bookmarks-settings/bookmarks-settings.component.html @@ -1,6 +1,6 @@
- +
@@ -26,6 +26,6 @@
-
+
\ No newline at end of file diff --git a/src/app/modules/commands/commands.module.ts b/src/app/modules/commands/commands.module.ts index 9bf251c2..47032409 100644 --- a/src/app/modules/commands/commands.module.ts +++ b/src/app/modules/commands/commands.module.ts @@ -81,8 +81,8 @@ export class CommandsModule implements FeatureModule { const index = +hotkey.replace('command', ''); const { text } = settings.commands[index - 1]; if (text?.length) { - this.command.execute(text).subscribe(() => { }, error => { - console.warn(`Could not execute command.`, error, text); + this.command.execute(text, settings).subscribe(() => { }, error => { + console.warn(`Could not execute command: ${text}, ${error?.message ?? JSON.stringify(error)}`, error, text); this.notification.show('commands.execute-error'); }); } diff --git a/src/app/modules/commands/component/commands-settings/commands-settings.component.html b/src/app/modules/commands/component/commands-settings/commands-settings.component.html index 4d2c268c..9fcbf895 100644 --- a/src/app/modules/commands/component/commands-settings/commands-settings.component.html +++ b/src/app/modules/commands/component/commands-settings/commands-settings.component.html @@ -1,6 +1,6 @@
- +
@@ -18,6 +18,6 @@
-
+
\ No newline at end of file diff --git a/src/app/modules/commands/service/command.service.ts b/src/app/modules/commands/service/command.service.ts index 6d7e2837..853a1b09 100644 --- a/src/app/modules/commands/service/command.service.ts +++ b/src/app/modules/commands/service/command.service.ts @@ -1,8 +1,9 @@ import { Injectable } from '@angular/core'; import { ChatService } from '@shared/module/poe/chat'; import { EventService } from '@shared/module/poe/event'; -import { Observable } from 'rxjs'; -import { map, tap } from 'rxjs/operators'; +import { Observable, of, throwError } from 'rxjs'; +import { flatMap } from 'rxjs/operators'; +import { CommandsFeatureSettings } from '../commands-feature-settings'; @Injectable({ providedIn: 'root' @@ -13,16 +14,26 @@ export class CommandService { private readonly chat: ChatService, private readonly event: EventService) { } - public execute(command: string): Observable { - // TODO: Error handling - return this.event.getCharacter().pipe( - tap(character => { - if (character?.name.length) { - command = command.replace('@char', character.name); - } - this.chat.send(command); - }), - map(() => null) - ); + public execute(command: string, settings: CommandsFeatureSettings): Observable { + if (command.includes('@char')) { + return this.event.getCharacter().pipe( + flatMap(character => { + if (character?.name?.length) { + command = command.replace('@char', character.name); + } else { + if (settings.characterName?.length) { + command = command.replace('@char', settings.characterName); + } else { + return throwError('character name was not set.'); + } + } + this.chat.send(command); + return of(null); + }) + ); + } else { + this.chat.send(command); + return of(null); + } } } diff --git a/src/app/modules/evaluate/component/evaluate-settings/evaluate-settings.component.html b/src/app/modules/evaluate/component/evaluate-settings/evaluate-settings.component.html index 8542e439..36731e06 100644 --- a/src/app/modules/evaluate/component/evaluate-settings/evaluate-settings.component.html +++ b/src/app/modules/evaluate/component/evaluate-settings/evaluate-settings.component.html @@ -71,7 +71,7 @@
-
+
{{'evaluate.item-search.query.initial' | translate}} @@ -111,12 +111,12 @@
- + + {{'evaluate.item-search.filter.name' | translate}}
- + - + {{'evaluate.item-search.property.name' | translate}}
-
+ - + {{'evaluate.item-search.stat.name' | translate}}
--> - -
- +
+ \ No newline at end of file diff --git a/src/app/modules/evaluate/window/evaluate-window/evaluate-window.component.html b/src/app/modules/evaluate/window/evaluate-window/evaluate-window.component.html index 2ee0940e..5ad20550 100644 --- a/src/app/modules/evaluate/window/evaluate-window/evaluate-window.component.html +++ b/src/app/modules/evaluate/window/evaluate-window/evaluate-window.component.html @@ -1,5 +1,5 @@
- + diff --git a/src/app/modules/evaluate/window/evaluate-window/evaluate-window.component.ts b/src/app/modules/evaluate/window/evaluate-window/evaluate-window.component.ts index 6f2d8902..716f9407 100644 --- a/src/app/modules/evaluate/window/evaluate-window/evaluate-window.component.ts +++ b/src/app/modules/evaluate/window/evaluate-window/evaluate-window.component.ts @@ -2,12 +2,12 @@ import { ChangeDetectionStrategy, Component, HostListener, NgZone, OnDestroy, On import { EventSubscription } from '@app/event'; import { NotificationService } from '@app/notification'; import { OWGames } from '@app/odk'; -import { SettingsWindowService } from '@layout/service'; +import { SettingsFeature, SettingsWindowService } from '@layout/service'; import { EvaluateSelectEvent } from '@modules/evaluate/class'; import { EvaluateWindowData, EvaluateWindowService } from '@modules/evaluate/service'; import { StashPriceTagType, StashService } from '@shared/module/poe/stash'; import { BehaviorSubject, Subject, Subscription } from 'rxjs'; -import { buffer, debounceTime, filter } from 'rxjs/operators'; +import { buffer, debounceTime, filter, flatMap } from 'rxjs/operators'; const DISPOSE_TIMEOUT = 1000 * 15; @@ -54,7 +54,15 @@ export class EvaluateWindowComponent implements OnInit, OnDestroy { } public onToggleSettings(): void { - this.settings.toggle('evaluate.name').subscribe(); + this.settings.toggle(SettingsFeature.Evaluate).subscribe(); + } + + public onEvaluateSelect(event: EvaluateSelectEvent): void { + this.selectQueue.next(event); + } + + public onSupportToggle(): void { + this.settings.toggle(SettingsFeature.Support).subscribe(); } private onMouseUp = (event: overwolf.games.inputTracking.MouseEvent): void => { @@ -63,10 +71,6 @@ export class EvaluateWindowComponent implements OnInit, OnDestroy { } } - public onEvaluateSelect(event: EvaluateSelectEvent): void { - this.selectQueue.next(event); - } - private dispose(): void { this.removeEvents(); this.removeSubscription(); @@ -84,17 +88,17 @@ export class EvaluateWindowComponent implements OnInit, OnDestroy { buffer(this.selectQueue.pipe( debounceTime(250) )), - filter(events => events.length > 0) - ).subscribe(([event, double]) => { - const { amount, currency, count } = event; - const type = double ? StashPriceTagType.Negotiable : StashPriceTagType.Exact; - this.notification.show(double ? 'evaluate.tag.negotiable' : 'evaluate.tag.exact'); - this.stash.copyPrice({ - amount, currency, - count, type - }); - this.reset(); - }); + filter(events => events.length > 0), + flatMap(([event, double]) => { + const { amount, currency, count } = event; + const type = double ? StashPriceTagType.Negotiable : StashPriceTagType.Exact; + this.notification.show(double ? 'evaluate.tag.negotiable' : 'evaluate.tag.exact'); + return this.stash.copyPrice({ + amount, currency, + count, type + }); + }) + ).subscribe(() => this.reset()); } private unregisterQueue(): void { diff --git a/src/app/modules/inspect/component/inspect-item/inspect-item.component.ts b/src/app/modules/inspect/component/inspect-item/inspect-item.component.ts index ebe42861..1d04be25 100644 --- a/src/app/modules/inspect/component/inspect-item/inspect-item.component.ts +++ b/src/app/modules/inspect/component/inspect-item/inspect-item.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; +import { InspectFeatureSettings } from '@modules/inspect/inspect-feature-settings'; import { Item } from '@shared/module/poe/item'; import { WikiMapService } from '@shared/module/poe/wiki'; -import { InspectFeatureSettings } from '@modules/inspect/inspect-feature-settings'; @Component({ selector: 'app-inspect-item', @@ -10,7 +10,10 @@ import { InspectFeatureSettings } from '@modules/inspect/inspect-feature-setting changeDetection: ChangeDetectionStrategy.OnPush }) export class InspectItemComponent implements OnInit { - public properties = []; + public properties = [ + 'weaponCriticalStrikeChance', + 'weaponAttacksPerSecond' + ]; public maps: string[]; @Input() diff --git a/src/app/modules/inspect/window/inspect-window/inspect-window.component.html b/src/app/modules/inspect/window/inspect-window/inspect-window.component.html index fc0a33a9..c21fbedd 100644 --- a/src/app/modules/inspect/window/inspect-window/inspect-window.component.html +++ b/src/app/modules/inspect/window/inspect-window/inspect-window.component.html @@ -1,5 +1,5 @@
- + diff --git a/src/app/modules/inspect/window/inspect-window/inspect-window.component.ts b/src/app/modules/inspect/window/inspect-window/inspect-window.component.ts index 8f6f0ef0..db40335c 100644 --- a/src/app/modules/inspect/window/inspect-window/inspect-window.component.ts +++ b/src/app/modules/inspect/window/inspect-window/inspect-window.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, HostListener, NgZone, OnDestroy, OnInit } from '@angular/core'; import { EventSubscription } from '@app/event'; import { OWGames } from '@app/odk'; -import { SettingsWindowService } from '@layout/service'; +import { SettingsFeature, SettingsWindowService } from '@layout/service'; import { InspectWindowData, InspectWindowService } from '@modules/inspect/service'; import { BehaviorSubject, Subscription } from 'rxjs'; import { debounceTime, filter } from 'rxjs/operators'; @@ -46,7 +46,11 @@ export class InspectWindowComponent implements OnInit, OnDestroy { } public onToggleSettings(): void { - this.settings.toggle('inspect.name').subscribe(); + this.settings.toggle(SettingsFeature.Inspect).subscribe(); + } + + public onSupportToggle(): void { + this.settings.toggle(SettingsFeature.Support).subscribe(); } private onMouseUp = (event: overwolf.games.inputTracking.MouseEvent): void => { diff --git a/src/app/modules/market/component/market-exchange-bar/market-exchange-bar.component.html b/src/app/modules/market/component/market-exchange-bar/market-exchange-bar.component.html index 9c6a0599..53def1dd 100644 --- a/src/app/modules/market/component/market-exchange-bar/market-exchange-bar.component.html +++ b/src/app/modules/market/component/market-exchange-bar/market-exchange-bar.component.html @@ -1,10 +1,23 @@
- - + + +
+
+ {{record | tradeExchangeText}} +
+
+
\ No newline at end of file diff --git a/src/app/modules/market/component/market-exchange-bar/market-exchange-bar.component.scss b/src/app/modules/market/component/market-exchange-bar/market-exchange-bar.component.scss index c7f8fbff..dd3256d6 100644 --- a/src/app/modules/market/component/market-exchange-bar/market-exchange-bar.component.scss +++ b/src/app/modules/market/component/market-exchange-bar/market-exchange-bar.component.scss @@ -14,3 +14,22 @@ } } } + +.records { + position: absolute; + z-index: 2000; + top: 35px; + left: 0; + right: 0; + background: $black; + border: 1px solid $brown; +} + +.record { + padding: $gutter $gutter * 2; + cursor: pointer; + + &:hover { + background: $light-brown; + } +} diff --git a/src/app/modules/market/component/market-exchange-bar/market-exchange-bar.component.ts b/src/app/modules/market/component/market-exchange-bar/market-exchange-bar.component.ts index 5b9d65d8..c629144d 100644 --- a/src/app/modules/market/component/market-exchange-bar/market-exchange-bar.component.ts +++ b/src/app/modules/market/component/market-exchange-bar/market-exchange-bar.component.ts @@ -1,4 +1,6 @@ -import { ChangeDetectionStrategy, Component, EventEmitter, Output } from '@angular/core'; +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; +import { TradeExchangeRequest } from '@shared/module/poe/trade/exchange'; +import { BehaviorSubject } from 'rxjs'; @Component({ selector: 'app-market-exchange-bar', @@ -9,11 +11,17 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Output } from '@angul export class MarketExchangeBarComponent { private toggled = false; + public records$ = new BehaviorSubject([]); + public recordsVisible$ = new BehaviorSubject(false); + + @Input() + public request: TradeExchangeRequest; + @Output() - public highlight = new EventEmitter(); + public requestChange = new EventEmitter(); @Output() - public clear = new EventEmitter(); + public highlight = new EventEmitter(); @Output() public toggle = new EventEmitter(); @@ -25,8 +33,13 @@ export class MarketExchangeBarComponent { this.highlight.next((input.value || '').toLowerCase()); } - public onClearClick(): void { - this.clear.next(); + public onResetClick(request?: TradeExchangeRequest): void { + this.recordsVisible$.next(false); + if (request) { + this.requestChange.next(JSON.parse(JSON.stringify(request))); + } else { + this.requestChange.next(); + } } public onToggleClick(): void { @@ -35,6 +48,15 @@ export class MarketExchangeBarComponent { } public onSearch(): void { + this.recordsVisible$.next(false); + const { value } = this.records$; + const hash = JSON.stringify(this.request); + const records = value.filter(request => JSON.stringify(request) !== hash); + records.unshift(JSON.parse(JSON.stringify(this.request))); + if (records.length > 10) { + records.pop(); + } + this.records$.next(records); this.search.next(); } } diff --git a/src/app/modules/market/component/market-exchange-price/market-exchange-price.component.html b/src/app/modules/market/component/market-exchange-price/market-exchange-price.component.html index 22178009..fcce375d 100644 --- a/src/app/modules/market/component/market-exchange-price/market-exchange-price.component.html +++ b/src/app/modules/market/component/market-exchange-price/market-exchange-price.component.html @@ -46,8 +46,8 @@
- -
\ No newline at end of file diff --git a/src/app/modules/market/component/market-exchange-price/market-exchange-price.component.scss b/src/app/modules/market/component/market-exchange-price/market-exchange-price.component.scss index 35449078..a50eeabe 100644 --- a/src/app/modules/market/component/market-exchange-price/market-exchange-price.component.scss +++ b/src/app/modules/market/component/market-exchange-price/market-exchange-price.component.scss @@ -2,8 +2,6 @@ ::ng-deep { app-market-exchange-price { - display: flex; - &:nth-child(even) { > .item, > .values, @@ -19,6 +17,20 @@ } } +:host { + display: flex; + opacity: 1; + transition: all 0.2s ease-in; + + &.whispered { + opacity: 0.3; + } + + &:hover { + opacity: 1; + } +} + .item, .values, .actions { @@ -81,12 +93,6 @@ position: relative; color: $purple; - .status { - position: absolute; - top: $gutter-half; - right: $gutter-half; - } - button { min-width: auto; } diff --git a/src/app/modules/market/component/market-exchange-price/market-exchange-price.component.ts b/src/app/modules/market/component/market-exchange-price/market-exchange-price.component.ts index b187c697..233f78a7 100644 --- a/src/app/modules/market/component/market-exchange-price/market-exchange-price.component.ts +++ b/src/app/modules/market/component/market-exchange-price/market-exchange-price.component.ts @@ -1,7 +1,7 @@ -import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, OnInit, Output } from '@angular/core'; import { TradeFetchListingPrice } from '@shared/module/poe/trade'; -export interface SendEvent { +export interface WhisperEvent { itemAmount: number; valueAmount: number; } @@ -17,14 +17,20 @@ export class MarketExchangePriceComponent implements OnInit { public min: number; public value: number; + @HostBinding('class.whispered') + public whispered = false; + @Input() public status: string; + @Input() + public seller: string; + @Input() public price: TradeFetchListingPrice; @Output() - public send = new EventEmitter(); + public whisper = new EventEmitter(); public ngOnInit(): void { this.min = 1; @@ -32,8 +38,9 @@ export class MarketExchangePriceComponent implements OnInit { this.value = 1; } - public onSend(itemAmount: number, valueAmount: number): void { - this.send.next({ + public onWhisper(itemAmount: number, valueAmount: number): void { + this.whispered = true; + this.whisper.next({ itemAmount, valueAmount }); diff --git a/src/app/modules/market/component/market-exchange/market-exchange.component.html b/src/app/modules/market/component/market-exchange/market-exchange.component.html index 075fe795..476eab9c 100644 --- a/src/app/modules/market/component/market-exchange/market-exchange.component.html +++ b/src/app/modules/market/component/market-exchange/market-exchange.component.html @@ -1,5 +1,5 @@ - +
@@ -12,8 +12,9 @@
- + + diff --git a/src/app/modules/market/component/market-exchange/market-exchange.component.ts b/src/app/modules/market/component/market-exchange/market-exchange.component.ts index be09c90f..2100c42f 100644 --- a/src/app/modules/market/component/market-exchange/market-exchange.component.ts +++ b/src/app/modules/market/component/market-exchange/market-exchange.component.ts @@ -4,7 +4,7 @@ import { TradeFetchResultEntry, TradeFetchService } from '@shared/module/poe/tra import { TradeExchangeRequest, TradeExchangeResponse, TradeExchangeService } from '@shared/module/poe/trade/exchange'; import { BehaviorSubject, Observable, of, Subject } from 'rxjs'; import { catchError, flatMap, map, switchMap, takeUntil, tap } from 'rxjs/operators'; -import { SendEvent } from '../market-exchange-price/market-exchange-price.component'; +import { WhisperEvent } from '../market-exchange-price/market-exchange-price.component'; const DEFAULT_REQUEST = () => { const request: TradeExchangeRequest = { @@ -93,13 +93,13 @@ export class MarketExchangeComponent implements OnInit, OnDestroy { this.page$.next(this.page$.value + 1); } - public onClear(): void { - this.request = DEFAULT_REQUEST(); + public onRequestChange(request?: TradeExchangeRequest): void { + this.request = request || DEFAULT_REQUEST(); this.initSearch(); this.clear(); } - public onSend(whisper: string, event: SendEvent): void { + public onWhisper(whisper: string, event: WhisperEvent): void { let copy = whisper.slice(); copy = copy.replace('{0}', `${event.itemAmount}`); copy = copy.replace('{1}', `${event.valueAmount}`); diff --git a/src/app/modules/market/component/market-item-search-bar/market-item-search-bar.component.html b/src/app/modules/market/component/market-item-search-bar/market-item-search-bar.component.html index 03e70d43..7075e5d9 100644 --- a/src/app/modules/market/component/market-item-search-bar/market-item-search-bar.component.html +++ b/src/app/modules/market/component/market-item-search-bar/market-item-search-bar.component.html @@ -1,17 +1,33 @@
- - - - -
+ + +
+
+ {{record | tradeSearchText}} +
- +
+ + + +
+
+
+
\ No newline at end of file diff --git a/src/app/modules/market/component/market-item-search-bar/market-item-search-bar.component.scss b/src/app/modules/market/component/market-item-search-bar/market-item-search-bar.component.scss index b94c9291..c17f3dfb 100644 --- a/src/app/modules/market/component/market-item-search-bar/market-item-search-bar.component.scss +++ b/src/app/modules/market/component/market-item-search-bar/market-item-search-bar.component.scss @@ -29,7 +29,8 @@ left: 0; right: 0; height: 240px; - background: $black-transparent; + min-height: 30px; + background: $black; border: 1px solid $brown; &.shown { @@ -54,3 +55,22 @@ } } } + +.records { + position: absolute; + z-index: 2000; + top: 35px; + left: 0; + right: 0; + background: $black; + border: 1px solid $brown; +} + +.record { + padding: $gutter $gutter * 2; + cursor: pointer; + + &:hover { + background: $light-brown; + } +} diff --git a/src/app/modules/market/component/market-item-search-bar/market-item-search-bar.component.ts b/src/app/modules/market/component/market-item-search-bar/market-item-search-bar.component.ts index 46f85719..6c220b98 100644 --- a/src/app/modules/market/component/market-item-search-bar/market-item-search-bar.component.ts +++ b/src/app/modules/market/component/market-item-search-bar/market-item-search-bar.component.ts @@ -16,8 +16,13 @@ interface MarektItemSearchEntry { changeDetection: ChangeDetectionStrategy.OnPush }) export class MarketItemSearchBarComponent implements OnInit { + private _request: TradeSearchRequest; + public entries$: Observable; + public records$ = new BehaviorSubject([]); + public recordsVisible$ = new BehaviorSubject(false); + public toggle$ = new BehaviorSubject(false); public inputValue$ = new BehaviorSubject(''); public filterVisible$ = new BehaviorSubject(false); @@ -25,17 +30,24 @@ export class MarketItemSearchBarComponent implements OnInit { @ViewChild('input', { static: true }) public ref: ElementRef; + public get request(): TradeSearchRequest { + return this._request; + } + @Input() - public request: TradeSearchRequest; + public set request(request: TradeSearchRequest) { + this._request = request; + this.update(); + } @Output() - public search = new EventEmitter(); + public requestChange = new EventEmitter(); @Output() - public toggle = new EventEmitter(); + public search = new EventEmitter(); @Output() - public clear = new EventEmitter(); + public toggle = new EventEmitter(); constructor(private readonly items: TradeItemsService) { } @@ -44,6 +56,15 @@ export class MarketItemSearchBarComponent implements OnInit { } public onSearch(): void { + this.recordsVisible$.next(false); + const { value } = this.records$; + const hash = JSON.stringify(this.request); + const records = value.filter(request => JSON.stringify(request) !== hash); + records.unshift(JSON.parse(JSON.stringify(this.request))); + if (records.length > 10) { + records.pop(); + } + this.records$.next(records); this.search.next(); } @@ -52,22 +73,23 @@ export class MarketItemSearchBarComponent implements OnInit { this.toggle.next(this.toggle$.value); } - public onClearClick(): void { - // TODO: fill value based on request - this.ref.nativeElement.value = ''; - this.clear.next(); + public onResetClick(request?: TradeSearchRequest): void { + this.recordsVisible$.next(false); + if (request) { + this.requestChange.next(JSON.parse(JSON.stringify(request))); + } else { + this.requestChange.next(); + } } public onItemClick(item: TradeItem): void { - if (item) { - this.updateRequest(item); - this.ref.nativeElement.value = item.text; - } + this.filterVisible$.next(false); + this.updateRequest(item); } public onKeyup(): void { - this.updateRequest(null); - this.inputValue$.next(this.ref.nativeElement.value || ''); + this.resetRequest(); + this.setViewValue(this.ref.nativeElement.value || ''); } public onFocus(): void { @@ -76,16 +98,18 @@ export class MarketItemSearchBarComponent implements OnInit { public onBlur(event: FocusEvent): void { event.preventDefault(); - this.updateRequest(null); - this.ref.nativeElement.value = ''; - + this.resetRequest(); setTimeout(() => { - this.inputValue$.next(this.ref.nativeElement.value); this.filterVisible$.next(false); - this.ref.nativeElement.blur(); + this.update(); }, 200); } + private resetRequest(): void { + delete this.request.query.name; + delete this.request.query.type; + } + private updateRequest(item: TradeItem): void { if (item?.type?.length) { this.request.query.type = item.type; @@ -97,6 +121,41 @@ export class MarketItemSearchBarComponent implements OnInit { } else { delete this.request.query.name; } + this.update(); + } + + private update(): void { + const { type, name } = this.request.query; + const hasType = type?.length; + const hasName = name?.length; + if (hasType || hasName) { + this.items.get().subscribe(items => { + let found = false; + for (const group of items) { + for (const item of group.items) { + if (((hasType && item.type === type) || (!hasType && !item.type)) && + ((hasName && item.name === name) || (!hasName && !item.name))) { + found = true; + this.setViewValue(item.text); + break; + } + } + if (found) { + break; + } + } + if (!found) { + this.updateRequest(null); + } + }); + } else { + this.setViewValue(''); + } + } + + private setViewValue(value: string): void { + this.ref.nativeElement.value = value; + this.inputValue$.next(this.ref.nativeElement.value); } private loadEntries(): void { diff --git a/src/app/modules/market/component/market-item-search-filter-type/market-item-search-filter-type.component.html b/src/app/modules/market/component/market-item-search-filter-type/market-item-search-filter-type.component.html index c3b3403d..cfcde251 100644 --- a/src/app/modules/market/component/market-item-search-filter-type/market-item-search-filter-type.component.html +++ b/src/app/modules/market/component/market-item-search-filter-type/market-item-search-filter-type.component.html @@ -12,13 +12,13 @@ - + - + diff --git a/src/app/modules/market/component/market-item-search-result/market-item-search-result.component.html b/src/app/modules/market/component/market-item-search-result/market-item-search-result.component.html new file mode 100644 index 00000000..b820e665 --- /dev/null +++ b/src/app/modules/market/component/market-item-search-result/market-item-search-result.component.html @@ -0,0 +1,18 @@ +
+ +
+
+ + +
+
+ + +
+
+
+ +
+
\ No newline at end of file diff --git a/src/app/modules/market/component/market-item-search-result/market-item-search-result.component.scss b/src/app/modules/market/component/market-item-search-result/market-item-search-result.component.scss new file mode 100644 index 00000000..76a84a69 --- /dev/null +++ b/src/app/modules/market/component/market-item-search-result/market-item-search-result.component.scss @@ -0,0 +1,69 @@ +@import "../../../../../styles/variables"; + +::ng-deep { + app-market-item-search-result { + app-item-frame { + display: block; + height: 100%; + + .frame { + width: 100%; + height: 100%; + + .detail { + white-space: inherit !important; + min-width: auto !important; + } + } + } + } +} + +:host { + display: flex; + flex-grow: 1; + opacity: 1; + transition: all 0.2s ease-in; + + &.whispered { + opacity: 0.3; + } + + &:hover { + opacity: 1; + } +} + +.item, +.listing { + display: flex; + flex-grow: 1; + flex-direction: column; +} + +.item { + width: 100%; +} + +.listing { + position: relative; + background: $black-transparent; + width: 120px - 22px - $gutter-half * 2; + align-items: center; + justify-content: center; + margin: 0 $gutter-half; + min-height: 100px; + + > div { + display: flex; + flex-direction: row; + + &.spacer { + flex-grow: 1; + } + + &.actions { + color: $purple; + } + } +} diff --git a/src/app/modules/market/component/market-item-search-result/market-item-search-result.component.spec.ts b/src/app/modules/market/component/market-item-search-result/market-item-search-result.component.spec.ts new file mode 100644 index 00000000..4b744e05 --- /dev/null +++ b/src/app/modules/market/component/market-item-search-result/market-item-search-result.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MarketItemSearchResultComponent } from './market-item-search-result.component'; + +describe('MarketItemSearchResultComponent', () => { + let component: MarketItemSearchResultComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MarketItemSearchResultComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MarketItemSearchResultComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/modules/market/component/market-item-search-result/market-item-search-result.component.ts b/src/app/modules/market/component/market-item-search-result/market-item-search-result.component.ts new file mode 100644 index 00000000..5eb5c41d --- /dev/null +++ b/src/app/modules/market/component/market-item-search-result/market-item-search-result.component.ts @@ -0,0 +1,24 @@ +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, HostBinding } from '@angular/core'; +import { TradeFetchResultEntry } from '@shared/module/poe/trade'; + +@Component({ + selector: 'app-market-item-search-result', + templateUrl: './market-item-search-result.component.html', + styleUrls: ['./market-item-search-result.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class MarketItemSearchResultComponent { + @HostBinding('class.whispered') + public whispered = false; + + @Input() + public entry: TradeFetchResultEntry; + + @Output() + public whisper = new EventEmitter(); + + public onWhisper(): void { + this.whispered = true; + this.whisper.next(this.entry.listing.whisper); + } +} diff --git a/src/app/modules/market/component/market-item-search/market-item-search.component.html b/src/app/modules/market/component/market-item-search/market-item-search.component.html index 4ec4104a..1c261826 100644 --- a/src/app/modules/market/component/market-item-search/market-item-search.component.html +++ b/src/app/modules/market/component/market-item-search/market-item-search.component.html @@ -1,4 +1,5 @@ - +
@@ -13,25 +14,8 @@
-
- -
-
- - -
-
- - -
-
-
- -
-
+ +
diff --git a/src/app/modules/market/component/market-item-search/market-item-search.component.scss b/src/app/modules/market/component/market-item-search/market-item-search.component.scss index 6efeba34..ab5a7861 100644 --- a/src/app/modules/market/component/market-item-search/market-item-search.component.scss +++ b/src/app/modules/market/component/market-item-search/market-item-search.component.scss @@ -1,24 +1,5 @@ @import "../../../../../styles/variables"; -::ng-deep { - app-market-item-search { - app-item-frame { - display: block; - height: 100%; - - .frame { - width: 100%; - height: 100%; - - .detail { - white-space: inherit !important; - min-width: auto !important; - } - } - } - } -} - .error, .count { margin: 0 $gutter-half $gutter-half 0; @@ -52,44 +33,4 @@ margin-top: $gutter-half; margin-bottom: 0; } -} - -.item, -.listing { - display: flex; - flex-grow: 1; - flex-direction: column; -} - -.item { - width: 100%; -} - -.listing { - position: relative; - background: $black-transparent; - width: 120px - 22px - $gutter-half * 2; - align-items: center; - justify-content: center; - margin: 0 $gutter-half; - min-height: 100px; - - > .status { - position: absolute; - top: $gutter-half; - right: $gutter-half; - } - - > div { - display: flex; - flex-direction: row; - - &.spacer { - flex-grow: 1; - } - - &.actions { - color: $purple; - } - } -} +} \ No newline at end of file diff --git a/src/app/modules/market/component/market-item-search/market-item-search.component.ts b/src/app/modules/market/component/market-item-search/market-item-search.component.ts index e0e032f6..4552f876 100644 --- a/src/app/modules/market/component/market-item-search/market-item-search.component.ts +++ b/src/app/modules/market/component/market-item-search/market-item-search.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, Component, EventEmitter, OnDestroy, OnInit, Output, TemplateRef, ViewChild } from '@angular/core'; import { ChatService } from '@shared/module/poe/chat'; -import { TradeFetchEntryListing, TradeFetchResultEntry, TradeFetchService, TradeSearchRequest, TradeSearchResponse, TradeSearchService } from '@shared/module/poe/trade'; +import { TradeFetchResultEntry, TradeFetchService, TradeSearchRequest, TradeSearchResponse, TradeSearchService } from '@shared/module/poe/trade'; import { BehaviorSubject, Observable, of, Subject } from 'rxjs'; import { catchError, flatMap, map, switchMap, takeUntil, tap } from 'rxjs/operators'; @@ -100,14 +100,14 @@ export class MarketItemSearchComponent implements OnInit, OnDestroy { this.page$.next(this.page$.value + 1); } - public onClear(): void { - this.request = DEFAULT_REQUEST(); + public onRequestChange(request?: TradeSearchRequest): void { + this.request = request || DEFAULT_REQUEST(); this.initSearch(); this.clear(); } - public onSend(listing: TradeFetchEntryListing): void { - this.chat.send(listing.whisper); + public onWhisper(whisper: string): void { + this.chat.send(whisper); } private clear(): void { diff --git a/src/app/modules/market/component/market-listing-status/market-listing-status.component.html b/src/app/modules/market/component/market-listing-status/market-listing-status.component.html index d3c5470b..e0f264b5 100644 --- a/src/app/modules/market/component/market-listing-status/market-listing-status.component.html +++ b/src/app/modules/market/component/market-listing-status/market-listing-status.component.html @@ -1 +1,2 @@ -
\ No newline at end of file +
{{seller | truncateText: 10}}
+
\ No newline at end of file diff --git a/src/app/modules/market/component/market-listing-status/market-listing-status.component.scss b/src/app/modules/market/component/market-listing-status/market-listing-status.component.scss index 62d8a4b1..5a6cce7b 100644 --- a/src/app/modules/market/component/market-listing-status/market-listing-status.component.scss +++ b/src/app/modules/market/component/market-listing-status/market-listing-status.component.scss @@ -1,9 +1,29 @@ +@import "../../../../../styles/variables"; + $afk: #f1c40f; $online: #27ae60; $offline: #2c3e50; $size: 12px; -div { +:host, +.seller, +.dot { + display: flex; +} + +:host { + width: 100%; + padding: $gutter-half $gutter-half 0 $gutter-half; +} + +.seller { + color: $light-dark-grey; + font-size: 12px; + width: 60px; + overflow: hidden; +} + +.dot { width: $size; height: $size; border-radius: 50%; diff --git a/src/app/modules/market/component/market-listing-status/market-listing-status.component.ts b/src/app/modules/market/component/market-listing-status/market-listing-status.component.ts index be844fa4..97911830 100644 --- a/src/app/modules/market/component/market-listing-status/market-listing-status.component.ts +++ b/src/app/modules/market/component/market-listing-status/market-listing-status.component.ts @@ -7,6 +7,9 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; changeDetection: ChangeDetectionStrategy.OnPush }) export class MarketListingStatusComponent { + @Input() + public seller: string; + @Input() public status: string; } diff --git a/src/app/modules/market/market.module.ts b/src/app/modules/market/market.module.ts index b9a9a259..4a8b28dc 100644 --- a/src/app/modules/market/market.module.ts +++ b/src/app/modules/market/market.module.ts @@ -6,6 +6,7 @@ import { MarketExchangeBarComponent, MarketExchangeComponent, MarketExchangeFilt import { MarketFeatureSettings } from './market-feature-settings'; import { MarketWindowService } from './service'; import { MarketWindowComponent } from './window'; +import { MarketItemSearchResultComponent } from './component/market-item-search-result/market-item-search-result.component'; @NgModule({ providers: [{ provide: FEATURE_MODULES, useClass: MarketModule, multi: true }], @@ -45,6 +46,7 @@ import { MarketWindowComponent } from './window'; MarketExchangePriceComponent, MarketExchangeFilterComponent, MarketExchangeFilterItemComponent, + MarketItemSearchResultComponent, ], exports: [MarketWindowComponent], imports: [SharedModule] diff --git a/src/app/modules/market/window/market-window/market-window.component.ts b/src/app/modules/market/window/market-window/market-window.component.ts index c0870bea..09ff31f3 100644 --- a/src/app/modules/market/window/market-window/market-window.component.ts +++ b/src/app/modules/market/window/market-window/market-window.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, HostBinding, HostListener } from '@angular/core'; -import { SettingsWindowService } from '@layout/service'; +import { SettingsFeature, SettingsWindowService } from '@layout/service'; import { MarketWindowService } from '@modules/market/service'; @Component({ @@ -30,6 +30,6 @@ export class MarketWindowComponent { } public onToggleSettings(): void { - this.settings.toggle('market.name').subscribe(); + this.settings.toggle(SettingsFeature.Market).subscribe(); } } diff --git a/src/app/modules/replay/component/replay-settings/replay-settings.component.html b/src/app/modules/replay/component/replay-settings/replay-settings.component.html index fc3d6c12..3a467921 100644 --- a/src/app/modules/replay/component/replay-settings/replay-settings.component.html +++ b/src/app/modules/replay/component/replay-settings/replay-settings.component.html @@ -1,3 +1,51 @@ + +
+
+ + {{'replay.capture' | translate}} + +
+
+
+
+ + {{'app.hotkey' | translate}} + + + keyboard + + +
+
+
+
+
+ +
+ + +
+
+
+
+
+ +
+ + +
+
+
+
+
+
diff --git a/src/app/modules/replay/replay-feature-settings.ts b/src/app/modules/replay/replay-feature-settings.ts index 0e68ea88..56acbe4e 100644 --- a/src/app/modules/replay/replay-feature-settings.ts +++ b/src/app/modules/replay/replay-feature-settings.ts @@ -1,6 +1,9 @@ import { FeatureSettings } from '@app/feature'; export interface ReplayFeatureSettings extends FeatureSettings { + replayCaptureManually?: boolean; + replayCaptureManuallyPastDuration?: number; + replayCaptureManuallyFutureDuration?: number; replayCaptureDeath?: boolean; replayCaptureDeathPastDuration?: number; replayCaptureDeathFutureDuration?: number; diff --git a/src/app/modules/replay/replay.module.ts b/src/app/modules/replay/replay.module.ts index ece922d1..022710c1 100644 --- a/src/app/modules/replay/replay.module.ts +++ b/src/app/modules/replay/replay.module.ts @@ -1,4 +1,5 @@ import { NgModule } from '@angular/core'; +import { Hotkey } from '@app/config'; import { Feature, FeatureConfig, FeatureModule, FEATURE_MODULES } from '@app/feature'; import { NotificationService } from '@app/notification'; import { GameEvent, RunningGameInfo } from '@app/odk'; @@ -35,25 +36,46 @@ export class ReplayModule implements FeatureModule { replayCaptureDeathPastDuration: 8, replayCaptureKill: false, replayCaptureKillFutureDuration: 3, - replayCaptureKillPastDuration: 5 + replayCaptureKillPastDuration: 5, + replayCaptureManually: false, + replayCaptureManuallyFutureDuration: 0, + replayCaptureManuallyPastDuration: 10, } }; return config; } public getFeatures(): Feature[] { - const features: Feature[] = []; + const features: Feature[] = [ + { hotkey: Hotkey.ReplayManually } + ]; return features; } public onSettingsChange(settings: ReplayFeatureSettings): void { - const shouldCapture = settings.replayCaptureDeath || settings.replayCaptureKill; + const shouldCapture = settings.replayCaptureManually || settings.replayCaptureDeath || settings.replayCaptureKill; if (shouldCapture !== this.shouldCapture) { this.shouldCapture = shouldCapture; this.updateCapturing(); } } + public onKeyPressed(hotkey: Hotkey, settings: ReplayFeatureSettings): void { + switch (hotkey) { + case Hotkey.ReplayManually: + if (settings.replayCaptureManually) { + this.replay.capture( + settings.replayCaptureManuallyPastDuration, + settings.replayCaptureManuallyFutureDuration + ).subscribe(() => { }, error => { + console.warn(`Could not capture a manually triggered event. ${error?.message ?? JSON.stringify(error)}`, error); + this.notification.show('replay.capture-error'); + }); + } + break; + } + } + public onGameEvent(event: GameEvent, settings: ReplayFeatureSettings): void { switch (event?.name) { case 'death': @@ -62,7 +84,7 @@ export class ReplayModule implements FeatureModule { settings.replayCaptureDeathPastDuration, settings.replayCaptureDeathFutureDuration ).subscribe(() => { }, error => { - console.warn('Could not capture the death event.', event, error); + console.warn(`Could not capture the death event. ${error?.message ?? JSON.stringify(error)}`, event, error); this.notification.show('replay.capture-error'); }); } @@ -73,7 +95,7 @@ export class ReplayModule implements FeatureModule { settings.replayCaptureKillPastDuration, settings.replayCaptureKillFutureDuration ).subscribe(() => { }, error => { - console.warn('Could not capture the kill event.', event, error); + console.warn(`Could not capture the kill event. ${error?.message ?? JSON.stringify(error)}`, event, error); this.notification.show('replay.capture-error'); }); } @@ -82,12 +104,12 @@ export class ReplayModule implements FeatureModule { } public onInfo(info: RunningGameInfo, settings: ReplayFeatureSettings): void { - const shouldCapture = settings.replayCaptureDeath || settings.replayCaptureKill; + const shouldCapture = settings.replayCaptureManually || settings.replayCaptureDeath || settings.replayCaptureKill; const { isRunning } = info; if (shouldCapture !== this.shouldCapture || isRunning !== this.isRunning) { this.isRunning = info.isRunning; - this.shouldCapture = settings.replayCaptureDeath || settings.replayCaptureKill; + this.shouldCapture = shouldCapture; this.updateCapturing(); } } @@ -106,7 +128,7 @@ export class ReplayModule implements FeatureModule { this.notification.show('replay.started'); } }, error => { - console.warn('Could not start the replay capturing.', error); + console.warn(`Could not start the replay capturing. ${error?.message ?? JSON.stringify(error)}`, error); this.notification.show('replay.start-error'); }); } @@ -117,7 +139,7 @@ export class ReplayModule implements FeatureModule { this.notification.show('replay.stopped'); } }, error => { - console.warn('Could not stop the replay capturing.', error); + console.warn(`Could not stop the replay capturing. ${error?.message ?? JSON.stringify(error)}`, error); this.notification.show('replay.stop-error'); }); } diff --git a/src/app/modules/replay/window/replay-window/replay-window.component.ts b/src/app/modules/replay/window/replay-window/replay-window.component.ts index c2be5956..818d73fc 100644 --- a/src/app/modules/replay/window/replay-window/replay-window.component.ts +++ b/src/app/modules/replay/window/replay-window/replay-window.component.ts @@ -1,6 +1,6 @@ import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; -import { SettingsWindowService } from '@layout/service'; +import { SettingsFeature, SettingsWindowService } from '@layout/service'; import { ReplayWindowService } from '@modules/replay/service'; @Component({ @@ -65,7 +65,7 @@ export class ReplayWindowComponent implements OnInit, AfterViewInit, OnDestroy { } public onSettingsToggle(): void { - this.settings.toggle('replay.name').subscribe(); + this.settings.toggle(SettingsFeature.Replay).subscribe(); } private close(): void { diff --git a/src/app/modules/trade/class/trade-message-action.ts b/src/app/modules/trade/class/trade-message-action.ts index 0e1bc940..07e6daee 100644 --- a/src/app/modules/trade/class/trade-message-action.ts +++ b/src/app/modules/trade/class/trade-message-action.ts @@ -7,7 +7,8 @@ export enum TradeMessageAction { Trade = 'trade', ItemHighlight = 'item-highlight', Whisper = 'whisper', - Finished = 'finished' + Finished = 'finished', + Hideout = 'hideout' } export interface TradeMessageActionState { diff --git a/src/app/modules/trade/component/trade-message-action/trade-message-action.component.html b/src/app/modules/trade/component/trade-message-action/trade-message-action.component.html index 0edf6155..72beba6b 100644 --- a/src/app/modules/trade/component/trade-message-action/trade-message-action.component.html +++ b/src/app/modules/trade/component/trade-message-action/trade-message-action.component.html @@ -11,5 +11,6 @@ done close hearing + exit_to_app \ No newline at end of file diff --git a/src/app/modules/trade/component/trade-message-item/trade-message-item.component.html b/src/app/modules/trade/component/trade-message-item/trade-message-item.component.html index b6210745..3be63348 100644 --- a/src/app/modules/trade/component/trade-message-item/trade-message-item.component.html +++ b/src/app/modules/trade/component/trade-message-item/trade-message-item.component.html @@ -1,5 +1,5 @@
-
{{message.itemName | truncateText: 18}}
+
{{message.itemName | truncateText: 17}}
diff --git a/src/app/modules/trade/component/trade-message/trade-message.component.html b/src/app/modules/trade/component/trade-message/trade-message.component.html index df59e07f..285ec494 100644 --- a/src/app/modules/trade/component/trade-message/trade-message.component.html +++ b/src/app/modules/trade/component/trade-message/trade-message.component.html @@ -1,16 +1,23 @@ -
pan_tool
- - - - -
Could not match message type: {{message.type}}
-
+
+
{{message.name | truncateText: 30}}
+
+
{{message.timeReceived | timer | async}}
+
+
+ + + + +
Could not match message type: {{message.type}}
+
+
+ + diff --git a/src/app/modules/trade/component/trade-message/trade-message.component.scss b/src/app/modules/trade/component/trade-message/trade-message.component.scss index 95311109..e2c2fabf 100644 --- a/src/app/modules/trade/component/trade-message/trade-message.component.scss +++ b/src/app/modules/trade/component/trade-message/trade-message.component.scss @@ -1,19 +1,5 @@ @import "../../../../../styles/variables"; -::ng-deep { - app-trade-message { - &:nth-child(even) { - .message { - background: adjust-color($black-transparent, $alpha: -0.2); - } - } - - & + app-trade-message { - margin-top: 1px; - } - } -} - :host { display: block; } @@ -30,10 +16,14 @@ border-left: 6px solid; border-left-color: adjust-color($color: $purple, $alpha: -0.1); + &.even { + background: adjust-color($black-transparent, $alpha: -0.2); + } + &.joined { - border-top: 1px solid rgb(50, 205, 50); - border-right: 1px solid rgb(50, 205, 50); - border-bottom: 1px solid rgb(50, 205, 50); + border-top: 1px solid $lime; + border-right: 1px solid $lime; + border-bottom: 1px solid $lime; } &.incoming { @@ -50,6 +40,7 @@ top: -8px; right: -8px; display: none; + z-index: 1001; } &:hover { @@ -62,7 +53,7 @@ .action { position: absolute; cursor: pointer; - top: 50%; + top: 75%; left: $gutter-half; transform: translateY(-50%); @@ -91,6 +82,20 @@ justify-content: center; } +.content { + flex-direction: column; +} + +.title { + display: flex; + color: $light-dark-grey; + font-size: 12px; +} + +.spacer { + flex-grow: 1; +} + .actions { padding-top: $gutter-half; } diff --git a/src/app/modules/trade/component/trade-message/trade-message.component.ts b/src/app/modules/trade/component/trade-message/trade-message.component.ts index e8357b00..a4a8289d 100644 --- a/src/app/modules/trade/component/trade-message/trade-message.component.ts +++ b/src/app/modules/trade/component/trade-message/trade-message.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { AudioFile, AudioService } from '@app/audio'; +import { AudioService } from '@app/audio'; import { Roman } from '@app/helper'; import { NotificationService } from '@app/notification'; import { TradeMessageAction, TradeMessageActionState } from '@modules/trade/class'; @@ -34,6 +34,9 @@ export class TradeMessageComponent implements OnInit { @Input() public settings: TradeFeatureSettings; + @Input() + public even: boolean; + @Output() public dismiss = new EventEmitter(); @@ -50,15 +53,18 @@ export class TradeMessageComponent implements OnInit { this.visible[TradeMessageAction.Whisper] = true; if (this.message.direction === TradeWhisperDirection.Incoming) { this.visible[TradeMessageAction.Wait] = true; + this.visible[TradeMessageAction.Interested] = true; this.visible[TradeMessageAction.ItemGone] = true; this.visible[TradeMessageAction.ItemHighlight] = true; + this.visible[TradeMessageAction.Finished] = true; if (this.settings.tradeSoundEnabled) { - this.audio.play(AudioFile.Notification, this.settings.tradeSoundVolume / 100); + this.audio.play(this.settings.tradeSound, this.settings.tradeSoundVolume / 100); } this.event.isHideout().subscribe(value => this.toggle$.next(value)); } else { this.toggle$.next(true); this.visible[TradeMessageAction.Resend] = true; + this.visible[TradeMessageAction.Hideout] = true; this.visible[TradeMessageAction.Finished] = true; this.visible[TradeMessageAction.ItemHighlight] = this.message.type === TradeParserType.TradeMap; } @@ -85,7 +91,6 @@ export class TradeMessageComponent implements OnInit { this.chat.whisper(this.message.name, this.settings.tradeMessageWait, context); }); this.visible[TradeMessageAction.Wait] = false; - this.visible[TradeMessageAction.Interested] = true; break; case TradeMessageAction.Interested: this.createMessageContext().subscribe(context => { @@ -104,8 +109,6 @@ export class TradeMessageComponent implements OnInit { case TradeMessageAction.Trade: this.hideHighlight(); this.chat.trade(this.message.name); - this.visible[TradeMessageAction.ItemHighlight] = false; - this.visible[TradeMessageAction.Finished] = true; break; case TradeMessageAction.ItemHighlight: this.toggleHighlight(); @@ -117,9 +120,14 @@ export class TradeMessageComponent implements OnInit { this.createMessageContext().subscribe(context => { this.chat.whisper(this.message.name, this.settings.tradeMessageThanks, context); }); - this.kick(); + if (this.settings.tradeLeaveParty) { + this.leaveParty(); + } this.close(); break; + case TradeMessageAction.Hideout: + this.chat.hideout(this.message.name); + break; } } @@ -175,17 +183,20 @@ export class TradeMessageComponent implements OnInit { this.highlightWindow.close().subscribe(); } - private kick(): void { + private leaveParty(): void { if (this.message.direction === TradeWhisperDirection.Outgoing) { this.event.getCharacter().pipe( flatMap(character => { if (character?.name?.length) { return of(character.name); } + if (this.settings.characterName?.length) { + return of(this.settings.characterName); + } return throwError('character name was not set.'); }) ).subscribe(name => this.chat.kick(name), error => { - console.warn(`Could not kick character.`, error); + console.warn(`Could not kick character. ${error?.message ?? JSON.stringify(error)}`, error); this.notification.show('trade.kick-error'); }); } else { diff --git a/src/app/modules/trade/component/trade-settings/trade-settings.component.html b/src/app/modules/trade/component/trade-settings/trade-settings.component.html index c0a90519..5ead13d6 100644 --- a/src/app/modules/trade/component/trade-settings/trade-settings.component.html +++ b/src/app/modules/trade/component/trade-settings/trade-settings.component.html @@ -7,6 +7,52 @@
+
+
+ + {{'trade.filter' | translate}} + + + {{'trade.filters.' + (filters.values[filter] | lowercase) | translate}} + + + +
+
+ + {{'trade.layout' | translate}} + + + {{'trade.layouts.' + (layouts.values[layout] | lowercase) | translate}} + + + +
+
+
+ +
+ + +
+
+
+
+ + +
+
+ + {{'trade.leave-party' | translate}} + +
+
+
+
@@ -47,17 +93,23 @@
-
- -
- - - +
+
+ +
+ + + + + +
diff --git a/src/app/modules/trade/component/trade-settings/trade-settings.component.scss b/src/app/modules/trade/component/trade-settings/trade-settings.component.scss index 50fa8569..8da825d1 100644 --- a/src/app/modules/trade/component/trade-settings/trade-settings.component.scss +++ b/src/app/modules/trade/component/trade-settings/trade-settings.component.scss @@ -20,3 +20,9 @@ label { } } } + +button { + & + button { + margin-left: $gutter-half; + } +} diff --git a/src/app/modules/trade/component/trade-settings/trade-settings.component.ts b/src/app/modules/trade/component/trade-settings/trade-settings.component.ts index 8ac34135..3563d19a 100644 --- a/src/app/modules/trade/component/trade-settings/trade-settings.component.ts +++ b/src/app/modules/trade/component/trade-settings/trade-settings.component.ts @@ -1,7 +1,8 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { AudioFile, AudioService } from '@app/audio'; +import { AudioService } from '@app/audio'; +import { EnumValues } from '@app/enum'; import { FeatureSettingsComponent } from '@app/feature'; -import { TradeFeatureSettings } from '@modules/trade/trade-feature-settings'; +import { TradeFeatureSettings, TradeFilter, TradeLayout } from '@modules/trade/trade-feature-settings'; @Component({ selector: 'app-trade-settings', @@ -10,12 +11,15 @@ import { TradeFeatureSettings } from '@modules/trade/trade-feature-settings'; changeDetection: ChangeDetectionStrategy.OnPush }) export class TradeSettingsComponent extends FeatureSettingsComponent { - public displayWithVolume = (volume: number) => `${volume}%`; constructor(private readonly audio: AudioService) { super(); } + public layouts = new EnumValues(TradeLayout); + public filters = new EnumValues(TradeFilter); + public displayWithPercentage = (volume: number) => `${volume}%`; + public load(): void { } public onChange(): void { @@ -23,6 +27,21 @@ export class TradeSettingsComponent extends FeatureSettingsComponent 0) { + const reader = new FileReader(); + reader.onload = (e) => { + this.settings.tradeSound = e.target.result as string; + this.save(); + }; + reader.readAsDataURL(input.files[0]); + } } } diff --git a/src/app/modules/trade/service/trade-window.service.ts b/src/app/modules/trade/service/trade-window.service.ts index d9c08272..5806a3e0 100644 --- a/src/app/modules/trade/service/trade-window.service.ts +++ b/src/app/modules/trade/service/trade-window.service.ts @@ -1,10 +1,11 @@ import { Injectable } from '@angular/core'; import { WindowName } from '@app/config'; import { EventEmitter } from '@app/event'; -import { OWWindow } from '@app/odk'; +import { OWGames, OWWindow } from '@app/odk'; import { ProcessStorageService } from '@app/storage'; import { TradeExchangeMessage } from '@shared/module/poe/trade/chat'; import { Observable } from 'rxjs'; +import { flatMap } from 'rxjs/operators'; import { TradeFeatureSettings } from '../trade-feature-settings'; const WINDOW_DATA_KEY = 'TRADE_WINDOW_DATA'; @@ -39,7 +40,14 @@ export class TradeWindowService { const data = this.data$.get(); data.settings = settings; this.data$.next(data); - return this.window.restore(); + return this.window.restore().pipe( + flatMap(() => OWGames.getRunningGameInfo().pipe( + flatMap(({ height }) => { + const newHeight = Math.round(height * settings.tradeHeight / 100); + return this.window.changeSize(310, newHeight); + }) + )) + ); } public close(): Observable { diff --git a/src/app/modules/trade/service/trade.service.ts b/src/app/modules/trade/service/trade.service.ts index 0d721460..aaf485bf 100644 --- a/src/app/modules/trade/service/trade.service.ts +++ b/src/app/modules/trade/service/trade.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; -import { TradeChatParserService, TradeExchangeMessage, TradeMessage, TradeParserType, TradePlayerJoinedArea } from '@shared/module/poe/trade/chat'; +import { TradeChatParserService, TradeExchangeMessage, TradeMessage, TradeParserType, TradePlayerJoinedArea, TradeWhisperDirection } from '@shared/module/poe/trade/chat'; +import { TradeFilter } from '../trade-feature-settings'; import { TradeWindowData, TradeWindowService } from './trade-window.service'; @Injectable({ @@ -23,7 +24,7 @@ export class TradeService { this.window.data$.next(data); } - public onLogLineAdd(line: string): void { + public onLogLineAdd(line: string, filter: TradeFilter): void { const data = this.window.data$.get(); if (this.processRemoved(data)) { this.window.data$.next(data); @@ -35,10 +36,15 @@ export class TradeService { case TradeParserType.TradeBulk: case TradeParserType.TradeMap: const message = result as TradeExchangeMessage; - if (!this.processMessage(message, data.messages)) { - data.messages.push(message); + const { direction } = message; + const shouldProcess = direction === TradeWhisperDirection.Incoming + || (direction === TradeWhisperDirection.Outgoing && filter === TradeFilter.IncomingOutgoing); + if (shouldProcess) { + if (!this.processMessage(message, data.messages)) { + data.messages.push(message); + } + this.window.data$.next(data); } - this.window.data$.next(data); break; case TradeParserType.Whisper: if (this.processWhisper(result as TradeMessage, data.messages)) { diff --git a/src/app/modules/trade/trade-feature-settings.ts b/src/app/modules/trade/trade-feature-settings.ts index 5feca6fe..baf4c073 100644 --- a/src/app/modules/trade/trade-feature-settings.ts +++ b/src/app/modules/trade/trade-feature-settings.ts @@ -1,7 +1,18 @@ import { FeatureSettings } from '@app/feature'; +export enum TradeLayout { + TopToBottom, + BottomToTop +} + +export enum TradeFilter { + IncomingOutgoing, + Incoming +} + export interface TradeFeatureSettings extends FeatureSettings { tradeEnabled: boolean; + tradeLeaveParty: boolean; tradeMessageWait: string; tradeMessageStillInterested: string; tradeMessageItemGone: string; @@ -12,4 +23,8 @@ export interface TradeFeatureSettings extends FeatureSettings { }; tradeSoundEnabled: boolean; tradeSoundVolume: number; + tradeSound: string; + tradeFilter: TradeFilter; + tradeLayout: TradeLayout; + tradeHeight: number; } diff --git a/src/app/modules/trade/trade.module.ts b/src/app/modules/trade/trade.module.ts index 3c9a1c17..7392da81 100644 --- a/src/app/modules/trade/trade.module.ts +++ b/src/app/modules/trade/trade.module.ts @@ -1,5 +1,6 @@ import { NgModule, NgZone } from '@angular/core'; import { AnnotationService } from '@app/annotation'; +import { AudioFile } from '@app/audio'; import { Feature, FeatureConfig, FeatureModule, FEATURE_MODULES } from '@app/feature'; import { RunningGameInfo } from '@app/odk'; import { EventService } from '@shared/module/poe/event'; @@ -9,7 +10,7 @@ import { BehaviorSubject, of } from 'rxjs'; import { catchError } from 'rxjs/operators'; import { TradeMessageActionComponent, TradeMessageBulkComponent, TradeMessageComponent, TradeMessageDirectionComponent, TradeMessageItemComponent, TradeMessageMapComponent, TradeMessageMapTierComponent, TradeSettingsComponent } from './component'; import { TradeHighlightWindowService, TradeService, TradeWindowService } from './service'; -import { TradeFeatureSettings } from './trade-feature-settings'; +import { TradeFeatureSettings, TradeFilter, TradeLayout } from './trade-feature-settings'; import { TradeHighlightWindowComponent, TradeWindowComponent } from './window'; const WINDOWS = [ @@ -34,7 +35,7 @@ const WINDOWS = [ imports: [SharedModule] }) export class TradeModule implements FeatureModule { - private enabled = false; + private settings: TradeFeatureSettings; constructor( private readonly event: EventService, @@ -42,7 +43,7 @@ export class TradeModule implements FeatureModule { private readonly tradeWindow: TradeWindowService, private readonly highlightWindow: TradeHighlightWindowService, private readonly annotation: AnnotationService, - private readonly ngZone: NgZone, ) { } + private readonly ngZone: NgZone) { } public getConfig(): FeatureConfig { const config: FeatureConfig = { @@ -50,6 +51,7 @@ export class TradeModule implements FeatureModule { component: TradeSettingsComponent, default: { tradeEnabled: true, + tradeLeaveParty: true, tradeMessageWait: 'Currently in @zone. Do you want to wait until finished?', tradeMessageStillInterested: 'Do you still want @itemname for @price?', tradeMessageItemGone: 'Sorry, @itemname already gone. Good luck on your search.', @@ -57,7 +59,11 @@ export class TradeModule implements FeatureModule { tradeStashFactor: {}, tradeWindowPinned: false, tradeSoundEnabled: true, - tradeSoundVolume: 75 + tradeSoundVolume: 75, + tradeFilter: TradeFilter.IncomingOutgoing, + tradeLayout: TradeLayout.TopToBottom, + tradeHeight: 30, + tradeSound: AudioFile.Notification } }; return config; @@ -76,7 +82,7 @@ export class TradeModule implements FeatureModule { this.highlightWindow.close().subscribe(); this.trade.clear(); } - this.enabled = settings.tradeEnabled; + this.settings = settings; } public onInfo(info: RunningGameInfo, settings: TradeFeatureSettings): void { @@ -91,58 +97,60 @@ export class TradeModule implements FeatureModule { this.highlightWindow.close().subscribe(); this.trade.clear(); } - this.enabled = settings.tradeEnabled; + this.settings = settings; } public onLogLineAdd(line: string): void { - if (this.enabled) { - this.trade.onLogLineAdd(line); + if (this.settings?.tradeEnabled) { + this.trade.onLogLineAdd(line, this.settings.tradeFilter); } } private registerAnnotation(): void { let lastId = ''; - this.annotation.message$.on(message => this.ngZone.run(() => { - const id = message?.id || ''; - if (id === lastId) { - return; - } - lastId = id; + this.annotation.message$.on(message => { + this.ngZone.run(() => { + const id = message?.id || ''; + if (id === lastId) { + return; + } + lastId = id; - switch (id) { - case 'trade.outgoing': - case 'trade.incoming': - this.event.getCharacter().pipe( - catchError(() => of(null)) - ).subscribe(character => { - const item: TradeItemMessage = { - direction: id === 'trade.outgoing' - ? TradeWhisperDirection.Outgoing - : TradeWhisperDirection.Incoming, - itemName: 'Apocalypse Horn Decimation Bow', - joined$: new BehaviorSubject(false), - league: 'Standard', - left: 4, - top: 6, - // tslint:disable:max-line-length - message: 'Hi, I would like to buy your Apocalypse Horn Decimation Bow for 2 chaos in Delirium (stash tab "Annotation"; position: left 4, top 6)', - // tslint:enable:max-line-length - name: character?.name || 'PoEOverlayUnknownCharacter', - stash: 'Annotation', - timeReceived: new Date(), - type: TradeParserType.TradeItem, - whispers$: new BehaviorSubject([]), - currencyType: 'chaos', - price: 2 - }; - this.trade.set(item); - }); - break; - case 'trade.settings': - this.highlightWindow.close().subscribe(); - this.trade.clear(); - break; - } - })); + switch (id) { + case 'trade.outgoing': + case 'trade.incoming': + this.event.getCharacter().pipe( + catchError(() => of(null)) + ).subscribe(character => { + const item: TradeItemMessage = { + direction: id === 'trade.outgoing' + ? TradeWhisperDirection.Outgoing + : TradeWhisperDirection.Incoming, + itemName: 'Apocalypse Horn Decimation Bow', + joined$: new BehaviorSubject(false), + league: 'Standard', + left: 4, + top: 6, + // tslint:disable:max-line-length + message: 'Hi, I would like to buy your Apocalypse Horn Decimation Bow for 2 chaos in Delirium (stash tab "Annotation"; position: left 4, top 6)', + // tslint:enable:max-line-length + name: character?.name || 'PoEOverlayUnknownCharacter', + stash: 'Annotation', + timeReceived: new Date(), + type: TradeParserType.TradeItem, + whispers$: new BehaviorSubject([]), + currencyType: 'chaos', + price: 2 + }; + this.trade.set(item); + }); + break; + case 'trade.settings': + this.highlightWindow.close().subscribe(); + this.trade.clear(); + break; + } + }); + }); } } diff --git a/src/app/modules/trade/window/trade-highlight-window/trade-highlight-window.component.scss b/src/app/modules/trade/window/trade-highlight-window/trade-highlight-window.component.scss index 9a1ecf30..b9214e89 100644 --- a/src/app/modules/trade/window/trade-highlight-window/trade-highlight-window.component.scss +++ b/src/app/modules/trade/window/trade-highlight-window/trade-highlight-window.component.scss @@ -22,7 +22,7 @@ } .stash { - color: rgb(50, 205, 50); + color: $lime; } .name, @@ -57,6 +57,6 @@ .highlight { position: absolute; - border: 2px solid rgb(50, 205, 50); + border: 2px solid $lime; } } diff --git a/src/app/modules/trade/window/trade-highlight-window/trade-highlight-window.component.ts b/src/app/modules/trade/window/trade-highlight-window/trade-highlight-window.component.ts index 3a8d3515..b8196118 100644 --- a/src/app/modules/trade/window/trade-highlight-window/trade-highlight-window.component.ts +++ b/src/app/modules/trade/window/trade-highlight-window/trade-highlight-window.component.ts @@ -32,9 +32,11 @@ export class TradeHighlightWindowComponent implements OnInit, OnDestroy { public ngOnInit(): void { this.updateData(this.window.data$.get()); - this.subscription = this.window.data$.on(data => this.ngZone.run(() => { - this.updateData(data); - })); + this.subscription = this.window.data$.on(data => { + this.ngZone.run(() => { + this.updateData(data); + }); + }); } public ngOnDestroy(): void { diff --git a/src/app/modules/trade/window/trade-window/trade-window.component.html b/src/app/modules/trade/window/trade-window/trade-window.component.html index 6b864571..bc426653 100644 --- a/src/app/modules/trade/window/trade-window/trade-window.component.html +++ b/src/app/modules/trade/window/trade-window/trade-window.component.html @@ -1,19 +1,25 @@ -
- - - - keyboard_arrow_down - - - - - - + + +
+ + + keyboard_arrow_down + - - + +
+
+ + +
+
+
+ +
-
\ No newline at end of file + \ No newline at end of file diff --git a/src/app/modules/trade/window/trade-window/trade-window.component.scss b/src/app/modules/trade/window/trade-window/trade-window.component.scss index e0d5911a..07d01a15 100644 --- a/src/app/modules/trade/window/trade-window/trade-window.component.scss +++ b/src/app/modules/trade/window/trade-window/trade-window.component.scss @@ -18,6 +18,12 @@ ::-webkit-scrollbar-thumb { display: none; } + + app-header { + .header { + margin-right: 10px; + } + } } .indicator { @@ -30,3 +36,39 @@ transform-origin: center; } } + +.content { + opacity: 1; + + &.pinned { + opacity: 0.3; + } + + &.active, + &:hover { + opacity: 1; + } +} + +.messages { + display: flex; + flex-direction: column; + min-height: calc(100vh - 30px); + margin-right: 10px; + + &.reverse { + flex-direction: column-reverse; + + .message { + & + .message { + margin: 0 0 1px 0; + } + } + } + + .message { + & + .message { + margin: 1px 0 0 0; + } + } +} diff --git a/src/app/modules/trade/window/trade-window/trade-window.component.ts b/src/app/modules/trade/window/trade-window/trade-window.component.ts index d9495fbd..120a78f8 100644 --- a/src/app/modules/trade/window/trade-window/trade-window.component.ts +++ b/src/app/modules/trade/window/trade-window/trade-window.component.ts @@ -1,10 +1,10 @@ import { ChangeDetectionStrategy, Component, NgZone, OnDestroy, OnInit } from '@angular/core'; import { EventSubscription } from '@app/event'; import { FeatureSettingsService } from '@app/feature/feature-settings.service'; -import { SettingsWindowService } from '@layout/service'; +import { SettingsWindowService, SettingsFeature } from '@layout/service'; import { TradeWindowData, TradeWindowService } from '@modules/trade/service'; import { TradeFeatureSettings } from '@modules/trade/trade-feature-settings'; -import { TradeExchangeMessage } from '@shared/module/poe/trade/chat'; +import { TradeExchangeMessage, TradeMessage } from '@shared/module/poe/trade/chat'; import { BehaviorSubject } from 'rxjs'; @Component({ @@ -27,9 +27,11 @@ export class TradeWindowComponent implements OnInit, OnDestroy { public ngOnInit(): void { this.data$.next(this.window.data$.get()); - this.subscription = this.window.data$.on(data => this.ngZone.run(() => { - this.data$.next(data); - })); + this.subscription = this.window.data$.on(data => { + this.ngZone.run(() => { + this.data$.next(data); + }); + }); } public ngOnDestroy(): void { @@ -49,6 +51,10 @@ export class TradeWindowComponent implements OnInit, OnDestroy { } public onSettingsToggle(): void { - this.settingsWindow.toggle('trade.name').subscribe(); + this.settingsWindow.toggle(SettingsFeature.Trade).subscribe(); + } + + public getMessages(data: TradeWindowData): TradeMessage[] { + return data.messages.filter(message => !data.removed.includes(message)); } } diff --git a/src/app/shared/module/common/common.module.ts b/src/app/shared/module/common/common.module.ts index f37644b1..0141cf76 100644 --- a/src/app/shared/module/common/common.module.ts +++ b/src/app/shared/module/common/common.module.ts @@ -1,8 +1,10 @@ import { NgModule } from '@angular/core'; import { TruncateTextPipe } from './pipe'; +import { TimerPipe } from './pipe/timer.pipe'; const PIPES = [ - TruncateTextPipe + TruncateTextPipe, + TimerPipe ]; @NgModule({ diff --git a/src/app/shared/module/common/pipe/timer.pipe.ts b/src/app/shared/module/common/pipe/timer.pipe.ts new file mode 100644 index 00000000..7f5dabe8 --- /dev/null +++ b/src/app/shared/module/common/pipe/timer.pipe.ts @@ -0,0 +1,21 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { Observable, timer } from 'rxjs'; +import { map } from 'rxjs/operators'; + +@Pipe({ + name: 'timer', +}) +export class TimerPipe implements PipeTransform { + public transform(start: Date): Observable { + return timer(0, 1000).pipe( + map(() => { + const diff = new Date(Date.now() - start.getTime()); + const minutes = diff.getMinutes(); + const m = '0' + minutes; + const seconds = diff.getSeconds(); + const s = '0' + seconds; + return `${m.substr(m.length - 2)}:${s.substr(s.length - 2)}`; + }) + ); + } +} diff --git a/src/app/shared/module/common/pipe/truncate-text.pipe.ts b/src/app/shared/module/common/pipe/truncate-text.pipe.ts index dcaee81e..82f5c790 100644 --- a/src/app/shared/module/common/pipe/truncate-text.pipe.ts +++ b/src/app/shared/module/common/pipe/truncate-text.pipe.ts @@ -4,7 +4,8 @@ import { Pipe, PipeTransform } from '@angular/core'; name: 'truncateText', }) export class TruncateTextPipe implements PipeTransform { - public transform(text: string, length: number, separator: string = '...'): any { + public transform(text: string, length: number, separator: string = '..'): string { + text = text || ''; if (text.length < length) { return text; } diff --git a/src/app/shared/module/material/component/select-list/select-list.component.scss b/src/app/shared/module/material/component/select-list/select-list.component.scss index 2b674743..27982ed3 100644 --- a/src/app/shared/module/material/component/select-list/select-list.component.scss +++ b/src/app/shared/module/material/component/select-list/select-list.component.scss @@ -19,5 +19,6 @@ .viewport { height: 240px; width: 550px; + box-shadow: 0 0 2px 0; } } diff --git a/src/app/shared/module/odk/component/header/header.component.html b/src/app/shared/module/odk/component/header/header.component.html index f35245c1..ac1ac9cf 100644 --- a/src/app/shared/module/odk/component/header/header.component.html +++ b/src/app/shared/module/odk/component/header/header.component.html @@ -1,4 +1,5 @@ -
+
@@ -10,11 +11,20 @@
close - push_pin + push_pin + settings
-
+
+
+ \ No newline at end of file diff --git a/src/app/shared/module/odk/component/header/header.component.scss b/src/app/shared/module/odk/component/header/header.component.scss index faf2c1cb..8d8f07d1 100644 --- a/src/app/shared/module/odk/component/header/header.component.scss +++ b/src/app/shared/module/odk/component/header/header.component.scss @@ -2,6 +2,8 @@ $header-background: #131313; $header-color: #a3a3a3; $header-size: 30px; $header-font-size: 14px; +$footer-size: 14px; +$footer-font-size: 10px; $icon-size: 16px; $border-color: #1a1a1a; @@ -15,7 +17,7 @@ $border-color: #1a1a1a; font-size: $icon-size; line-height: $icon-size; - & + .mat-icon{ + & + .mat-icon { margin-left: 3px; } } @@ -23,18 +25,61 @@ $border-color: #1a1a1a; } } +.footer, .header { position: relative; - height: $header-size; - line-height: $header-size + 2px; background: $header-background; color: $header-color; - font-size: $header-font-size; font-family: FontinSmallCaps; + &.fixed { + position: fixed; + z-index: 1000; + left: 0; + right: 0; + } +} + +.header { + height: $header-size; + line-height: $header-size + 2px; + font-size: $header-font-size; + .name { text-align: center; } + + &.fixed { + &:not(.reverse) { + top: 0; + } + + &.reverse { + bottom: 0; + } + } +} + +.footer { + display: flex; + height: $footer-size; + line-height: $footer-size; + font-size: $footer-font-size; + padding: 0 3px; + + &.fixed { + &:not(.reverse) { + bottom: 0; + } + + &.reverse { + top: 0; + } + } +} + +.spacer { + flex-grow: 1; } .controls { @@ -73,10 +118,35 @@ $border-color: #1a1a1a; } .content { - &:not(.inline) { - height: calc(100% - 30px); - } - border: 1px solid $border-color; - border-top: none; width: 100%; + height: 100%; + + &:not(.fixed) { + &.has-footer { + height: calc(100% - #{$footer-size} - #{$header-size}); + } + + height: calc(100% - #{$header-size}); + } + + &.fixed { + padding: $header-size 0 0 0; + + &.has-footer { + padding: $header-size 0 $footer-size - 1px 0; + } + + &.reverse { + padding: 0 0 $header-size 0; + + &.has-footer { + padding: $footer-size 0 $header-size - 1px 0; + } + } + } + + &.frame { + border: 1px solid $border-color; + border-top: none; + } } diff --git a/src/app/shared/module/odk/component/header/header.component.ts b/src/app/shared/module/odk/component/header/header.component.ts index 040b2803..27d6065e 100644 --- a/src/app/shared/module/odk/component/header/header.component.ts +++ b/src/app/shared/module/odk/component/header/header.component.ts @@ -2,6 +2,7 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output import { OWWindow } from '@app/odk'; import { Observable } from 'rxjs'; import { map, shareReplay } from 'rxjs/operators'; +import { meta } from './../../../../../../../manifest.json'; @Component({ selector: 'app-header', @@ -13,6 +14,8 @@ export class HeaderComponent implements OnInit { private readonly window = new OWWindow(); private obtained$: Observable; + public version = meta.version; + @Input() public name: string; @@ -38,11 +41,23 @@ export class HeaderComponent implements OnInit { public width: number; @Input() - public margin: number; + public reverse = false; + + @Input() + public fixed = false; + + @Input() + public frame = true; + + @Input() + public footer = false; @Output() public settingsToggle = new EventEmitter(); + @Output() + public supportToggle = new EventEmitter(); + public ngOnInit(): void { this.obtained$ = this.window.assureObtained() .pipe( diff --git a/src/app/shared/module/odk/odk.module.ts b/src/app/shared/module/odk/odk.module.ts index 04751a22..fc3ce4dc 100644 --- a/src/app/shared/module/odk/odk.module.ts +++ b/src/app/shared/module/odk/odk.module.ts @@ -1,5 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; +import { TranslateModule } from '@ngx-translate/core'; import { MaterialModule } from '../material/material.module'; import { HeaderComponent } from './component'; import { ResizeDirective } from './directive'; @@ -20,7 +21,7 @@ const COMPONENTS = [ @NgModule({ declarations: [...DIRECTIVES, ...PIPES, ...COMPONENTS], - imports: [CommonModule, MaterialModule], + imports: [CommonModule, TranslateModule, MaterialModule], exports: [...DIRECTIVES, ...PIPES, ...COMPONENTS] }) export class OdkModule { } diff --git a/src/app/shared/module/poe/chat/chat.service.ts b/src/app/shared/module/poe/chat/chat.service.ts index a170f6e7..74ab6f68 100644 --- a/src/app/shared/module/poe/chat/chat.service.ts +++ b/src/app/shared/module/poe/chat/chat.service.ts @@ -1,7 +1,8 @@ import { Injectable } from '@angular/core'; +import { OWClipboard } from '@app/odk'; import { OWUtils } from '@app/odk/ow-utils'; -import { of, Subject } from 'rxjs'; -import { concatMap, delay, distinctUntilChanged, flatMap, mergeMap, tap, windowTime } from 'rxjs/operators'; +import { Subject } from 'rxjs'; +import { concatMap, delay, distinctUntilChanged, flatMap, map, mergeMap, tap, windowTime } from 'rxjs/operators'; interface ChatEvent { message: string; @@ -44,28 +45,33 @@ export class ChatService { this.queue$.next({ message, send: true }); } + public hideout(name: string): void { + const message = this.generateMessage('/hideout', name); + this.queue$.next({ message, send: true }); + } + private init(): void { this.queue$.pipe( windowTime(350), concatMap(source => source.pipe( distinctUntilChanged((x, y) => JSON.stringify(x) === JSON.stringify(y)) )), - mergeMap(event => OWUtils.getFromClipboard().pipe( - tap(() => OWUtils.placeOnClipboard(event.message)), - delay(10), - flatMap(text => of(text).pipe( - tap(() => OWUtils.sendKeyStroke('Enter')), - delay(10), - tap(() => OWUtils.sendKeyStroke('Ctrl+V')), - delay(10), - tap(() => { - if (event.send) { - OWUtils.sendKeyStroke('Enter'); - } - }), + mergeMap(event => OWClipboard.getFromClipboard().pipe( + flatMap(text => OWClipboard.placeOnClipboard(event.message).pipe( + map(() => text) )), + delay(10), + tap(() => OWUtils.sendKeyStroke('Enter')), + delay(30), + tap(() => OWUtils.sendKeyStroke('Ctrl+V')), + delay(10), + tap(() => { + if (event.send) { + OWUtils.sendKeyStroke('Enter'); + } + }), delay(200), - tap(text => OWUtils.placeOnClipboard(text)), + flatMap(text => OWClipboard.placeOnClipboard(text)), delay(10), ), 1) ).subscribe(); diff --git a/src/app/shared/module/poe/event/event.service.ts b/src/app/shared/module/poe/event/event.service.ts index 210e5ce2..217aac9b 100644 --- a/src/app/shared/module/poe/event/event.service.ts +++ b/src/app/shared/module/poe/event/event.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { OWGamesEvents } from '@app/odk'; import { Observable, of } from 'rxjs'; -import { catchError, map, tap } from 'rxjs/operators'; +import { catchError, map } from 'rxjs/operators'; interface EventInfo { match_info: { diff --git a/src/app/shared/module/poe/item/clipboard/item-clipboard-parser.service.ts b/src/app/shared/module/poe/item/clipboard/item-clipboard-parser.service.ts index 65ca214b..b97ebbcf 100644 --- a/src/app/shared/module/poe/item/clipboard/item-clipboard-parser.service.ts +++ b/src/app/shared/module/poe/item/clipboard/item-clipboard-parser.service.ts @@ -49,6 +49,7 @@ export class ItemClipboardParserService { ]; } + // TODO: get the language via rarity public parse( content: string, parse?: { diff --git a/src/app/shared/module/poe/item/clipboard/item-clipboard.service.ts b/src/app/shared/module/poe/item/clipboard/item-clipboard.service.ts index ad5cfadc..dde7f333 100644 --- a/src/app/shared/module/poe/item/clipboard/item-clipboard.service.ts +++ b/src/app/shared/module/poe/item/clipboard/item-clipboard.service.ts @@ -1,7 +1,8 @@ import { Injectable } from '@angular/core'; +import { OWClipboard } from '@app/odk'; import { OWUtils } from '@app/odk/ow-utils'; -import { iif, Observable, of, throwError } from 'rxjs'; -import { catchError, concatMap, delay, flatMap, map, retryWhen, tap } from 'rxjs/operators'; +import { Observable, of } from 'rxjs'; +import { catchError, delay, flatMap, map } from 'rxjs/operators'; import { Item } from '../item'; import { ItemClipboardParserService } from './item-clipboard-parser.service'; @@ -29,9 +30,11 @@ export class ItemClipboardService { OWUtils.sendKeyStroke('Ctrl+C'); return of(null).pipe( delay(150), - flatMap(() => OWUtils.getFromClipboard()), + flatMap(() => OWClipboard.getFromClipboard()), catchError(() => of('')), - tap(() => OWUtils.placeOnClipboard('')), + flatMap(content => OWClipboard.placeOnClipboard('').pipe( + map(() => content) + )), map(content => { if (!content?.length) { return { code: ItemClipboardResultCode.Empty }; diff --git a/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.scss b/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.scss index 888a3f6d..f6adc62c 100644 --- a/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.scss +++ b/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.scss @@ -57,5 +57,41 @@ } } } + + .life { + .text, + .value, + .value.changed { + color: $red; + + .text { + color: $red !important; + } + } + } + + .mana { + .text, + .value, + .value.changed { + color: $river; + + .text { + color: $river !important; + } + } + } + + .es { + .text, + .value, + .value.changed { + color: $emerald; + + .text { + color: $emerald !important; + } + } + } } } diff --git a/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.ts b/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.ts index 493648b6..84482a7f 100644 --- a/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.ts +++ b/src/app/shared/module/poe/item/frame/item-frame-stats/item-frame-stats.component.ts @@ -28,7 +28,15 @@ export class ItemFrameStatsComponent { if (!id || id.length === 0) { return ''; } - + switch (id) { + case 'pseudo_total_life': + return 'life'; + case 'pseudo_total_mana': + return 'mana'; + case 'pseudo_total_energy_shield': + case 'pseudo_increased_energy_shield': + return 'es'; + } if (id.includes('fire_')) { return 'fire'; } @@ -41,7 +49,6 @@ export class ItemFrameStatsComponent { if (id.includes('chaos_')) { return 'chaos'; } - return ''; } } diff --git a/src/app/shared/module/poe/item/frame/item-frame/item-frame.component.scss b/src/app/shared/module/poe/item/frame/item-frame/item-frame.component.scss index 4e6c7992..d270febb 100644 --- a/src/app/shared/module/poe/item/frame/item-frame/item-frame.component.scss +++ b/src/app/shared/module/poe/item/frame/item-frame/item-frame.component.scss @@ -6,13 +6,11 @@ text-align: center; font-style: 14.3px; font-family: FontinSmallCaps; - display: inline-block; .detail { position: relative; padding: 2px; min-width: 396px; - // min-height: 115px; white-space: pre; } } diff --git a/src/app/shared/module/poe/poe.module.ts b/src/app/shared/module/poe/poe.module.ts index cdec2ae6..35e42de9 100644 --- a/src/app/shared/module/poe/poe.module.ts +++ b/src/app/shared/module/poe/poe.module.ts @@ -10,8 +10,9 @@ import { BaseItemTypePipe } from './item/base-item-type'; import { ItemFrameComponent, ItemFrameHeaderComponent, ItemFrameInfluencesComponent, ItemFrameLevelRequirementsComponent, ItemFramePropertiesComponent, ItemFrameQueryComponent, ItemFrameSeparatorComponent, ItemFrameSocketsComponent, ItemFrameStateComponent, ItemFrameStatsComponent, ItemFrameValueComponent, ItemFrameValueGroupComponent, ItemFrameValueInputComponent } from './item/frame'; import { StatGroupPipe, StatTransformPipe } from './item/stat'; import { WordPipe } from './item/word'; -import { TradeFetchItemPipe, TradeStatsPipe, TradeStatsTypePipe } from './trade'; -import { TradeWhisperTitle } from './trade/chat'; +import { TradeFetchItemPipe, TradeSearchTextPipe, TradeStatsPipe, TradeStatsTypePipe } from './trade'; +import { TradeWhisperTitlePipe } from './trade/chat'; +import { TradeExchangeTextPipe } from './trade/exchange'; import { TradeStaticFrameComponent, TradeStaticPipe } from './trade/statics'; const COMPONENTS = [ @@ -26,7 +27,9 @@ const PIPES = [ TradeStatsPipe, TradeStatsTypePipe, TradeFetchItemPipe, - TradeWhisperTitle + TradeWhisperTitlePipe, + TradeSearchTextPipe, + TradeExchangeTextPipe ]; @NgModule({ diff --git a/src/app/shared/module/poe/price/item-price-prediction.service.ts b/src/app/shared/module/poe/price/item-price-prediction.service.ts index 18bb433d..eb8227d4 100644 --- a/src/app/shared/module/poe/price/item-price-prediction.service.ts +++ b/src/app/shared/module/poe/price/item-price-prediction.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { ItemPricePredictionHttpService } from '@data/poe-prices'; -import { forkJoin, Observable } from 'rxjs'; +import { Language } from '@data/poe/schema'; +import { forkJoin, Observable, throwError } from 'rxjs'; import { flatMap, map } from 'rxjs/operators'; import { ContextService } from '../context'; import { CurrencyConverterService, CurrencySelectService, CurrencySelectStrategy } from '../currency'; @@ -23,6 +24,11 @@ export class ItemPricePredictionService { leagueId = leagueId || this.context.get().leagueId; // TODO: translate item source + const language = this.context.get().language; + if (language !== Language.English) { + return throwError('evaluate.prediction.language'); + } + const { content } = item; return this.prediction.provide(leagueId, content).pipe( flatMap(prediction => forkJoin( diff --git a/src/app/shared/module/poe/stash/stash.service.ts b/src/app/shared/module/poe/stash/stash.service.ts index 8440a6c5..5d6a3c6c 100644 --- a/src/app/shared/module/poe/stash/stash.service.ts +++ b/src/app/shared/module/poe/stash/stash.service.ts @@ -1,7 +1,8 @@ import { Injectable } from '@angular/core'; +import { OWClipboard } from '@app/odk'; import { OWUtils } from '@app/odk/ow-utils'; -import { Subject } from 'rxjs'; -import { delay, mergeMap, tap } from 'rxjs/operators'; +import { Observable, Subject } from 'rxjs'; +import { delay, flatMap, map, mergeMap, tap } from 'rxjs/operators'; import { StashPriceTag } from './stash-price-tag'; interface HighlightEvent { @@ -18,9 +19,9 @@ export class StashService { this.init(); } - public copyPrice(tag: StashPriceTag): void { + public copyPrice(tag: StashPriceTag): Observable { const content = `${tag.type} ${(tag.count ? `${tag.amount}/${tag.count}` : tag.amount)} ${tag.currency}`; - OWUtils.placeOnClipboard(content); + return OWClipboard.placeOnClipboard(content); } public highlight(term: string): void { @@ -29,14 +30,16 @@ export class StashService { private init(): void { this.queue$.pipe( - mergeMap(event => OWUtils.getFromClipboard().pipe( - tap(() => OWUtils.placeOnClipboard(event.term)), + mergeMap(event => OWClipboard.getFromClipboard().pipe( + flatMap(text => OWClipboard.placeOnClipboard(event.term).pipe( + map(() => text) + )), delay(10), tap(() => OWUtils.sendKeyStroke('Ctrl+F')), delay(175), tap(() => OWUtils.sendKeyStroke('Ctrl+V')), delay(75), - tap(text => OWUtils.placeOnClipboard(text)), + flatMap(text => OWClipboard.placeOnClipboard(text)), delay(10), ), 1) ).subscribe(); diff --git a/src/app/shared/module/poe/trade/chat/trade-chat-parser.service.spec.ts b/src/app/shared/module/poe/trade/chat/trade-chat-parser.service.spec.ts index b3597680..9978b779 100644 --- a/src/app/shared/module/poe/trade/chat/trade-chat-parser.service.spec.ts +++ b/src/app/shared/module/poe/trade/chat/trade-chat-parser.service.spec.ts @@ -32,7 +32,6 @@ fdescribe('TradeChatParserService', () => { logs.forEach(log => { it(`should not get result for log: '${log.slice(0, 30)}'`, () => { const result = sut.parse(log); - console.log(JSON.stringify(result, undefined, 2)); expect(result.type !== TradeParserType.Ignored).toBeTruthy(); }); }); diff --git a/src/app/shared/module/poe/trade/chat/trade-chat-whisper.pipe.ts b/src/app/shared/module/poe/trade/chat/trade-chat-whisper.pipe.ts index 958a1285..3bc892a0 100644 --- a/src/app/shared/module/poe/trade/chat/trade-chat-whisper.pipe.ts +++ b/src/app/shared/module/poe/trade/chat/trade-chat-whisper.pipe.ts @@ -4,7 +4,7 @@ import { TradeWhisper, TradeWhisperDirection } from './trade-chat'; @Pipe({ name: 'tradeWhisperTitle' }) -export class TradeWhisperTitle implements PipeTransform { +export class TradeWhisperTitlePipe implements PipeTransform { public transform(whispers: TradeWhisper[]): string { return `\n${whispers.map(whisper => { const prefix = whisper.direction === TradeWhisperDirection.Incoming ? '@From' : '@To'; diff --git a/src/app/shared/module/poe/trade/exchange/index.ts b/src/app/shared/module/poe/trade/exchange/index.ts index d110f372..86663992 100644 --- a/src/app/shared/module/poe/trade/exchange/index.ts +++ b/src/app/shared/module/poe/trade/exchange/index.ts @@ -1,2 +1,4 @@ export * from './trade-exchange'; +export * from './trade-exchange.pipe'; export * from './trade-exchange.service'; + diff --git a/src/app/shared/module/poe/trade/exchange/trade-exchange.pipe.ts b/src/app/shared/module/poe/trade/exchange/trade-exchange.pipe.ts new file mode 100644 index 00000000..3d171e96 --- /dev/null +++ b/src/app/shared/module/poe/trade/exchange/trade-exchange.pipe.ts @@ -0,0 +1,12 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { TradeExchangeRequest } from './trade-exchange'; + +@Pipe({ + name: 'tradeExchangeText' +}) +export class TradeExchangeTextPipe implements PipeTransform { + public transform(request: TradeExchangeRequest): string { + const { have, want, minimum } = request.exchange; + return `${have.join(', ')} <> ${want.join(', ')} (min: ${minimum ? minimum : 'any'})`; + } +} diff --git a/src/app/shared/module/poe/trade/fetch/trade-fetch-item.pipe.ts b/src/app/shared/module/poe/trade/fetch/trade-fetch-item.pipe.ts index 0700153a..709b72f7 100644 --- a/src/app/shared/module/poe/trade/fetch/trade-fetch-item.pipe.ts +++ b/src/app/shared/module/poe/trade/fetch/trade-fetch-item.pipe.ts @@ -14,13 +14,20 @@ export class TradeFetchItemPipe implements PipeTransform { private readonly processor: ItemProcessorService) { } public transform(fetchItem: TradeFetchEntryItem): Item { + if (!fetchItem) { + return null; + } const item = this.parser.parse(fetchItem.text, null, fetchItem.hashes.reduce((filter, key) => { filter[key] = true; return filter; }, {}) ); - this.processor.process(item, { normalizeQuality: true }); + if (item) { + this.processor.process(item, { normalizeQuality: true }); + } else { + console.warn(`Could not parse item for market. ${fetchItem.text}`); + } return item; } } diff --git a/src/app/shared/module/poe/trade/fetch/trade-fetch.service.ts b/src/app/shared/module/poe/trade/fetch/trade-fetch.service.ts index a47052b5..19e547b2 100644 --- a/src/app/shared/module/poe/trade/fetch/trade-fetch.service.ts +++ b/src/app/shared/module/poe/trade/fetch/trade-fetch.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; import { StorageCacheService } from '@app/cache'; +import { b64DecodeUnicode } from '@app/helper'; import { TradeFetchHttpResult } from '@data/poe/schema'; import { TradeHttpService } from '@data/poe/service'; import moment from 'moment'; @@ -57,7 +58,9 @@ export class TradeFetchService { map(responses => responses .filter(x => x.result?.length) .reduce((a, b) => a.concat(b.result), cached) - .filter(x => x?.id?.length)), + .filter(x => x?.id?.length) + .sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id)) + ), map(results => results.map(result => { const key = `${CACHE_PREFIX}_${exchange}_${result.id}`; return this.cache.store(key, result, CACHE_EXPIRY); @@ -71,68 +74,68 @@ export class TradeFetchService { private map(results: TradeFetchHttpResult[], url: string, total: number, checkExchange: boolean): TradeFetchResponse { const entries = results.filter(result => { if (!result?.listing) { - console.log(`Listing was null or undefined.`, result); + console.log(`Listing was null or undefined. ${JSON.stringify(result)}`, result); return false; } if (!moment(result.listing.indexed).isValid()) { - console.log(`Indexed was not a valid date.`, result); + console.log(`Indexed was not a valid date. ${JSON.stringify(result)}`, result); return false; } if (!result.listing.account?.name?.length) { - console.log(`Account name was empty or undefined.`, result); + console.log(`Account name was empty or undefined. ${JSON.stringify(result)}`, result); return false; } const { price } = result.listing; if (!price) { - console.log(`Price was null or undefined.`, result); + console.log(`Price was null or undefined. ${JSON.stringify(result)}`, result); return false; } if (checkExchange) { const { exchange } = price; if (!exchange) { - console.log(`Price exchange was null or undefined.`, result); + console.log(`Price exchange was null or undefined. ${JSON.stringify(result)}`, result); return false; } if (!exchange.currency?.length) { - console.log(`Price exchange currency was empty or undefined.`, result); + console.log(`Price exchange currency was empty or undefined. ${JSON.stringify(result)}`, result); return false; } if (exchange.amount === null || exchange.amount === undefined || exchange.amount === 0) { - console.log(`Price exchange amount was null or undefined or zero.`, result); + console.log(`Price exchange amount was null or undefined or zero. ${JSON.stringify(result)}`, result); return false; } const { item } = price; if (!item) { - console.log(`Price item was null or undefined.`, result); + console.log(`Price item was null or undefined. ${JSON.stringify(result)}`, result); return false; } if (!item.currency?.length) { - console.log(`Price item currency was empty or undefined.`, result); + console.log(`Price item currency was empty or undefined. ${JSON.stringify(result)}`, result); return false; } if (item.amount === null || item.amount === undefined || item.amount <= 0) { - console.log(`Price item amount was null or undefined or zero.`, result); + console.log(`Price item amount was null or undefined or zero. ${JSON.stringify(result)}`, result); return false; } if (item.stock === null || item.stock === undefined || item.stock <= 0) { - console.log(`Price item stock was null or undefined or zero.`, result); + console.log(`Price item stock was null or undefined or zero. ${JSON.stringify(result)}`, result); return false; } } else { if (price.amount === null || price.amount === undefined || price.amount <= 0) { - console.log(`Price amount was null or undefined or zero.`, result); + console.log(`Price amount was null or undefined or zero. ${JSON.stringify(result)}`, result); return false; } if (!price.currency?.length) { - console.log(`Price currency was empty or undefined.`, result); + console.log(`Price currency was empty or undefined. ${JSON.stringify(result)}`, result); return false; } } if (!result.item?.icon?.length) { - console.log(`Item icon was empty or undefined.`, result); + console.log(`Item icon was empty or undefined. ${JSON.stringify(result)}`, result); return false; } return true; @@ -164,7 +167,7 @@ export class TradeFetchService { }, item: { icon: item.icon.replace(/\\/g, ''), - text: text ? atob(text) : '', + text: text ? b64DecodeUnicode(text) : '', hashes: Object .getOwnPropertyNames(hashes || {}) .reduce((a, b) => a.concat(hashes[b].map(([hash]) => hash)), []) diff --git a/src/app/shared/module/poe/trade/index.ts b/src/app/shared/module/poe/trade/index.ts index 49b58add..980c9a3d 100644 --- a/src/app/shared/module/poe/trade/index.ts +++ b/src/app/shared/module/poe/trade/index.ts @@ -10,6 +10,7 @@ export * from './leagues/trade-leagues.service'; export * from './search/trade-search'; export * from './search/trade-search-options'; export * from './search/trade-search-request.service'; +export * from './search/trade-search.pipe'; export * from './search/trade-search.service'; export * from './statics/trade-statics'; export * from './statics/trade-statics.service'; diff --git a/src/app/shared/module/poe/trade/search/query/trade-search-filter-map.service.ts b/src/app/shared/module/poe/trade/search/query/trade-search-filter-map.service.ts index e481a391..4b32bd71 100644 --- a/src/app/shared/module/poe/trade/search/query/trade-search-filter-map.service.ts +++ b/src/app/shared/module/poe/trade/search/query/trade-search-filter-map.service.ts @@ -18,23 +18,35 @@ export class TradeSearchFilterMapService implements TradeSearchFilterService { const { mapTier } = item.properties; if (mapTier) { - const { min, max } = mapTier; - query.filters.map_filters.filters.map_tier = { min, max }; + const { min, max, value } = mapTier; + query.filters.map_filters.filters.map_tier = { + min: min ? min : value, + max: max ? max : value + }; } const { mapQuantity } = item.properties; if (mapQuantity) { - const { min, max } = mapQuantity; - query.filters.map_filters.filters.map_iiq = { min, max }; + const { min, max, value } = mapQuantity; + query.filters.map_filters.filters.map_iiq = { + min: min ? min : value, + max: max ? max : value + }; } const { mapRarity } = item.properties; if (mapRarity) { - const { min, max } = mapRarity; - query.filters.map_filters.filters.map_iir = { min, max }; + const { min, max, value } = mapRarity; + query.filters.map_filters.filters.map_iir = { + min: min ? min : value, + max: max ? max : value + }; } const { mapPacksize } = item.properties; if (mapPacksize) { - const { min, max } = mapPacksize; - query.filters.map_filters.filters.map_packsize = { min, max }; + const { min, max, value } = mapPacksize; + query.filters.map_filters.filters.map_packsize = { + min: min ? min : value, + max: max ? max : value + }; } } } diff --git a/src/app/shared/module/poe/trade/search/trade-search.pipe.ts b/src/app/shared/module/poe/trade/search/trade-search.pipe.ts new file mode 100644 index 00000000..8b78e91c --- /dev/null +++ b/src/app/shared/module/poe/trade/search/trade-search.pipe.ts @@ -0,0 +1,103 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { RARITIES, TradeSearchRequest, TYPES as CATEGORIES } from './trade-search'; + +@Pipe({ + name: 'tradeSearchText' +}) +export class TradeSearchTextPipe implements PipeTransform { + public transform(request: TradeSearchRequest): string { + const parts = []; + const { query } = request; + if (query) { + if (query.name?.length || query.type?.length) { + const text = []; + if (query.name?.length) { + text.push(query.name); + } + if (query.type?.length) { + text.push(query.type); + } + parts.push(text.join(' ')); + } else { + parts.push('Any'); + } + + const { filters } = query; + if (filters) { + parts.push(' ('); + + const { type_filters } = filters; + parts.push('Type: '); + if (type_filters?.filters?.category || type_filters?.filters?.rarity) { + const type = []; + if (type_filters.filters.category?.option?.length) { + type.push(CATEGORIES[type_filters.filters.category.option]); + } + if (type_filters.filters.rarity?.option?.length) { + type.push(RARITIES[type_filters.filters.rarity.option]); + } + parts.push(type.join(' with ')); + } else { + parts.push('Any'); + } + + const { socket_filters } = filters; + parts.push(', Sockets: '); + if (socket_filters?.filters?.sockets) { + const { sockets } = socket_filters.filters; + const socket = []; + if (sockets.r) { + socket.push(`R${sockets.r}`); + } + if (sockets.g) { + socket.push(`G${sockets.g}`); + } + if (sockets.b) { + socket.push(`B${sockets.b}`); + } + if (sockets.w) { + socket.push(`W${sockets.w}`); + } + if (sockets.min) { + socket.push(`Min${sockets.min}`); + } + if (sockets.max) { + socket.push(`Max${sockets.max}`); + } + parts.push(socket.join(' ')); + } else { + parts.push('Any'); + } + + parts.push(', Links: '); + if (socket_filters?.filters?.links) { + const { links } = socket_filters.filters; + const link = []; + if (links.r) { + link.push(`R${links.r}`); + } + if (links.g) { + link.push(`G${links.g}`); + } + if (links.b) { + link.push(`B${links.b}`); + } + if (links.w) { + link.push(`W${links.w}`); + } + if (links.min) { + link.push(`Min${links.min}`); + } + if (links.max) { + link.push(`Max${links.max}`); + } + parts.push(link.join('-')); + } else { + parts.push('Any'); + } + parts.push(')'); + } + } + return parts.join(''); + } +} diff --git a/src/app/shared/module/poe/trade/search/trade-search.ts b/src/app/shared/module/poe/trade/search/trade-search.ts index 1b5b80a9..6062fe57 100644 --- a/src/app/shared/module/poe/trade/search/trade-search.ts +++ b/src/app/shared/module/poe/trade/search/trade-search.ts @@ -1,5 +1,70 @@ import { Language, TradeSearchHttpRequest } from '@data/poe/schema'; +export const TYPES = { + weapon: 'Any Weapon', + 'weapon.one': 'One-Handed Weapon', + 'weapon.onemelee': 'One-Handed Melee Weapon', + 'weapon.twomelee': 'Two-Handed Melee Weapon', + 'weapon.bow': 'Bow', + 'weapon.claw': 'Claw', + 'weapon.dagger': 'Any Dagger', + 'weapon.runedagger': 'Rune Dagger', + 'weapon.oneaxe': 'One-Handed Axe', + 'weapon.onemac': 'One-Handed Mac', + 'weapon.onesword': 'One-Handed Sword', + 'weapon.sceptre': 'Sceptre', + 'weapon.staff': 'Any Staff', + 'weapon.warstaff': 'Warstaff', + 'weapon.twoaxe': 'Two-Handed Axe', + 'weapon.twomac': 'Two-Handed Mac', + 'weapon.twosword': 'Two-Handed Sword', + 'weapon.wand': 'Wand', + 'weapon.rod': 'Fishing Rod', + armour: 'Any Armour', + 'armour.chest': 'Body Armour', + 'armour.boots': 'Boots', + 'armour.gloves': 'Gloves', + 'armour.helmet': 'Helmet', + 'armour.shield': 'Shield', + 'armour.quiver': 'Quiver', + accessory: 'Any Accessory', + 'accessory.amulet': 'Amulet', + 'accessory.belt': 'Belt', + 'accessory.ring': 'Ring', + gem: 'Any Gem', + 'gem.activegem': 'Skill Gem', + 'gem.supportgem': 'Support Gem', + 'gem.supportgemplus': 'Awakened Support Gem', + jewel: 'Any Jewel', + 'jewel.base': 'Base Jewel', + 'jewel.abyss': 'Abyss Jewel', + 'jewel.cluster': 'Cluster Jewel', + flask: 'Flask', + map: 'Map', + 'map.fragment': 'Map Fragment', + 'map.scarab': 'Scarab', + watchstone: 'Watchstone', + leaguestone: 'Leaguestone', + prophecy: 'Prophecy', + card: 'Card', + 'monster.beast': 'Captured Beast', + 'monster.sample': 'Metamorph Sample', + currency: 'Any Currency', + 'currency.piece': 'Unique Fragment', + 'currency.resonator': 'Resonator', + 'currency.fossil': 'Fossil', + 'currency.incubator': 'Incubator', +}; + +export const RARITIES = { + normal: 'Normal', + magic: 'Magic', + rare: 'Rare', + unique: 'Unique', + uniquefoil: 'Unique (Relic)', + nonunique: 'Any Non-Unique', +}; + export interface TradeSearchResponse { id: string; url: string; diff --git a/src/assets/audio/notification.wav b/src/assets/audio/notification.wav deleted file mode 100644 index 51898614..00000000 Binary files a/src/assets/audio/notification.wav and /dev/null differ diff --git a/src/assets/i18n/english.json b/src/assets/i18n/english.json index 4273e19c..132d8e02 100644 --- a/src/assets/i18n/english.json +++ b/src/assets/i18n/english.json @@ -4,6 +4,10 @@ "message": "Opens a webpage on hotkey press in the in-game browser.\n\nTry the hotkey below to open poe.ninja.", "title": "Bookmarks" }, + "changelog-1-0-8": { + "message": "- added support for the new cluster jewels stats\n- added a new hotkey (default on F10) to manually capture replays\n- added a toggle to disable the leaving of a party via kick using the trade finished action\n- added a audio button at the trade settings to customize the notification sound\n- added a lower opacity for market results once they have been requested\n- added the seller name for items and bulk exchanges at the market\n- fixed an issue at the market type filter resulting in a unknown category error", + "title": "What's new in 1.0.8?" + }, "commands": { "message": "All game commands can be bound to hotkeys.\n\nThere are also placeholders like @char available which will be replaced before executing the command.\n\nTry the hotkey below to teleport into your hideout.", "title": "Commands" @@ -28,7 +32,7 @@ "title": "Properties" }, "search": { - "message": "The search show all listings based on your filters.\n\nYou can choose between a graphical or a list view.\nThe graph view groups the items based on their price and displays the count of those groups. The list view simply shows the listing sorted by the amount.\nBoth views are additional filtered for potential price fixers by grouping their listing into one.\n\nBy clicking a listing - a formatted price note will be copied to your clipboard.", + "message": "The search shows all listings based on your filters.\n\nYou can choose between a graphical or a list view.\nThe graph view groups the items based on their price and displays the count of those groups. The list view simply shows the listing sorted by the amount.\nBoth views are additionally filtered for potential price fixers by grouping their listing into one.\n\nBy clicking a listing - a formatted price note will be copied to your clipboard.", "title": "Search" }, "settings": { @@ -105,6 +109,10 @@ "message": "Open the settings window by pressing following hotkey:", "title": "Settings" }, + "support": { + "message": "Do you have a question? Or do you want to request a new feature?\n\nCheck the support tab at the settings menu for further information.\n\nAlso if you love the app, consider supporting me by subscribing.", + "title": "Support" + }, "thanks": { "message": "That's it for now. Hope you enjoy my app. \n\n- Best regards, Kyusung4698", "title": "Thank you!" @@ -272,6 +280,9 @@ "event": { "start-error": "Could not start listening to game events." }, + "footer": { + "support": "Support" + }, "help": { "browser": "Holding CTRL while clicking will open the link in the default browser.", "browser-title": "How do i open the search in my default browser?", @@ -313,6 +324,7 @@ }, "market": { "bar": { + "history": "History", "reset": "Clear filter", "search": "Search", "toggle": "Toggle filter" @@ -359,6 +371,7 @@ "death": "Death event", "future-duration": "Future duration", "kill": "Kill event", + "manually": "Manually", "name": "Replay", "past-duration": "Past duration", "start-error": "The events capturing could not be started.", @@ -371,6 +384,7 @@ "auto-download": "Download update automatically", "auto-launch": "Run on Boot", "cancel": "Cancel", + "character-name": "Character Name Fallback ", "dialog": "Dialog", "dialog-opacity": "Dialog Opacity", "dialog-spawn-position": { @@ -402,9 +416,24 @@ "ui-language": "UI Language", "zoom": "Zoom" }, + "support": { + "developer": { + "open": "Open the Subscription Page", + "text": "If you love the app, consider supporting me by subscribing. This will allow me to spend more time developing this app and keep it up-to-date. You will also get early access to new features.", + "title": "Support the Developer" + }, + "name": "Support", + "question": { + "discord": "Join the Discord-Community", + "github": "Submit an Issue at the GitHub Project", + "text": "You have a question? Or do you want to request a new feature?", + "title": "Get Support" + } + }, "trade": { "action": { "finished": "Thanks and Goodbye", + "hideout": "Go to seller hideout", "interested": "Still interested?", "invite": "Invite", "item-gone": "Item gone", @@ -414,6 +443,7 @@ "wait": "Wait?", "whisper": "Whisper" }, + "actions": "Actions", "analyzing": "Analyzing data...", "empty": "No results. Open in browser?", "enabled": "Enabled", @@ -423,12 +453,25 @@ "rate": "Limit reached. Please try again later.\nIf this keeps happening please try lowering the fetched item count. " }, "fetching": "Found {{total}}. Fetching {{count}} entries...", + "filter": "Filter", + "filters": { + "incoming": "Incoming", + "incomingoutgoing": "Incoming & Outgoing" + }, + "height": "Height", + "layout": "Layout", + "layouts": { + "bottomtotop": "Bottom To Top", + "toptobottom": "Top To Bottom" + }, + "leave-party": "Leave party once finished", "message": { "item-gone": "Item gone message", "still-interested": "Still interested message", "thanks": "Thanks message", "wait": "Wait message" }, + "messages": "Messages", "name": "Trade", "no-price": "No price", "not-found": "No data found.", diff --git a/src/assets/i18n/french.json b/src/assets/i18n/french.json index 01dcbc95..097fc570 100644 --- a/src/assets/i18n/french.json +++ b/src/assets/i18n/french.json @@ -28,7 +28,7 @@ "title": "Propriétés" }, "search": { - "message": "La recherche affiche toutes les annonces en fonction de vos filtres.\n\nVous pouvez choisir entre une vue graphique ou une vue de liste.\nLa vue graphique regroupe les articles en fonction de leur prix et affiche le nombre de ces groupes. La vue liste montre simplement la liste triée par le montant.\nLes deux vues sont filtrées supplémentaires pour les fixateurs de prix potentiels en regroupant leur liste en une seule.\n\nEn cliquant sur une liste - une note de prix formatée sera copiée dans votre presse-papiers.", + "message": "La recherche affiche toutes les annonces en fonction de vos filtres.\n\nVous pouvez choisir entre une vue graphique ou une vue de liste.\nLa vue graphique regroupe les articles en fonction de leur prix et affiche le nombre de ces groupes. La vue liste affiche simplement la liste triée par montant.\nLes deux vues sont en outre filtrées pour les fixateurs de prix potentiels en regroupant leur liste en une seule.\n\nEn cliquant sur une liste - une note de prix formatée sera copiée dans votre presse-papiers.", "title": "Chercher" }, "settings": { @@ -68,7 +68,7 @@ }, "filter": { "message": "Cliquez sur l'icône en surbrillance pour ouvrir le filtre. Ajustez les valeurs à votre guise.", - "title": "" + "title": "Filtre" }, "message": "Le marché vous permet de parcourir les articles listés et d'échanger des devises dans le jeu.\n\nPeut être basculé en appuyant sur la touche de raccourci ci-dessous:", "reset": { @@ -105,9 +105,13 @@ "message": "Ouvrez la fenêtre des paramètres en appuyant sur la touche de raccourci suivante:", "title": "Réglages" }, + "support": { + "message": "As-tu une question? Ou souhaitez-vous demander une nouvelle fonctionnalité?\n\nVérifiez l'onglet d'assistance dans le menu des paramètres pour plus d'informations.\n\nAussi, si vous aimez l'application, pensez à me soutenir en vous abonnant.", + "title": "Soutien" + }, "thanks": { "message": "C'est tout pour le moment. J'espère que vous apprécierez mon application.\n\n- Cordialement, Kyusung4698", - "title": "" + "title": "Je vous remercie!" }, "trade": { "highlight": { @@ -272,6 +276,9 @@ "event": { "start-error": "Impossible de commencer à écouter les événements du jeu." }, + "footer": { + "support": "Soutien" + }, "help": { "browser": "Maintenir CTRL tout en cliquant ouvrira le lien dans le navigateur par défaut.", "browser-title": "Comment ouvrir la recherche dans mon navigateur par défaut?", @@ -313,6 +320,7 @@ }, "market": { "bar": { + "history": "L'histoire", "reset": "Effacer le filtre", "search": "Chercher", "toggle": "Basculer le filtre" @@ -359,6 +367,7 @@ "death": "Événement de décès", "future-duration": "Durée future", "kill": "Tuer l'événement", + "manually": "Manuellement", "name": "Rejouer", "past-duration": "Durée passée", "start-error": "La capture des événements n'a pas pu démarrer.", @@ -371,6 +380,7 @@ "auto-download": "Télécharger la mise à jour automatiquement", "auto-launch": "Exécuter au démarrage", "cancel": "Annuler", + "character-name": "Nom du personnage Fallback", "dialog": "Dialogue", "dialog-opacity": "Opacité de la boîte de dialogue", "dialog-spawn-position": { @@ -402,9 +412,24 @@ "ui-language": "Langue de l'interface utilisateur", "zoom": "Zoom" }, + "support": { + "developer": { + "open": "Ouvrez la page d'abonnement", + "text": "Si vous aimez l'application, pensez à me soutenir en vous abonnant. Cela me permettra de passer plus de temps à développer cette application et à la maintenir à jour. Vous aurez également un accès anticipé à de nouvelles fonctionnalités.", + "title": "Soutenez le développeur" + }, + "name": "Soutien", + "question": { + "discord": "Rejoignez la communauté Discord", + "github": "Soumettre un problème au projet GitHub", + "text": "Tu as une question? Ou souhaitez-vous demander une nouvelle fonctionnalité?", + "title": "Obtenir de l'aide" + } + }, "trade": { "action": { "finished": "Merci et au revoir", + "hideout": "Accéder à la cachette du vendeur", "interested": "Toujours intéressé?", "invite": "Inviter", "item-gone": "Élément disparu", @@ -414,6 +439,7 @@ "wait": "Attendre?", "whisper": "Chuchotement" }, + "actions": "actes", "analyzing": "Analyse des données ...", "empty": "Aucun résultat. Ouvrir dans le navigateur?", "enabled": "Activée", @@ -423,12 +449,25 @@ "rate": "Limite atteinte. Veuillez réessayer plus tard.\nSi cela continue, essayez de réduire le nombre d'articles récupérés." }, "fetching": " {{total}}trouvé. Récupération de {{count}} entrées ...", + "filter": "Filtre", + "filters": { + "incoming": "Entrant", + "incomingoutgoing": "Entrant sortant" + }, + "height": "la taille", + "layout": "Disposition", + "layouts": { + "bottomtotop": "De bas en haut", + "toptobottom": "De haut en bas" + }, + "leave-party": "Quitter la fête une fois terminé", "message": { "item-gone": "Message d'élément disparu", "still-interested": "Message toujours intéressé", "thanks": "Message de remerciement", "wait": "Message d'attente" }, + "messages": "messages", "name": "commerce", "no-price": "Pas de prix", "not-found": "Aucune donnée disponible.", diff --git a/src/assets/i18n/german.json b/src/assets/i18n/german.json index 4f723aa3..eb1a7b78 100644 --- a/src/assets/i18n/german.json +++ b/src/assets/i18n/german.json @@ -28,7 +28,7 @@ "title": "Eigenschaften" }, "search": { - "message": "Die Suche zeigt alle Einträge basierend auf Ihren Filtern.\n\nSie können zwischen einer grafischen oder einer Listenansicht wählen.\nIn der Diagrammansicht werden die Artikel anhand ihres Preises gruppiert und die Anzahl dieser Gruppen angezeigt. Die Listenansicht zeigt einfach die Auflistung sortiert nach dem Betrag.\nBeide Ansichten werden zusätzlich nach potenziellen Preisfixierern gefiltert, indem ihre Auflistung in einer zusammengefasst wird.\n\nDurch Klicken auf eine Liste wird eine formatierte Preisnotiz in Ihre Zwischenablage kopiert.", + "message": "Die Suche zeigt alle Einträge basierend auf Ihren Filtern.\n\nSie können zwischen einer grafischen oder einer Listenansicht wählen.\nIn der Diagrammansicht werden die Artikel anhand ihres Preises gruppiert und die Anzahl dieser Gruppen angezeigt. Die Listenansicht zeigt einfach die Auflistung sortiert nach dem Betrag.\nBeide Ansichten werden zusätzlich nach potenziellen Preisfixierern gefiltert, indem ihre Auflistung in einer zusammengefasst wird.\n\nDurch Klicken auf eine Auflistung wird eine formatierte Preisnotiz in Ihre Zwischenablage kopiert.", "title": "Suche" }, "settings": { @@ -68,7 +68,7 @@ }, "filter": { "message": "Klicken Sie auf das hervorgehobene Symbol, um den Filter zu öffnen. Passen Sie die Werte an Ihre Bedürfnisse an.", - "title": "" + "title": "Filter" }, "message": "Auf dem Markt können Sie aufgelistete Gegenstände durchsuchen und Währungen im Spiel austauschen.\n\nKann durch Drücken des folgenden Hotkeys umgeschaltet werden:", "reset": { @@ -105,9 +105,13 @@ "message": "Öffnen Sie das Einstellungsfenster, indem Sie den folgenden Hotkey drücken:", "title": "Einstellungen" }, + "support": { + "message": "Hast du eine Frage? Oder möchten Sie eine neue Funktion anfordern?\n\nWeitere Informationen finden Sie auf der Registerkarte Support im Einstellungsmenü.\n\nWenn Sie die App lieben, können Sie mich durch ein Abonnement unterstützen.", + "title": "Unterstützung" + }, "thanks": { "message": "Das war es fürs Erste. Hoffe dir gefällt meine App.\n\n- Mit freundlichen Grüßen, Kyusung4698", - "title": "" + "title": "Vielen Dank!" }, "trade": { "highlight": { @@ -272,6 +276,9 @@ "event": { "start-error": "Spielereignisse konnten nicht angehört werden." }, + "footer": { + "support": "Unterstützung" + }, "help": { "browser": "Wenn Sie beim Klicken die STRG-Taste gedrückt halten, wird der Link im Standardbrowser geöffnet.", "browser-title": "Wie öffne ich die Suche in meinem Standardbrowser?", @@ -313,6 +320,7 @@ }, "market": { "bar": { + "history": "Geschichte", "reset": "Filter löschen", "search": "Suche", "toggle": "Filter umschalten" @@ -359,6 +367,7 @@ "death": "Todesereignis", "future-duration": "Zukünftige Dauer", "kill": "Tötungsereignis", + "manually": "Manuell", "name": "Wiederholung", "past-duration": "Vergangene Dauer", "start-error": "Die Ereigniserfassung konnte nicht gestartet werden.", @@ -371,6 +380,7 @@ "auto-download": "Update automatisch herunterladen", "auto-launch": "Beim Booten ausführen", "cancel": "Abbrechen", + "character-name": "Charaktername Fallback", "dialog": "Dialog", "dialog-opacity": "Dialogopazität", "dialog-spawn-position": { @@ -402,9 +412,24 @@ "ui-language": "Sprache der Benutzeroberfläche", "zoom": "Skalierung" }, + "support": { + "developer": { + "open": "Öffnen Sie die Abonnementseite", + "text": "Wenn Sie die App lieben, können Sie mich durch ein Abonnement unterstützen. Dadurch kann ich mehr Zeit für die Entwicklung dieser App aufwenden und sie auf dem neuesten Stand halten. Sie erhalten auch frühzeitig Zugriff auf neue Funktionen.", + "title": "Unterstützen Sie den Entwickler" + }, + "name": "Unterstützung", + "question": { + "discord": "Tritt der Discord-Community bei", + "github": "Senden Sie ein Problem beim GitHub-Projekt", + "text": "Hast du eine Frage? Oder möchten Sie eine neue Funktion anfordern?", + "title": "Holen Sie sich Unterstützung" + } + }, "trade": { "action": { "finished": "Danke und auf Wiedersehen", + "hideout": "Gehe zum Versteck des Verkäufers", "interested": "Noch interessiert?", "invite": "Einladen", "item-gone": "Gegenstand weg", @@ -414,6 +439,7 @@ "wait": "Warten?", "whisper": "Flüstern" }, + "actions": "Aktionen", "analyzing": "Daten analysieren...", "empty": "Keine Ergebnisse. Im Browser öffnen?", "enabled": "aktiviert", @@ -423,12 +449,25 @@ "rate": "Limit erreicht. Bitte versuchen Sie es später noch einmal.\nWenn dies weiterhin geschieht, versuchen Sie bitte, die Anzahl der abgerufenen Artikel zu verringern." }, "fetching": "Gefunden {{total}}. {{count}} Einträge abrufen ...", + "filter": "Filter", + "filters": { + "incoming": "Eingehend", + "incomingoutgoing": "Eingehend und ausgehend" + }, + "height": "Höhe", + "layout": "Layout", + "layouts": { + "bottomtotop": "unten nach oben", + "toptobottom": "Oben nach unten" + }, + "leave-party": "Verlasse die Party, sobald du fertig bist", "message": { "item-gone": "Artikel weg Nachricht", "still-interested": "Immer noch interessierte Nachricht", "thanks": "Danke Nachricht", "wait": "Warte Nachricht" }, + "messages": "Mitteilungen", "name": "Handel", "no-price": "Kein Preis", "not-found": "Keine Daten gefunden.", diff --git a/src/assets/i18n/korean.json b/src/assets/i18n/korean.json index 2d048538..eb5b88f4 100644 --- a/src/assets/i18n/korean.json +++ b/src/assets/i18n/korean.json @@ -68,7 +68,7 @@ }, "filter": { "message": "강조 표시된 아이콘을 클릭하여 필터를 엽니 다. 원하는대로 값을 조정하십시오.", - "title": "" + "title": "필터" }, "message": "시장에서는 게임 내에서 나열된 항목을 찾아보고 통화를 교환 할 수 있습니다.\n\n아래 핫키를 눌러 전환 할 수 있습니다.", "reset": { @@ -105,9 +105,13 @@ "message": "다음 핫키를 눌러 설정 창을 엽니 다.", "title": "설정" }, + "support": { + "message": "질문 있습니까? 아니면 새로운 기능을 요청 하시겠습니까?\n\n자세한 내용은 설정 메뉴에서 지원 탭을 확인하십시오.\n\n또한 당신이 응용 프로그램을 사랑한다면, 가입하여 나를 지원하는 것을 고려하십시오.", + "title": "지원하다" + }, "thanks": { "message": "그게 다야. 내 앱을 즐기시기 바랍니다.\n\n-Kyusung4698 감사합니다", - "title": "" + "title": "고맙습니다!" }, "trade": { "highlight": { @@ -272,6 +276,9 @@ "event": { "start-error": "게임 이벤트를들을 수 없습니다." }, + "footer": { + "support": "지원하다" + }, "help": { "browser": "클릭하는 동안 CTRL을 누르고 있으면 기본 브라우저에서 링크가 열립니다.", "browser-title": "기본 브라우저에서 검색을 열려면 어떻게합니까?", @@ -313,6 +320,7 @@ }, "market": { "bar": { + "history": "역사", "reset": "필터 지우기", "search": "수색", "toggle": "필터 전환" @@ -359,6 +367,7 @@ "death": "죽음의 사건", "future-duration": "향후 기간", "kill": "킬 이벤트", + "manually": "수동으로", "name": "다시 하다", "past-duration": "지난 기간", "start-error": "이벤트 캡처를 시작할 수 없습니다.", @@ -371,6 +380,7 @@ "auto-download": "업데이트 자동 다운로드", "auto-launch": "부팅시 실행", "cancel": "취소", + "character-name": "캐릭터 이름 대체", "dialog": "대화", "dialog-opacity": "대화 상자 불투명도", "dialog-spawn-position": { @@ -402,9 +412,24 @@ "ui-language": "UI 언어", "zoom": "줌" }, + "support": { + "developer": { + "open": "구독 페이지를여십시오", + "text": "당신이 응용 프로그램을 사랑한다면, 가입하여 나를 지원하는 것을 고려하십시오. 이를 통해이 앱을 개발하는 데 더 많은 시간을 할애하고 최신 상태로 유지할 수 있습니다. 또한 새로운 기능에 일찍 액세스 할 수 있습니다.", + "title": "개발자 지원" + }, + "name": "지원하다", + "question": { + "discord": "불화 커뮤니티에 참여", + "github": "GitHub 프로젝트에서 이슈 제출", + "text": "질문이 있습니까? 아니면 새로운 기능을 요청 하시겠습니까?", + "title": "지원을 받다" + } + }, "trade": { "action": { "finished": "감사와 안녕", + "hideout": "판매자 은신처로 이동", "interested": "여전히 관심이 있습니까?", "invite": "초대", "item-gone": "사라진 항목", @@ -414,6 +439,7 @@ "wait": "기다림?", "whisper": "속삭임" }, + "actions": "행위", "analyzing": "데이터 분석 중 ...", "empty": "결과가 없습니다. 브라우저에서 열려?", "enabled": "사용", @@ -423,12 +449,25 @@ "rate": "한도에 도달했습니다. 나중에 다시 시도하십시오.\n이 문제가 계속 발생하면 가져온 품목 수를 줄이십시오." }, "fetching": " {{total}}을 (를) 찾았습니다. {{count}} 항목을 가져 오는 중 ...", + "filter": "필터", + "filters": { + "incoming": "들어오는", + "incomingoutgoing": "수신 및 발신" + }, + "height": "신장", + "layout": "형세", + "layouts": { + "bottomtotop": "아래에서 위로", + "toptobottom": "위에서 아래로" + }, + "leave-party": "파티가 끝나면 퇴장", "message": { "item-gone": "사라진 항목 메시지", "still-interested": "여전히 관심있는 메시지", "thanks": "감사 메시지", "wait": "대기 메시지" }, + "messages": "메시지", "name": "무역", "no-price": "가격 없음", "not-found": "데이터가 없습니다.", diff --git a/src/assets/i18n/polish.json b/src/assets/i18n/polish.json index 46cbc18a..33cf1989 100644 --- a/src/assets/i18n/polish.json +++ b/src/assets/i18n/polish.json @@ -68,7 +68,7 @@ }, "filter": { "message": "Kliknij podświetloną ikonę, aby otworzyć filtr. Dostosuj wartości do swoich potrzeb.", - "title": "" + "title": "filtr" }, "message": "Rynek pozwala przeglądać wymienione przedmioty i wymieniać waluty w grze.\n\nMożna go przełączać, naciskając poniższy skrót:", "reset": { @@ -105,9 +105,13 @@ "message": "Otwórz okno ustawień, naciskając następujący skrót:", "title": "Ustawienia" }, + "support": { + "message": "Masz pytanie? A może chcesz poprosić o nową funkcję?\n\nSprawdź kartę pomocy w menu ustawień, aby uzyskać dodatkowe informacje.\n\nRównież jeśli podoba Ci się aplikacja, rozważ wsparcie, subskrybując ją.", + "title": "Wsparcie" + }, "thanks": { "message": "Na razie tyle. Mam nadzieję, że podoba Ci się moja aplikacja.\n\n- Z pozdrowieniami, Kyusung4698", - "title": "" + "title": "Dziękuję Ci!" }, "trade": { "highlight": { @@ -272,6 +276,9 @@ "event": { "start-error": "Nie można rozpocząć słuchania wydarzeń z gry." }, + "footer": { + "support": "Wsparcie" + }, "help": { "browser": "Kliknięcie z wciśniętym klawiszem CTRL, spowoduje otwarcie odnośnika w domyślnej przeglądarce.", "browser-title": "Jak mogę otworzyć wyszukiwanie w domyślnej przeglądarce?", @@ -313,6 +320,7 @@ }, "market": { "bar": { + "history": "Historia", "reset": "Czysty filtr", "search": "Szukaj", "toggle": "Przełącz filtr" @@ -359,6 +367,7 @@ "death": "Zdarzenie śmierci", "future-duration": "Przyszły czas trwania", "kill": "Zabij zdarzenie", + "manually": "ręcznie", "name": "Powtórna rozgrywka", "past-duration": "Czas przeszły", "start-error": "Nie można rozpocząć przechwytywania zdarzeń.", @@ -371,6 +380,7 @@ "auto-download": "Pobierz aktualizację automatycznie", "auto-launch": "Uruchom wraz ze startem systemu", "cancel": "Anuluj", + "character-name": "Nazwa postaci Fallback", "dialog": "Okno dialogowe", "dialog-opacity": "Okno dialogowe Krycie", "dialog-spawn-position": { @@ -402,9 +412,24 @@ "ui-language": "Język programu", "zoom": "Powiększenie" }, + "support": { + "developer": { + "open": "Otwórz stronę subskrypcji", + "text": "Jeśli podoba Ci się aplikacja, rozważ wsparcie, subskrybując ją. Pozwoli mi to poświęcić więcej czasu na rozwijanie tej aplikacji i aktualizowanie jej. Otrzymasz również wczesny dostęp do nowych funkcji.", + "title": "Wspieraj programistę" + }, + "name": "Wsparcie", + "question": { + "discord": "Dołącz do społeczności Discord", + "github": "Prześlij problem w GitHub Project", + "text": "Masz pytanie? A może chcesz poprosić o nową funkcję?", + "title": "Uzyskać wsparcie" + } + }, "trade": { "action": { "finished": "Dzięki i do widzenia", + "hideout": "Idź do kryjówki sprzedawcy", "interested": "Nadal jesteś zainteresowany?", "invite": "Zapraszam", "item-gone": "Element zniknął", @@ -414,6 +439,7 @@ "wait": "Czekać?", "whisper": "Szept" }, + "actions": "działania", "analyzing": "Analiza danych ...", "empty": "Brak wyników. Otworzyć w przeglądarce?", "enabled": "Włączone", @@ -423,12 +449,25 @@ "rate": "Limit osiągnięty. Spróbuj ponownie później.\nJeśli problem nadal występuje, spróbuj zmniejszyć liczbę pobieranych ofert sprzedaży." }, "fetching": "Znaleziono {{total}}. Pobieranie {{count}} aukcji ...", + "filter": "filtr", + "filters": { + "incoming": "Przychodzące", + "incomingoutgoing": "Przychodzące i wychodzące" + }, + "height": "Wysokość", + "layout": "Układ", + "layouts": { + "bottomtotop": "Od dołu do góry", + "toptobottom": "Od góry do dołu" + }, + "leave-party": "Po zakończeniu opuść imprezę", "message": { "item-gone": "Wiadomość zniknęła z produktu", "still-interested": "Wciąż zainteresowana wiadomość", "thanks": "Dzięki wiadomość", "wait": "Wiadomość oczekująca" }, + "messages": "Wiadomości", "name": "Handel", "no-price": "Bez ceny", "not-found": "Nie znaleziono danych.", diff --git a/src/assets/i18n/portuguese.json b/src/assets/i18n/portuguese.json index ca032a5c..c951bd07 100644 --- a/src/assets/i18n/portuguese.json +++ b/src/assets/i18n/portuguese.json @@ -28,7 +28,7 @@ "title": "Propriedades" }, "search": { - "message": "A pesquisa mostra todas as listagens com base em seus filtros.\n\nVocê pode escolher entre uma exibição gráfica ou de lista.\nA visualização do gráfico agrupa os itens com base no preço e exibe a contagem desses grupos. A exibição em lista simplesmente mostra a listagem classificada pelo valor.\nAmbas as visualizações são filtradas adicionalmente para possíveis fixadores de preços, agrupando sua listagem em uma.\n\nAo clicar em uma listagem - uma nota de preço formatada será copiada para a área de transferência.", + "message": "A pesquisa mostra todas as listagens com base nos seus filtros.\n\nVocê pode escolher entre uma exibição gráfica ou de lista.\nA visualização do gráfico agrupa os itens com base no preço e exibe a contagem desses grupos. A exibição em lista simplesmente mostra a listagem classificada pelo valor.\nAs duas visualizações são filtradas adicionalmente para possíveis fixadores de preços, agrupando sua listagem em uma.\n\nAo clicar em uma listagem - uma nota de preço formatada será copiada para a área de transferência.", "title": "Procurar" }, "settings": { @@ -68,7 +68,7 @@ }, "filter": { "message": "Clique no ícone destacado para abrir o filtro. Ajuste os valores ao seu gosto.", - "title": "" + "title": "Filtro" }, "message": "O mercado permite que você navegue pelos itens listados e troque moedas dentro do jogo.\n\nPode ser alternado pressionando a tecla de atalho abaixo:", "reset": { @@ -105,9 +105,13 @@ "message": "Abra a janela de configurações pressionando a seguinte tecla de atalho:", "title": "Definições" }, + "support": { + "message": "Você tem uma pergunta? Ou você deseja solicitar um novo recurso?\n\nVerifique a guia de suporte no menu de configurações para obter mais informações.\n\nAlém disso, se você ama o aplicativo, considere apoiar-me assinando.", + "title": "Apoio, suporte" + }, "thanks": { "message": "Por enquanto é isso. Espero que você goste do meu aplicativo.\n\n- Atenciosamente, Kyusung4698", - "title": "" + "title": "Obrigado!" }, "trade": { "highlight": { @@ -272,6 +276,9 @@ "event": { "start-error": "Não foi possível começar a ouvir os eventos do jogo." }, + "footer": { + "support": "Apoio, suporte" + }, "help": { "browser": "Pressionar CTRL enquanto clica abrirá o link no navegador padrão.", "browser-title": "Como abro a pesquisa no meu navegador padrão?", @@ -313,6 +320,7 @@ }, "market": { "bar": { + "history": "história", "reset": "Filtro limpo", "search": "Procurar", "toggle": "Alternar filtro" @@ -359,6 +367,7 @@ "death": "Evento de morte", "future-duration": "Duração futura", "kill": "Matar evento", + "manually": "Manualmente", "name": "Repetir", "past-duration": "Duração passada", "start-error": "A captura de eventos não pôde ser iniciada.", @@ -371,6 +380,7 @@ "auto-download": "Baixar atualização automaticamente", "auto-launch": "Executar na inicialização", "cancel": "Cancelar", + "character-name": "Nome do personagem Fallback", "dialog": "Diálogo", "dialog-opacity": "Opacidade da caixa de diálogo", "dialog-spawn-position": { @@ -402,9 +412,24 @@ "ui-language": "Idioma da interface do usuário", "zoom": "Zoom" }, + "support": { + "developer": { + "open": "Abra a página de inscrição", + "text": "Se você ama o aplicativo, considere apoiar-me assinando. Isso permitirá que eu gaste mais tempo desenvolvendo esse aplicativo e mantenha-o atualizado. Você também terá acesso antecipado a novos recursos.", + "title": "Apoie o desenvolvedor" + }, + "name": "Apoio, suporte", + "question": { + "discord": "Participe da Comunidade Discord", + "github": "Envie um problema no projeto GitHub", + "text": "Você tem uma pergunta? Ou você deseja solicitar um novo recurso?", + "title": "Obter suporte" + } + }, "trade": { "action": { "finished": "Obrigado e adeus", + "hideout": "Ir para o esconderijo do vendedor", "interested": "Ainda interessado?", "invite": "convite", "item-gone": "Item desaparecido", @@ -414,6 +439,7 @@ "wait": "Esperar?", "whisper": "Sussurro" }, + "actions": "Ações", "analyzing": "Analisando dados ...", "empty": "Sem resultados. Abra no navegador?", "enabled": "ativado", @@ -423,12 +449,25 @@ "rate": "Limite alcançado. Por favor, tente novamente mais tarde.\nSe isso continuar acontecendo, tente diminuir a contagem de itens buscados." }, "fetching": "Encontrado {{total}}. Buscando {{count}} entradas ...", + "filter": "Filtro", + "filters": { + "incoming": "Entrada", + "incomingoutgoing": "Entrada saída" + }, + "height": "altura", + "layout": "Layout", + "layouts": { + "bottomtotop": "De baixo para cima", + "toptobottom": "De cima para baixo" + }, + "leave-party": "Sair da festa assim que terminar", "message": { "item-gone": "Mensagem de item desaparecido", "still-interested": "Mensagem ainda interessada", "thanks": "Obrigado mensagem", "wait": "Mensagem de espera" }, + "messages": "Mensagens", "name": "Comércio", "no-price": "Gratuito", "not-found": "Nenhum dado encontrado.", diff --git a/src/assets/i18n/russian.json b/src/assets/i18n/russian.json index 3893907d..fecbc7a4 100644 --- a/src/assets/i18n/russian.json +++ b/src/assets/i18n/russian.json @@ -28,7 +28,7 @@ "title": "свойства" }, "search": { - "message": "Поиск показывает все списки на основе ваших фильтров.\n\nВы можете выбрать между графическим представлением или представлением списка.\nГрафическое представление группирует элементы на основе их цены и отображает количество этих групп. Список просто показывает список, отсортированный по сумме.\nОба представления дополнительно фильтруются для потенциальных фиксаторов цен путем группировки их списка в одно.\n\nПри нажатии на список - отформатированная ценовая заметка будет скопирована в ваш буфер обмена.", + "message": "Поиск показывает все списки на основе ваших фильтров.\n\nВы можете выбрать между графическим представлением или представлением списка.\nГрафическое представление группирует элементы на основе их цены и отображает количество этих групп. Список просто показывает список, отсортированный по сумме.\nОба представления дополнительно фильтруются для потенциальных фиксаторов цен, группируя их листинг в одно.\n\nПри нажатии на листинг - отформатированная ценовая заметка будет скопирована в ваш буфер обмена.", "title": "Поиск" }, "settings": { @@ -68,7 +68,7 @@ }, "filter": { "message": "Нажмите на выделенный значок, чтобы открыть фильтр. Отрегулируйте значения по своему вкусу.", - "title": "" + "title": "Фильтр" }, "message": "Рынок позволяет просматривать перечисленные предметы и обменивать валюты внутри игры.\n\nМожет быть переключено нажатием горячей клавиши ниже:", "reset": { @@ -105,9 +105,13 @@ "message": "Откройте окно настроек, нажав следующую горячую клавишу:", "title": "настройки" }, + "support": { + "message": "У вас есть вопрос? Или вы хотите запросить новую функцию?\n\nПроверьте вкладку поддержки в меню настроек для получения дополнительной информации.\n\nТакже, если вы любите приложение, рассмотрите поддержку меня, подписавшись.", + "title": "служба поддержки" + }, "thanks": { "message": "Это пока что. Надеюсь, вам понравится мое приложение.\n\n- С наилучшими пожеланиями, Kyusung4698", - "title": "" + "title": "Спасибо!" }, "trade": { "highlight": { @@ -272,6 +276,9 @@ "event": { "start-error": "Не могу начать слушать игровые события." }, + "footer": { + "support": "служба поддержки" + }, "help": { "browser": "Удерживая CTRL во время нажатия, вы откроете ссылку в браузере по умолчанию.", "browser-title": "Как открыть поиск в браузере по умолчанию?", @@ -313,6 +320,7 @@ }, "market": { "bar": { + "history": "история", "reset": "Очистить фильтр", "search": "Поиск", "toggle": "Переключить фильтр" @@ -359,6 +367,7 @@ "death": "Событие смерти", "future-duration": "Будущая продолжительность", "kill": "Убить событие", + "manually": "вручную", "name": "переигровка", "past-duration": "Прошлая продолжительность", "start-error": "Захват событий не может быть начат.", @@ -371,6 +380,7 @@ "auto-download": "Скачивать обновления автоматически", "auto-launch": "Запустить на включении", "cancel": "Отменить", + "character-name": "Имя персонажа", "dialog": "Диалог", "dialog-opacity": "Непрозрачность диалога", "dialog-spawn-position": { @@ -402,9 +412,24 @@ "ui-language": "Язык интерфейса", "zoom": "Масштаб" }, + "support": { + "developer": { + "open": "Откройте страницу подписки", + "text": "Если вы любите приложение, рассмотрите поддержку меня, подписавшись. Это позволит мне больше времени уделять разработке этого приложения и поддерживать его в актуальном состоянии. Вы также получите ранний доступ к новым функциям.", + "title": "Поддержи разработчика" + }, + "name": "служба поддержки", + "question": { + "discord": "Присоединяйтесь к Discord-сообществу", + "github": "Отправить вопрос в проекте GitHub", + "text": "У вас есть вопрос? Или вы хотите запросить новую функцию?", + "title": "Получать поддержку" + } + }, "trade": { "action": { "finished": "Спасибо и до свидания", + "hideout": "Перейти к укрытию продавца", "interested": "Все еще заинтересован?", "invite": "приглашение", "item-gone": "Предмет пропал", @@ -414,6 +439,7 @@ "wait": "Подождите?", "whisper": "шептать" }, + "actions": "действия", "analyzing": "Анализ данных...", "empty": "Результатов не найдено. Открыть в браузере?", "enabled": "Включено", @@ -423,12 +449,25 @@ "rate": "Превышен лимит запросов. Пожалуйста, попробуйте позже.\nЕсли это продолжает происходить, попробуйте уменьшить количество предметов в поисковой выдаче." }, "fetching": "Найдено {{total}}. Извлечение {{count}} записей ...", + "filter": "Фильтр", + "filters": { + "incoming": "вступающий", + "incomingoutgoing": "Входящие Исходящие" + }, + "height": "Рост", + "layout": "раскладка", + "layouts": { + "bottomtotop": "Снизу вверх", + "toptobottom": "Сверху вниз" + }, + "leave-party": "Покинуть вечеринку после окончания", "message": { "item-gone": "Сообщение пропало", "still-interested": "Еще интересное сообщение", "thanks": "Спасибо сообщение", "wait": "Ждать сообщения" }, + "messages": "Сообщения", "name": "Сделка", "no-price": "Нет цены", "not-found": "Данные не найдены.", diff --git a/src/assets/i18n/simplified-chinese.json b/src/assets/i18n/simplified-chinese.json index 037b3689..8c37e061 100644 --- a/src/assets/i18n/simplified-chinese.json +++ b/src/assets/i18n/simplified-chinese.json @@ -28,7 +28,7 @@ "title": "属性" }, "search": { - "message": "搜索会根据您的过滤器显示所有列表。\n\n您可以在图形视图或列表视图之间进行选择。\n图形视图根据项目的价格对项目进行分组,并显示这些组的数量。列表视图仅显示按金额排序的列表。\n通过将它们的列表分组为一个,可以为潜在的价格修正者另外过滤两种视图。\n\n通过单击列表-格式化的价格便笺将被复制到剪贴板。", + "message": "搜索将根据您的过滤器显示所有列表。\n\n您可以在图形视图或列表视图之间进行选择。\n图形视图根据项目的价格对项目进行分组,并显示这些组的数量。列表视图仅显示按金额排序的列表。\n通过将它们的列表分组为一个,可以为潜在的价格修正者另外过滤两个视图。\n\n通过单击列表,格式化的价格便笺将被复制到剪贴板。", "title": "搜索" }, "settings": { @@ -68,7 +68,7 @@ }, "filter": { "message": "单击突出显示的图标以打开过滤器。将值调整为您喜欢的值。", - "title": "" + "title": "过滤" }, "message": "市场允许您浏览列出的项目并在游戏中交换货币。\n\n可以通过按以下热键进行切换:", "reset": { @@ -105,9 +105,13 @@ "message": "通过按以下热键打开设置窗口:", "title": "设置" }, + "support": { + "message": "你有问题吗?还是要请求一项新功能?\n\n查看设置菜单上的支持标签以获取更多信息。\n\n另外,如果您喜欢该应用程序,请考虑通过订阅支持我。", + "title": "支持" + }, "thanks": { "message": "现在就这样。希望您喜欢我的应用。\n\n-敬礼,Kyusung4698", - "title": "" + "title": "谢谢!" }, "trade": { "highlight": { @@ -272,6 +276,9 @@ "event": { "start-error": "无法开始收听游戏事件。" }, + "footer": { + "support": "支持" + }, "help": { "browser": "单击时按住CTRL将在默认浏览器中打开链接。", "browser-title": "如何在默认浏览器中打开搜索?", @@ -313,6 +320,7 @@ }, "market": { "bar": { + "history": "历史", "reset": "清除筛选", "search": "搜索", "toggle": "切换过滤器" @@ -359,6 +367,7 @@ "death": "死亡事件", "future-duration": "未来持续时间", "kill": "杀死事件", + "manually": "手动地", "name": "重播", "past-duration": "过去的持续时间", "start-error": "无法开始事件捕获。", @@ -371,6 +380,7 @@ "auto-download": "自动下载更新", "auto-launch": "开机运行", "cancel": "取消", + "character-name": "角色名称后备", "dialog": "对话", "dialog-opacity": "对话不透明度", "dialog-spawn-position": { @@ -402,9 +412,24 @@ "ui-language": "UI语言", "zoom": "放大" }, + "support": { + "developer": { + "open": "打开订阅页面", + "text": "如果您喜欢该应用程序,请考虑通过订阅支持我。这将使我花更多的时间来开发此应用程序并保持最新状态。您还将尽早使用新功能。", + "title": "支持开发商" + }, + "name": "支持", + "question": { + "discord": "加入不和谐社区", + "github": "在GitHub Project上提交问题", + "text": "你有问题吗还是要请求一项新功能?", + "title": "得到支持" + } + }, "trade": { "action": { "finished": "谢谢,再见", + "hideout": "前往卖家藏身处", "interested": "还感兴趣吗?", "invite": "邀请", "item-gone": "物品不见了", @@ -414,6 +439,7 @@ "wait": "等待?", "whisper": "耳语" }, + "actions": "操作", "analyzing": "正在分析数据...", "empty": "没有结果。在浏览器中打开?", "enabled": "启用", @@ -423,12 +449,25 @@ "rate": "已达到限制。请稍后再试。\n如果这种情况持续发生,请尝试减少获取的物品数。" }, "fetching": "找到 {{total}}。正在获取 {{count}} 个条目...", + "filter": "过滤", + "filters": { + "incoming": "来", + "incomingoutgoing": "进出" + }, + "height": "高度", + "layout": "布局", + "layouts": { + "bottomtotop": "从下到上", + "toptobottom": "从上到下" + }, + "leave-party": "离开聚会一旦结束", "message": { "item-gone": "物品消失的消息", "still-interested": "仍然感兴趣的消息", "thanks": "谢谢留言", "wait": "等待讯息" }, + "messages": "消息", "name": "贸易", "no-price": "没有价格", "not-found": "没有找到数据。", diff --git a/src/assets/i18n/spanish.json b/src/assets/i18n/spanish.json index da1ec71e..3f7aea9f 100644 --- a/src/assets/i18n/spanish.json +++ b/src/assets/i18n/spanish.json @@ -68,7 +68,7 @@ }, "filter": { "message": "Haga clic en el icono resaltado para abrir el filtro. Ajusta los valores a tu gusto.", - "title": "" + "title": "Filtrar" }, "message": "El mercado te permite navegar por los artículos listados e intercambiar monedas dentro del juego.\n\nSe puede activar presionando la tecla de acceso rápido a continuación:", "reset": { @@ -105,9 +105,13 @@ "message": "Abra la ventana de configuración presionando la siguiente tecla de acceso rápido:", "title": "Ajustes" }, + "support": { + "message": "¿Tienes una pregunta? ¿O quieres solicitar una nueva función?\n\nConsulte la pestaña de soporte en el menú de configuración para obtener más información.\n\nAdemás, si te encanta la aplicación, considera apoyarme suscribiéndote.", + "title": "Apoyo" + }, "thanks": { "message": "Eso es todo por ahora. Espero que disfrutes mi aplicación.\n\n- Saludos cordiales, Kyusung4698", - "title": "" + "title": "¡Gracias!" }, "trade": { "highlight": { @@ -272,6 +276,9 @@ "event": { "start-error": "No se pudo comenzar a escuchar los eventos del juego." }, + "footer": { + "support": "Apoyo" + }, "help": { "browser": "Si mantiene presionada la tecla CTRL mientras hace clic, se abrirá el enlace en el navegador predeterminado.", "browser-title": "¿Cómo abro la búsqueda en mi navegador predeterminado?", @@ -313,6 +320,7 @@ }, "market": { "bar": { + "history": "historia", "reset": "Filtro claro", "search": "Buscar", "toggle": "Filtro de palanca" @@ -359,6 +367,7 @@ "death": "Evento de muerte", "future-duration": "Duración futura", "kill": "Evento de muerte", + "manually": "a mano", "name": "Repetición", "past-duration": "Duración pasada", "start-error": "No se pudo iniciar la captura de eventos.", @@ -371,6 +380,7 @@ "auto-download": "Descargar actualización automáticamente", "auto-launch": "Ejecutar en arranque", "cancel": "Cancelar", + "character-name": "Nombre del personaje Fallback", "dialog": "Diálogo", "dialog-opacity": "Diálogo Opacidad", "dialog-spawn-position": { @@ -402,9 +412,24 @@ "ui-language": "Idioma de la interfaz de usuario", "zoom": "Enfocar" }, + "support": { + "developer": { + "open": "Abra la página de suscripción", + "text": "Si amas la aplicación, considera apoyarme suscribiéndote. Esto me permitirá pasar más tiempo desarrollando esta aplicación y mantenerla actualizada. También obtendrá acceso temprano a nuevas funciones.", + "title": "Apoye al desarrollador" + }, + "name": "Apoyo", + "question": { + "discord": "Únete a la comunidad Discord", + "github": "Enviar un problema en el proyecto GitHub", + "text": "¿Tienes una pregunta? ¿O quieres solicitar una nueva función?", + "title": "Obtener apoyo" + } + }, "trade": { "action": { "finished": "Gracias y adiós", + "hideout": "Ir al escondite del vendedor", "interested": "¿Aún interesado?", "invite": "invitación", "item-gone": "Artículo desaparecido", @@ -414,6 +439,7 @@ "wait": "¿Espere?", "whisper": "Susurro" }, + "actions": "Comportamiento", "analyzing": "Analizando datos ...", "empty": "No hay resultados. ¿Abierta en el navegador?", "enabled": "Habilitado", @@ -423,12 +449,25 @@ "rate": "Límite alcanzado. Por favor, inténtelo de nuevo más tarde.\nSi esto sigue sucediendo, intente reducir el recuento de elementos recuperados." }, "fetching": "Encontrado {{total}}. Obteniendo {{count}} entradas ...", + "filter": "Filtrar", + "filters": { + "incoming": "Entrante", + "incomingoutgoing": "Entrante saliente" + }, + "height": "Altura", + "layout": "diseño", + "layouts": { + "bottomtotop": "Abajo hacia arriba", + "toptobottom": "De arriba hacia abajo" + }, + "leave-party": "Salir de fiesta una vez terminado", "message": { "item-gone": "Mensaje de artículo desaparecido", "still-interested": "Mensaje aún interesado", "thanks": "Mensaje de agradecimiento", "wait": "Mensaje de espera" }, + "messages": "Mensajes", "name": "Comercio", "no-price": "Sin precio", "not-found": "Datos no encontrados.", diff --git a/src/assets/i18n/thai.json b/src/assets/i18n/thai.json index 1bcc02fb..e5ef81ac 100644 --- a/src/assets/i18n/thai.json +++ b/src/assets/i18n/thai.json @@ -28,7 +28,7 @@ "title": "คุณสมบัติ" }, "search": { - "message": "การค้นหาแสดงรายการทั้งหมดตามตัวกรองของคุณ\n\nคุณสามารถเลือกระหว่างกราฟิกหรือมุมมองรายการ\nมุมมองกราฟจัดกลุ่มรายการตามราคาและแสดงจำนวนของกลุ่มเหล่านั้น มุมมองรายการจะแสดงรายการที่เรียงตามจำนวนเงิน\nมุมมองทั้งสองจะถูกกรองเพิ่มเติมสำหรับผู้กำหนดราคาที่อาจเกิดขึ้นโดยจัดกลุ่มรายชื่อไว้ในที่เดียว\n\nโดยการคลิกรายชื่อ - บันทึกราคาที่จัดรูปแบบแล้วจะถูกคัดลอกไปยังคลิปบอร์ดของคุณ", + "message": "การค้นหาจะแสดงรายการทั้งหมดตามตัวกรองของคุณ\n\nคุณสามารถเลือกระหว่างกราฟิกหรือมุมมองรายการ\nมุมมองกราฟจัดกลุ่มรายการตามราคาและแสดงจำนวนของกลุ่มเหล่านั้น มุมมองรายการจะแสดงรายการที่เรียงตามจำนวนเงิน\nมุมมองทั้งสองจะถูกกรองเพิ่มเติมสำหรับผู้กำหนดราคาที่อาจเกิดขึ้นโดยจัดกลุ่มรายชื่อเป็นหนึ่ง\n\nโดยการคลิกรายชื่อ - บันทึกราคาที่จัดรูปแบบแล้วจะถูกคัดลอกไปยังคลิปบอร์ดของคุณ", "title": "ค้นหา" }, "settings": { @@ -68,7 +68,7 @@ }, "filter": { "message": "คลิกไอคอนที่ไฮไลต์เพื่อเปิดตัวกรอง ปรับค่าตามที่คุณต้องการ", - "title": "" + "title": "กรอง" }, "message": "ตลาดช่วยให้คุณสามารถเรียกดูรายการที่ระบุไว้และแลกเปลี่ยนสกุลเงินภายในเกม\n\nสามารถสลับได้โดยกดปุ่มลัดด้านล่าง:", "reset": { @@ -105,9 +105,13 @@ "message": "เปิดหน้าต่างการตั้งค่าโดยกดปุ่มลัดต่อไปนี้:", "title": "การตั้งค่า" }, + "support": { + "message": "คุณมีคำถาม? หรือคุณต้องการที่จะขอคุณสมบัติใหม่?\n\nตรวจสอบแท็บการสนับสนุนที่เมนูการตั้งค่าสำหรับข้อมูลเพิ่มเติม\n\nนอกจากนี้ถ้าคุณรักแอปให้พิจารณาสนับสนุนฉันด้วยการสมัครรับข้อมูล", + "title": "สนับสนุน" + }, "thanks": { "message": "แค่นี้แหละ หวังว่าคุณจะสนุกกับแอพของฉัน\n\n- ขอแสดงความนับถือ Kyusung4698", - "title": "" + "title": "ขอขอบคุณ!" }, "trade": { "highlight": { @@ -272,6 +276,9 @@ "event": { "start-error": "ไม่สามารถเริ่มฟังกิจกรรมของเกม" }, + "footer": { + "support": "สนับสนุน" + }, "help": { "browser": "กดปุ่ม CTRL ค้างไว้ขณะคลิกจะเปิดลิงก์ในเบราว์เซอร์เริ่มต้น", "browser-title": "ฉันจะเปิดการค้นหาในเบราว์เซอร์เริ่มต้นของฉันได้อย่างไร", @@ -313,6 +320,7 @@ }, "market": { "bar": { + "history": "ประวัติศาสตร์", "reset": "ล้างตัวกรอง", "search": "ค้นหา", "toggle": "ตัวกรองสลับ" @@ -359,6 +367,7 @@ "death": "เหตุการณ์ความตาย", "future-duration": "อนาคตระยะเวลา", "kill": "ฆ่าเหตุการณ์", + "manually": "ด้วยมือ", "name": "เล่นใหม่", "past-duration": "ระยะเวลาที่ผ่านมา", "start-error": "ไม่สามารถเริ่มต้นการจับภาพเหตุการณ์", @@ -371,6 +380,7 @@ "auto-download": "ดาวน์โหลดอัปเดตโดยอัตโนมัติ", "auto-launch": "ทำงานบน Boot", "cancel": "ยกเลิก", + "character-name": "ชื่อตัวเลือกทางเลือก", "dialog": "โต้ตอบ", "dialog-opacity": "ความทึบของไดอะล็อก", "dialog-spawn-position": { @@ -402,9 +412,24 @@ "ui-language": "ภาษา UI", "zoom": "ซูม" }, + "support": { + "developer": { + "open": "เปิดหน้าการสมัครสมาชิก", + "text": "หากคุณรักแอปโปรดพิจารณาสนับสนุนฉันโดยสมัครรับข้อมูล นี่จะทำให้ฉันใช้เวลาในการพัฒนาแอพนี้มากขึ้นและทำให้มันทันสมัยอยู่เสมอ นอกจากนี้คุณยังจะได้รับการเข้าถึงคุณลักษณะใหม่ก่อนเวลา", + "title": "สนับสนุนผู้พัฒนา" + }, + "name": "สนับสนุน", + "question": { + "discord": "เข้าร่วม Discord-Community", + "github": "ส่งปัญหาที่โครงการ GitHub", + "text": "คุณมีคำถามหรือไม่? หรือคุณต้องการที่จะขอคุณสมบัติใหม่?", + "title": "ได้รับการสนับสนุน" + } + }, "trade": { "action": { "finished": "ขอบคุณและลาก่อน", + "hideout": "ไปที่ซ่อนผู้ขาย", "interested": "ยังสนใจอยู่เหรอ?", "invite": "เชิญ", "item-gone": "รายการหายไป", @@ -414,6 +439,7 @@ "wait": "รอ?", "whisper": "กระซิบ" }, + "actions": "การปฏิบัติ", "analyzing": "กำลังวิเคราะห์ข้อมูล ...", "empty": "ไม่มีผลลัพธ์. เปิดในเบราว์เซอร์?", "enabled": "เปิดการใช้งาน", @@ -423,12 +449,25 @@ "rate": "ถึงขีด จำกัด. โปรดลองอีกครั้งในภายหลัง.\nหากสิ่งนี้ยังคงเกิดขึ้นโปรดลองลดจำนวนรายการที่ดึงมา" }, "fetching": "พบ {{total}}กำลังดึงรายการ {{count}} ...", + "filter": "กรอง", + "filters": { + "incoming": "ขาเข้า", + "incomingoutgoing": "ขาเข้าและขาออก" + }, + "height": "ความสูง", + "layout": "แบบ", + "layouts": { + "bottomtotop": "จากล่างขึ้นบน", + "toptobottom": "บนลงล่าง" + }, + "leave-party": "ออกจากปาร์ตี้เมื่อเสร็จแล้ว", "message": { "item-gone": "รายการข้อความหายไป", "still-interested": "ข้อความที่สนใจยังคง", "thanks": "ข้อความขอบคุณ", "wait": "รอข้อความ" }, + "messages": "ข้อความ", "name": "ค่า", "no-price": "ไม่มีราคา", "not-found": "ไม่พบข้อมูล.", diff --git a/src/assets/i18n/traditional-chinese.json b/src/assets/i18n/traditional-chinese.json index ff83ac93..31b27d59 100644 --- a/src/assets/i18n/traditional-chinese.json +++ b/src/assets/i18n/traditional-chinese.json @@ -28,7 +28,7 @@ "title": "屬性" }, "search": { - "message": "搜索會根據您的過濾器顯示所有列表。\n\n您可以在圖形視圖或列表視圖之間進行選擇。\n圖形視圖根據項目的價格對項目進行分組,並顯示這些組的數量。列表視圖僅顯示按金額排序的列表。\n通過將它們的列表分組為一個,可以為潛在的價格修正者另外過濾兩種視圖。\n\n通過單擊列表-格式化的價格便箋將被複製到剪貼板。", + "message": "搜索將根據您的過濾器顯示所有列表。\n\n您可以在圖形視圖或列表視圖之間進行選擇。\n圖形視圖根據項目的價格對項目進行分組,並顯示這些組的數量。列表視圖僅顯示按金額排序的列表。\n通過將它們的列表分組為一個,可以為潛在的價格修正者另外過濾兩個視圖。\n\n通過單擊列表-格式化的價格便箋將被複製到剪貼板。", "title": "搜索" }, "settings": { @@ -68,7 +68,7 @@ }, "filter": { "message": "單擊突出顯示的圖標以打開過濾器。將值調整為您喜歡的值。", - "title": "" + "title": "過濾" }, "message": "市場允許您瀏覽列出的項目並在遊戲中交換貨幣。\n\n可以通過按以下熱鍵進行切換:", "reset": { @@ -105,9 +105,13 @@ "message": "通過按以下熱鍵打開設置窗口:", "title": "設置" }, + "support": { + "message": "你有問題嗎?還是要請求一項新功能?\n\n查看設置菜單上的支持標籤以獲取更多信息。\n\n另外,如果您喜歡該應用程序,請考慮通過訂閱支持我。", + "title": "支持" + }, "thanks": { "message": "現在就這樣。希望您喜歡我的應用。\n\n-敬禮,Kyusung4698", - "title": "" + "title": "謝謝!" }, "trade": { "highlight": { @@ -272,6 +276,9 @@ "event": { "start-error": "無法開始監聽遊戲事件。" }, + "footer": { + "support": "支持" + }, "help": { "browser": "按住CTRL時點擊將在默認瀏覽器中打開鏈接。", "browser-title": "如何在默認瀏覽器中打開搜尋?", @@ -313,6 +320,7 @@ }, "market": { "bar": { + "history": "歷史", "reset": "清除篩選", "search": "搜尋", "toggle": "切換過濾器" @@ -359,6 +367,7 @@ "death": "死亡事件", "future-duration": "未來幾秒內", "kill": "擊殺事件", + "manually": "手動地", "name": "重播", "past-duration": "過去幾秒內", "start-error": "無法開始事件獲取。", @@ -371,6 +380,7 @@ "auto-download": "自動下載更新", "auto-launch": "開機後自動啟動", "cancel": "取消", + "character-name": "角色名稱後備", "dialog": "對話", "dialog-opacity": "對話不透明度", "dialog-spawn-position": { @@ -402,9 +412,24 @@ "ui-language": "介面語言", "zoom": "放大" }, + "support": { + "developer": { + "open": "打開訂閱頁面", + "text": "如果您喜歡該應用程序,請考慮通過訂閱支持我。這將使我花更多的時間來開發此應用程序並保持最新狀態。您還將儘早使用新功能。", + "title": "支持開發商" + }, + "name": "支持", + "question": { + "discord": "加入不和諧社區", + "github": "在GitHub Project上提交問題", + "text": "你有問題嗎還是要請求一項新功能?", + "title": "得到支持" + } + }, "trade": { "action": { "finished": "謝謝,再見", + "hideout": "前往賣家藏身處", "interested": "還感興趣嗎?", "invite": "邀請", "item-gone": "物品不見了", @@ -414,6 +439,7 @@ "wait": "等待?", "whisper": "耳語" }, + "actions": "動作", "analyzing": "正在分析數據...", "empty": "查無結果。是否瀏覽器中打開?", "enabled": "啟用", @@ -423,12 +449,25 @@ "rate": "已達到限制。請稍後再試。\n如果這種情況持續發生,請嘗試減少獲取的物品數。" }, "fetching": "已找到 {{total}}。正在獲取 {{count}} 個條目...", + "filter": "過濾", + "filters": { + "incoming": "來", + "incomingoutgoing": "進出" + }, + "height": "高度", + "layout": "佈局", + "layouts": { + "bottomtotop": "從下到上", + "toptobottom": "從上到下" + }, + "leave-party": "離開聚會一旦結束", "message": { "item-gone": "物品消失的消息", "still-interested": "仍然感興趣的消息", "thanks": "謝謝留言", "wait": "等待訊息" }, + "messages": "消息", "name": "貿易", "no-price": "沒有價格", "not-found": "沒有找到數據。", diff --git a/src/main.ts b/src/main.ts index 1c889e2c..13cc8977 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,4 +9,4 @@ if (environment.production) { } platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.error('An unexpected error occured while bootstrapping the AppModule.', err.message ?? JSON.stringify(err))); + .catch(err => console.error(`An unexpected error occured while bootstrapping the AppModule. ${err?.message ?? JSON.stringify(err)}`)); diff --git a/src/styles/_material.scss b/src/styles/_material.scss index 0022e501..e482c74f 100644 --- a/src/styles/_material.scss +++ b/src/styles/_material.scss @@ -9,8 +9,10 @@ mat-label { mat-card { margin-bottom: 12px; - > mat-label { - margin-bottom: 12px; + > div { + > mat-label { + margin-bottom: 12px; + } } } diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss index fd2b331b..dbdc28e6 100644 --- a/src/styles/_variables.scss +++ b/src/styles/_variables.scss @@ -19,6 +19,9 @@ $light-white: #fff8e1; $red: #e63244; $pink: #e745ad; $aqua: #1ba29b; +$river: #3498db; +$emerald: #2ecc71; +$lime: #32cd32; $black-transparent: rgba(0, 0, 0, 0.6); /* colors */ @@ -32,4 +35,4 @@ $black: #000; $gutter: 6px; $gutter-half: $gutter / 2; -$label-color: rgba(200, 200, 200, 0.54); \ No newline at end of file +$label-color: rgba(200, 200, 200, 0.54);