presence.ts 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  1. const presence = new Presence({
  2. clientId: "1265368122689458378",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. const enum Assets {
  6. Logo = "https://cdn.rcd.gg/PreMiD/websites/K/KOLEO/assets/logo.png",
  7. Logo2 = "https://cdn.rcd.gg/PreMiD/websites/K/KOLEO/assets/0.png",
  8. Buy = "https://cdn.rcd.gg/PreMiD/websites/K/KOLEO/assets/1.png",
  9. Train = "https://cdn.rcd.gg/PreMiD/websites/K/KOLEO/assets/2.png",
  10. Ticket = "https://cdn.rcd.gg/PreMiD/websites/K/KOLEO/assets/3.png",
  11. }
  12. let oldStations: string | string[];
  13. async function NoPage(presenceData: PresenceData): Promise<void> {
  14. presenceData.name = "KOLEO - 404";
  15. presenceData.details = "Nie znaleziono strony.";
  16. presenceData.largeImageKey = Assets.Logo;
  17. delete presenceData.state;
  18. presenceData.smallImageText = "Zgubił się...";
  19. presenceData.smallImageKey = Assets.Question;
  20. await presence.setActivity(presenceData);
  21. }
  22. const operators = [
  23. "pkp-intercity",
  24. "polregio",
  25. "arriva",
  26. "leo-express",
  27. "koleje-wielkopolskie",
  28. "koleje-dolnoslaskie",
  29. "koleje-mazowieckie",
  30. "koleje-malopolskie",
  31. "wkd",
  32. "lka",
  33. "koleje-slaskie",
  34. "skm-trojmiasto",
  35. ];
  36. presence.on("UpdateData", async () => {
  37. const { href, hostname, pathname } = document.location,
  38. presenceData: PresenceData = {
  39. details: "Ładowanie.",
  40. largeImageKey: Assets.Logo,
  41. smallImageText: "Ładowanie...",
  42. smallImageKey: Assets.Train,
  43. startTimestamp: browsingTimestamp,
  44. },
  45. privacySetting = await presence.getSetting<boolean>("privacy");
  46. if (hostname === "koleo.pl") {
  47. if (
  48. href.endsWith("koleo.pl/") ||
  49. href.endsWith("koleo.pl/#") ||
  50. pathname.includes("rozklad-jazdy") ||
  51. (operators.includes(pathname.split("/")[1]) &&
  52. !pathname.includes("bilety-miesieczne"))
  53. ) {
  54. let startText: string,
  55. endText: string,
  56. dateText: string,
  57. partOfSite: string;
  58. if (href.endsWith("koleo.pl/") || href.endsWith("koleo.pl/#")) {
  59. (startText = document.querySelector<HTMLInputElement>(
  60. "#query_start_station"
  61. )?.value),
  62. (endText =
  63. document.querySelector<HTMLInputElement>(
  64. "#query_end_station"
  65. )?.value),
  66. (dateText =
  67. document.querySelector<HTMLInputElement>("#query_date")?.value);
  68. partOfSite = "całym KOLEO";
  69. } else if (
  70. pathname.includes("rozklad-jazdy") ||
  71. operators.includes(pathname.split("/")[1])
  72. ) {
  73. const startStationButton = document.querySelector(".closest-station"),
  74. endStationButton = document.querySelector(".swap-stations"),
  75. dateInputWrapper = document.querySelector(
  76. ".form-date-input__input-wrapper"
  77. );
  78. if (startStationButton && endStationButton && dateInputWrapper) {
  79. startText = startStationButton
  80. .closest(".icon-input-action")
  81. .querySelector<HTMLInputElement>("input")?.value;
  82. endText = endStationButton
  83. .closest(".icon-input-action")
  84. .querySelector<HTMLInputElement>("input")?.value;
  85. dateText =
  86. dateInputWrapper.querySelector<HTMLInputElement>("input")?.value;
  87. }
  88. partOfSite =
  89. document.querySelector(".top-banner__heading").textContent ||
  90. "caŁym KOLEO";
  91. }
  92. if (startText && endText) {
  93. presenceData.details = "Szuka połączenia...";
  94. presenceData.state = `Z ${startText} - Do ${endText} - Na ${dateText} | W ${partOfSite}`;
  95. } else presenceData.details = "Szuka połączenia rozkładu koleji.";
  96. presenceData.smallImageText = "Szuka połączenia...";
  97. presenceData.buttons = [
  98. { label: "Rozkład Jazdy", url: "https://koleo.pl/rozklad-jazdy" },
  99. ];
  100. } else if (pathname.startsWith("/rozklad-pkp")) {
  101. presenceData.state = "W rozkładzie PKP...";
  102. const startStation = document.querySelector<HTMLInputElement>(
  103. "#query_start_station"
  104. ),
  105. endStation =
  106. document.querySelector<HTMLInputElement>("#query_end_station"),
  107. date = document.querySelector<HTMLInputElement>("#query_date");
  108. if (startStation && endStation && date) {
  109. const [startText, endText, dateText] = [
  110. startStation.value,
  111. endStation.value,
  112. date.value,
  113. ];
  114. if (
  115. href &&
  116. startText &&
  117. endText &&
  118. dateText &&
  119. (!oldStations || oldStations[0] !== href)
  120. )
  121. oldStations = [href, startText, endText, dateText.replace(/_/g, " ")];
  122. if (oldStations && oldStations[0] === href) {
  123. if (!privacySetting) {
  124. if (
  125. oldStations[0] === href &&
  126. startText === oldStations[1] &&
  127. endText === oldStations[2] &&
  128. dateText === oldStations[3]
  129. ) {
  130. presenceData.details = "Wybiera połączenie...";
  131. presenceData.state = `Z ${startText} - Do ${endText} - Na ${dateText}`;
  132. presenceData.smallImageText = "Wybiera najlepsze połączenie...";
  133. } else {
  134. presenceData.details = "Szuka połączenia...";
  135. presenceData.state = `${
  136. startText.length > 0 ? `Z ${startText}` : ""
  137. }${startText.length > 0 && endText.length > 0 ? " - " : ""}${
  138. endText.length > 0 ? `Do ${endText}` : ""
  139. }${
  140. startText.length > 0 || endText.length > 0 ? " - " : ""
  141. }Na ${dateText}`;
  142. presenceData.smallImageText = "Szuka połączenia...";
  143. }
  144. presenceData.buttons = [
  145. {
  146. label: "Zobacz Połączenia",
  147. url: `https://koleo.pl/${pathname
  148. .split("/")
  149. .slice(1, 5)
  150. .join("/")}`,
  151. },
  152. ];
  153. } else {
  154. if (
  155. startText === oldStations[1] &&
  156. endText === oldStations[2] &&
  157. dateText === oldStations[3]
  158. ) {
  159. presenceData.details =
  160. "Wybiera ofertę połączenia na wyznaczone stacje.";
  161. presenceData.smallImageText = "Wybiera najlepszą oferte...";
  162. presenceData.smallImageKey = Assets.Ticket;
  163. } else {
  164. presenceData.details = "Szuka połączenia na wyznaczone stacje.";
  165. presenceData.smallImageText = "Szuka...";
  166. presenceData.smallImageKey = Assets.Train;
  167. }
  168. presenceData.buttons = [
  169. {
  170. label: "Zobacz Połączenia",
  171. url: "https://koleo.pl/rozklad-jazdy",
  172. },
  173. ];
  174. }
  175. }
  176. }
  177. } else if (pathname.includes("bilety-miesieczne")) {
  178. const transportation = document.querySelector("h1.top-banner__heading");
  179. if (transportation) {
  180. presenceData.details = `Przegląda bilety miesięczne${
  181. privacySetting ? "." : ` w ${transportation.textContent}.`
  182. }`;
  183. presenceData.smallImageText = "Przegląda bilety...";
  184. presenceData.smallImageKey = Assets.Ticket;
  185. }
  186. const typeOfTicket = document.querySelector(
  187. ".active-ticket__ticket-name"
  188. );
  189. if (typeOfTicket) {
  190. const stepOfBuying = document.querySelector(
  191. ".step-breadcrumbs__step--is-active .step-breadcrumbs__number-badge"
  192. ).textContent,
  193. offers = document.querySelector(
  194. ".carrier-season-ticket__total-price"
  195. );
  196. presenceData.details = `Kupuje ${
  197. privacySetting
  198. ? "bilet miesięczny."
  199. : `${typeOfTicket.textContent.toLowerCase()}.`
  200. }`;
  201. presenceData.state = `W ${
  202. document.querySelector(".active-ticket__carrier-name")?.textContent
  203. }.`;
  204. presenceData.smallImageKey = Assets.Buy;
  205. if (stepOfBuying === "2" && !offers) {
  206. const startStationButton = document.querySelector(".closest-station"),
  207. endStationButton = document.querySelector(".swap-stations"),
  208. dateInputWrapper = document.querySelector(
  209. ".form-date-input__input-wrapper"
  210. );
  211. if (startStationButton && endStationButton && dateInputWrapper) {
  212. const [startText, endText, dateText] = [
  213. startStationButton
  214. .closest(".icon-input-action")
  215. .querySelector<HTMLInputElement>("input").value,
  216. endStationButton
  217. .closest(".icon-input-action")
  218. .querySelector<HTMLInputElement>("input").value,
  219. dateInputWrapper.querySelector<HTMLInputElement>("input").value,
  220. ];
  221. presenceData.smallImageText = "Szuka połączenia...";
  222. presenceData.smallImageKey = Assets.Train;
  223. if (!privacySetting) {
  224. presenceData.state = `Szuka połączenia ${
  225. startText.length > 0 ? `z ${startText}` : ""
  226. } ${endText.length > 0 ? `do ${endText}` : ""} na ${dateText}`;
  227. } else presenceData.state = "Szuka połączenia...";
  228. } else {
  229. presenceData.smallImageText = "Wybiera stację...";
  230. presenceData.state = "Wybiera stację docelową...";
  231. }
  232. } else if (stepOfBuying === "2" && offers) {
  233. presenceData.state = "Wybiera offertę biletu...";
  234. presenceData.smallImageText = "Wybiera offertę...";
  235. if (document.querySelector(".tile-radio--is-checked").textContent) {
  236. if (!privacySetting) {
  237. presenceData.state = `Wybrał/a ofertę za ${
  238. document.querySelector(
  239. ".tile-radio--is-checked .tile-offer-radio__price"
  240. ).textContent
  241. }.`;
  242. } else presenceData.state = "Wybrał/a ofertę...";
  243. presenceData.smallImageText = "Wybrał ofertę...";
  244. presenceData.smallImageKey = Assets.Ticket;
  245. }
  246. }
  247. }
  248. } else if (
  249. pathname.startsWith("/summary") ||
  250. pathname.startsWith("/confirm")
  251. ) {
  252. let titleOfOrder: string,
  253. dateOfTransport: string,
  254. typeOfTicket: string,
  255. costOfOrder: string,
  256. paymentMethod: Element,
  257. title: string;
  258. if (pathname.startsWith("/summary")) {
  259. const tempTitleOfOrder = document.querySelector(
  260. ".tile-order .tile-order__name"
  261. );
  262. if (tempTitleOfOrder)
  263. titleOfOrder = tempTitleOfOrder?.textContent.toLowerCase();
  264. const tempDateOfTransport = document.querySelector(".tile-order__date");
  265. if (tempDateOfTransport)
  266. dateOfTransport = tempDateOfTransport.textContent.toLowerCase();
  267. const tempTypeOfTicket = document.querySelector(
  268. ".order-summary-info__content"
  269. );
  270. if (tempTypeOfTicket) typeOfTicket = tempTypeOfTicket.textContent;
  271. const tempCostOfOrder = document.querySelector(
  272. ".order-summary-total__price"
  273. );
  274. if (tempCostOfOrder) costOfOrder = tempCostOfOrder.textContent;
  275. paymentMethod = document.querySelector(
  276. ".tile-radio--is-checked .payment-method-radio__control span"
  277. );
  278. } else if (pathname.startsWith("/confirm")) {
  279. const startStation = document.querySelector("li.koleoicon-arrow_right"),
  280. endStation = document.querySelector("li.koleoicon-arrow_left");
  281. if (startStation && endStation)
  282. titleOfOrder = `${startStation.textContent} - ${endStation.textContent}`;
  283. const tempDateOfTransport =
  284. document.querySelector("li.koleoicon-clock");
  285. if (tempDateOfTransport)
  286. dateOfTransport = tempDateOfTransport.textContent;
  287. const tempTypeOfTicket = document.querySelector(
  288. ".koleoicon-offer.ticket-type-info"
  289. );
  290. if (tempTypeOfTicket)
  291. typeOfTicket = tempTypeOfTicket.textContent.toLowerCase();
  292. const tempCostOfOrder =
  293. document.querySelector(".payment-sum") ||
  294. document.querySelector(".sum-to-pay");
  295. if (tempCostOfOrder) costOfOrder = tempCostOfOrder.textContent;
  296. paymentMethod = document.querySelector("li.active");
  297. }
  298. if (!titleOfOrder || !dateOfTransport || !typeOfTicket || !costOfOrder) {
  299. presenceData.details = "Ładuje zamówienie...";
  300. presenceData.smallImageText = "Ładuje zamówienie...";
  301. presenceData.smallImageKey = Assets.Buy;
  302. return presence.setActivity(presenceData);
  303. }
  304. if (paymentMethod) {
  305. if (
  306. paymentMethod.classList.contains("payment-method-wallet__name") ||
  307. paymentMethod.classList.contains("payment-koleo-account")
  308. )
  309. title = "środków na koncie KOLEO";
  310. else if (
  311. paymentMethod.classList.contains("payment-method-blik__name") ||
  312. paymentMethod.classList.contains("payment-blik")
  313. )
  314. title = "BLIKa";
  315. else if (
  316. paymentMethod.classList.contains("payment-method-card__name") ||
  317. paymentMethod.classList.contains("payment-card")
  318. )
  319. title = "karty płatniczej";
  320. else if (paymentMethod.classList.contains("payment-trans"))
  321. title = "szybkiego przelewu";
  322. }
  323. if (!privacySetting) {
  324. presenceData.details = `Kupuje bilet ${typeOfTicket}.`;
  325. if (title) presenceData.state = `Za pomocą ${title}.`;
  326. else {
  327. presenceData.state = `Z ${titleOfOrder.split(" - ")[0]} - Do ${
  328. titleOfOrder.split(" - ")[1]
  329. } - ${dateOfTransport} - Za cenę ${costOfOrder}.`;
  330. }
  331. } else presenceData.details = "Kupuje bilet.";
  332. presenceData.smallImageText = "Kupuje bilet...";
  333. presenceData.smallImageKey = Assets.Buy;
  334. } else if (pathname.startsWith("/ticket/")) {
  335. const tickets = document.querySelectorAll(".ticket");
  336. if (tickets.length === 0) {
  337. presenceData.details = "Ładuje bilet/y...";
  338. presenceData.smallImageText = "Ładuje bilet/y...";
  339. presenceData.smallImageKey = Assets.Ticket;
  340. return presence.setActivity(presenceData);
  341. }
  342. if (!privacySetting && tickets.length > 0) {
  343. const mergedTicketData: {
  344. stations: string[];
  345. trainClasses: string[];
  346. operators: string[];
  347. distance: string;
  348. tempDistance: number;
  349. price: string;
  350. tempPrice: number;
  351. } = {
  352. stations: [],
  353. trainClasses: [],
  354. operators: [],
  355. distance: "0 km",
  356. tempDistance: 0,
  357. price: "0 zł",
  358. tempPrice: 0,
  359. },
  360. uniqueStations = new Set(),
  361. uniqueClasses = new Set(),
  362. uniqueOperators = new Set();
  363. for (const ticket of tickets) {
  364. const stations = ticket
  365. .querySelector(".ticket-stations .ticket-station span")
  366. ?.textContent.replace(/\n/g, " ")
  367. .trim()
  368. .replace(/ {2}/g, " ")
  369. .split(" — "),
  370. trainClasses = ticket
  371. .querySelector(".ticket-trains:nth-of-type(1) .train-class")
  372. ?.textContent.replace(/\n/g, " ")
  373. .trim()
  374. .replace(/ {2}/g, " "),
  375. operators = ticket
  376. .querySelector(".ticket-trains:nth-of-type(2) strong")
  377. ?.textContent.replace(/\n/g, " ")
  378. .trim()
  379. .replace(/ {2}/g, " "),
  380. distance = parseFloat(
  381. ticket
  382. .querySelector(".ticket-distance span")
  383. ?.textContent.replace(/\n/g, " ")
  384. .trim()
  385. .replace(/ {2}/g, " ")
  386. .replace(",", ".")
  387. ),
  388. price = parseFloat(
  389. ticket
  390. .querySelector(".ticket-price .price-value")
  391. ?.textContent.replace(/\n/g, " ")
  392. .trim()
  393. .replace(/ {2}/g, " ")
  394. .replace("zł", "")
  395. .replace(",", ".")
  396. );
  397. if (stations)
  398. for (const station of stations) uniqueStations.add(station);
  399. if (trainClasses)
  400. uniqueClasses.add(trainClasses.replace("Klasa ", ""));
  401. if (operators) uniqueOperators.add(operators);
  402. if (distance) mergedTicketData.tempDistance += distance;
  403. if (price) mergedTicketData.tempPrice += price;
  404. }
  405. mergedTicketData.stations = Array.from(uniqueStations) as string[];
  406. mergedTicketData.trainClasses = Array.from(uniqueClasses) as string[];
  407. mergedTicketData.operators = Array.from(uniqueOperators) as string[];
  408. mergedTicketData.price = `${mergedTicketData.tempPrice.toFixed(2)} zł`;
  409. mergedTicketData.distance = `${mergedTicketData.tempDistance} km`;
  410. const stations = mergedTicketData.stations.join(" - "),
  411. trainClasses = mergedTicketData.trainClasses.join(", "),
  412. operators = mergedTicketData.operators.join(", "),
  413. { distance } = mergedTicketData,
  414. { price } = mergedTicketData;
  415. presenceData.details = `Przegląda ${
  416. tickets.length > 1 ? "bilety" : "bilet"
  417. } z ${stations.split(" - ")[0]} do ${
  418. stations.split(" - ")[stations.split(" - ").length - 1]
  419. } (${distance}) za ${price}.`;
  420. presenceData.state = `${
  421. trainClasses.length > 1 ? "Klasy pociągów" : "Klasa pociągu"
  422. }: ${trainClasses}, ${
  423. operators.length > 1 ? "Operatorzy" : "Operator"
  424. }: ${operators}.`;
  425. } else {
  426. presenceData.details = `Przegląda ${
  427. tickets.length > 1 ? "swoje bilety" : "swój bilet"
  428. }.`;
  429. }
  430. presenceData.smallImageText = `Przegląda ${
  431. tickets.length > 1 ? "bilety" : "bilet"
  432. }...`;
  433. presenceData.smallImageKey = Assets.Ticket;
  434. presenceData.buttons = [
  435. { label: "Moje Bilety", url: "https://koleo.pl/my/orders" },
  436. ];
  437. } else if (pathname.startsWith("/travel-options/")) {
  438. const stationText = document.querySelector(
  439. ".traveloptions .connection-relation .small-16 h2"
  440. );
  441. let stations: string[] = [];
  442. if (stationText) {
  443. stations = stationText.textContent
  444. .split("—")
  445. .map(station => station.trim());
  446. }
  447. const startStation = stations[0],
  448. endStation = stations[stations.length - 1],
  449. dateTimeText = document.querySelector(
  450. ".traveloptions .connection-relation .connection-relation-date"
  451. );
  452. let dateText: string;
  453. if (dateTimeText)
  454. dateText = dateTimeText.textContent.split("–")[0].trim();
  455. let travelOffer: string;
  456. for (const option of Array.from(
  457. document.querySelectorAll(".traveloptions-option")
  458. )) {
  459. const input = option.querySelector<HTMLInputElement>(
  460. 'input[type="radio"]'
  461. );
  462. if (input && input.checked) {
  463. const offer = option.querySelector(".traveloptions-offers strong");
  464. if (offer) travelOffer = offer.textContent.trim();
  465. }
  466. }
  467. const tempPriceText = document.querySelector(
  468. ".summary .traveloptions-price strong:nth-of-type(1)"
  469. );
  470. let priceText: string;
  471. if (tempPriceText) priceText = `${tempPriceText.textContent.trim()} zł`;
  472. if (travelOffer && priceText) {
  473. if (!privacySetting) {
  474. presenceData.details = `Wybiera ofertę biletu ${travelOffer}.`;
  475. presenceData.state = `Z ${startStation} - Do ${endStation} - Na ${dateText} - Za cenę ${priceText}.`;
  476. } else presenceData.details = "Wybiera ofertę biletu...";
  477. presenceData.smallImageText = "Wybiera ofertę...";
  478. presenceData.smallImageKey = Assets.Ticket;
  479. } else {
  480. presenceData.details = "Przegląda oferty biletów...";
  481. if (!privacySetting)
  482. presenceData.state = `Z ${startStation} - Do ${endStation} - Na ${dateText}.`;
  483. presenceData.smallImageText = "Przegląda oferty...";
  484. presenceData.smallImageKey = Assets.Ticket;
  485. }
  486. } else if (pathname.startsWith("/my")) {
  487. presenceData.details = "Przegląda swoje konto KOLEO.";
  488. presenceData.smallImageText = "Przegląda konto...";
  489. presenceData.smallImageKey = Assets.Viewing;
  490. presenceData.buttons = [{ label: "Moje Konto", url: href }];
  491. if (pathname.startsWith("/my/account")) {
  492. presenceData.details =
  493. "Wprowadza zmiany w swoje dane konta KOLEO - konto KOLEO";
  494. presenceData.smallImageText = "Zmienia dane...";
  495. presenceData.smallImageKey = Assets.Writing;
  496. if (pathname.startsWith("/my/account/change-password")) {
  497. presenceData.details =
  498. "Zmienia swoje hasło do konta KOLEO - konto KOLEO";
  499. presenceData.smallImageText = "Zmienia hasło...";
  500. presenceData.smallImageKey = Assets.Writing;
  501. }
  502. } else if (pathname.startsWith("/my/orders")) {
  503. presenceData.details = "Przegląda swoje bilety - konto KOLEO";
  504. presenceData.smallImageText = "Przegląda...";
  505. if (pathname.startsWith("/my/orders/archive")) {
  506. presenceData.details = "Przegląda swoje archiwalne bilety.";
  507. presenceData.smallImageText = "Przegląda...";
  508. }
  509. } else if (pathname.startsWith("/my/passengers")) {
  510. presenceData.details = "Przegląda swoich pasażerów - konto KOLEO";
  511. presenceData.smallImageText = "Przegląda...";
  512. if (pathname.startsWith("/my/passengers/new")) {
  513. presenceData.details = "Dodaje nowego pasażera - konto KOLEO";
  514. presenceData.smallImageText = "Dodaje...";
  515. presenceData.smallImageKey = Assets.Writing;
  516. } else if (pathname.startsWith("/my/passengers/edit")) {
  517. presenceData.details = "Edytuje swoich pasażerów - konto KOLEO";
  518. presenceData.smallImageText = "Edytuje...";
  519. presenceData.smallImageKey = Assets.Writing;
  520. }
  521. } else if (pathname.startsWith("/my/finances")) {
  522. presenceData.details =
  523. "Przegląda środki na swoim koncie KOLEO - konto KOLEO";
  524. presenceData.smallImageText = "Przegląda środki...";
  525. if (
  526. pathname.startsWith("/my/finances/") &&
  527. !pathname.includes("invoice-details") &&
  528. !pathname.includes("transactions")
  529. ) {
  530. let title;
  531. if (pathname.endsWith("/blik")) title = "BLIKa";
  532. else if (pathname.endsWith("/transfer")) title = "przelewu";
  533. else if (pathname.endsWith("/postal-order"))
  534. title = "przekazu pocztowym";
  535. else if (pathname.endsWith("/payment-cards"))
  536. title = "karty płatniczej";
  537. else if (pathname.endsWith("/gift-card"))
  538. title = "karty podarunkowej";
  539. const formAmount = document.querySelector<HTMLInputElement>(
  540. ".form-base .form-input__control"
  541. );
  542. presenceData.details = "Doładowuje środki na swoje konto KOLEO.";
  543. if (
  544. formAmount &&
  545. formAmount.getAttribute("inputmode") === "decimal" &&
  546. !privacySetting
  547. )
  548. presenceData.state = `Doładowuje konto o ${formAmount.value} przy użyciu ${title}.`;
  549. else presenceData.state = `Przy użyciu ${title}.`;
  550. presenceData.smallImageText = "Doładowuje konto...";
  551. presenceData.smallImageKey = Assets.Buy;
  552. } else if (pathname.includes("invoice-details")) {
  553. presenceData.details = "Wypełnia dane do faktury - konto KOLEO";
  554. presenceData.smallImageText = "Wypełnia...";
  555. presenceData.smallImageKey = Assets.Writing;
  556. } else if (pathname.includes("transactions")) {
  557. presenceData.details = "Przegląda swoje transakcje - konto KOLEO";
  558. presenceData.smallImageText = "Przegląda...";
  559. }
  560. } else if (pathname.startsWith("/my/linked-accounts")) {
  561. presenceData.details = "Przegląda swoje połączone konta - konto KOLEO";
  562. presenceData.smallImageText = "Przegląda...";
  563. } else if (pathname.startsWith("/my/settings")) {
  564. presenceData.details =
  565. "Wprowadza zmiany w swojich ustawieniach konta - konto KOLEO";
  566. presenceData.smallImageText = "Zmienia ustawienia...";
  567. presenceData.smallImageKey = Assets.Writing;
  568. }
  569. } else if (
  570. pathname.startsWith("/signin") ||
  571. (pathname.startsWith("/users/auth") && pathname.includes("intent=login"))
  572. ) {
  573. presenceData.details = "Loguje się...";
  574. presenceData.smallImageText = "Loguje się...";
  575. presenceData.smallImageKey = Assets.Writing;
  576. } else if (
  577. pathname.startsWith("/signup") ||
  578. (pathname.startsWith("/users/auth") && pathname.includes("intent=signup"))
  579. ) {
  580. presenceData.details = "Rejestruje się...";
  581. presenceData.smallImageText = "Rejestruje się...";
  582. presenceData.smallImageKey = Assets.Writing;
  583. } else if (pathname.startsWith("/kontakt")) {
  584. presenceData.details = "Przegląda informacje kontaktowe.";
  585. presenceData.smallImageText = "Przegląda informacje...";
  586. presenceData.smallImageKey = Assets.Viewing;
  587. } else if (pathname.startsWith("/privacy_policy")) {
  588. presenceData.details = "Czyta politykę prywatności.";
  589. presenceData.smallImageText = "Czyta politykę...";
  590. presenceData.smallImageKey = Assets.Reading;
  591. } else if (pathname.startsWith("/media")) {
  592. presenceData.details = "Przegląda media KOLEO.";
  593. presenceData.smallImageText = "Przegląda media...";
  594. presenceData.smallImageKey = Assets.Viewing;
  595. } else NoPage(presenceData);
  596. } else if (href.startsWith("https://pomoc.koleo.pl")) {
  597. presenceData.name = "KOLEO - pomoc";
  598. presenceData.largeImageKey = Assets.Logo2;
  599. presenceData.smallImageText = "Przegląda pomoc...";
  600. presenceData.smallImageKey = Assets.Viewing;
  601. if (
  602. href.endsWith("https://pomoc.koleo.pl") ||
  603. href.endsWith("https://pomoc.koleo.pl/")
  604. )
  605. presenceData.details = "Przegląda pomoc KOLEO.";
  606. else if (pathname.startsWith("/?s")) {
  607. presenceData.details = "Korzysta z wyszukiwarki...";
  608. if (!privacySetting) {
  609. presenceData.state =
  610. document.querySelector<HTMLInputElement>("#hkb-search")?.value;
  611. }
  612. presenceData.smallImageText = "Korzysta z wyszukiwarki...";
  613. presenceData.smallImageKey = Assets.Search;
  614. } else if (pathname.startsWith("/faq"))
  615. presenceData.details = "Przegląda często zadane pytania.";
  616. else if (pathname.startsWith("/wp-content"))
  617. presenceData.details = "Przegląda pliki.";
  618. else {
  619. if (!privacySetting) {
  620. const articleTitle =
  621. document.querySelector(".hkb-article__title") ||
  622. document.querySelector(".entry-header .entry-title"),
  623. searchTab = document.querySelector<HTMLInputElement>("#hkb-search");
  624. presenceData.details = `Czyta artykuł${
  625. articleTitle ? ` - ${articleTitle.textContent}` : "."
  626. }`;
  627. if (searchTab && searchTab.value.length > 0) {
  628. presenceData.state = `Korzysta z wyszukiwarki: ${searchTab.value}`;
  629. presenceData.smallImageText = "Korzysta z wyszukiwarki...";
  630. presenceData.smallImageKey = Assets.Search;
  631. }
  632. presenceData.buttons = [{ label: "Przeczytaj Artykuł", url: href }];
  633. } else presenceData.details = "Czyta artykuł.";
  634. presenceData.smallImageText = "Czyta artykuł...";
  635. presenceData.smallImageKey = Assets.Reading;
  636. }
  637. } else if (href.startsWith("https://magazyn.koleo.pl")) {
  638. presenceData.name = "KOLEO - magazyn";
  639. presenceData.largeImageKey = Assets.Logo2;
  640. presenceData.smallImageKey = Assets.Viewing;
  641. if (
  642. href.endsWith("https://magazyn.koleo.pl") ||
  643. href.endsWith("https://magazyn.koleo.pl/")
  644. ) {
  645. presenceData.details = "Przegląda artykuły w magazynie KOLEO.";
  646. presenceData.smallImageText = "Przegląda artykuły...";
  647. } else if (pathname.startsWith("/o-koleo")) {
  648. presenceData.details = "Przegląda informacje o KOLEO.";
  649. presenceData.smallImageText = "Przegląda informacje...";
  650. } else if (pathname.startsWith("/author/")) {
  651. const authorName = document.querySelector(".module-title");
  652. if (authorName && !privacySetting) {
  653. presenceData.details = `Przegląda artykuły napisane przez ${authorName.textContent}.`;
  654. presenceData.state = `Ilość artykułów: ${
  655. document.querySelector(".gridlove-posts").children.length
  656. }`;
  657. presenceData.smallImageText = "Przegląda profil...";
  658. } else {
  659. presenceData.details = "Przegląda artykuły.";
  660. presenceData.smallImageText = "Przegląda artykuły...";
  661. }
  662. } else if (pathname.startsWith("/opinie")) {
  663. presenceData.details = "Przegląda opinie ludzi.";
  664. presenceData.smallImageText = "Przegląda opinie...";
  665. const tempOpinion = document.querySelector("rw-popup-review.hydrated");
  666. if (tempOpinion && !privacySetting) {
  667. const shadowRootOpinion = tempOpinion.shadowRoot,
  668. opinionUserElement = shadowRootOpinion.querySelector(
  669. ".main .header .info .name"
  670. ),
  671. opinionStarsElements = shadowRootOpinion.querySelectorAll(
  672. ".main .stat .icon-star"
  673. ),
  674. opinionLinkElement = shadowRootOpinion.querySelector(
  675. ".main .header .info .channel-link a"
  676. );
  677. if (opinionUserElement && opinionStarsElements && opinionLinkElement) {
  678. presenceData.details = `Przegląda opinię ${opinionUserElement.textContent.trim()}, który/a ocenił/a KOLEO na ${
  679. opinionStarsElements.length
  680. } gwiazdki.`;
  681. presenceData.buttons = [
  682. {
  683. label: "Zobacz Opinię",
  684. url: opinionLinkElement.getAttribute("href"),
  685. },
  686. ];
  687. }
  688. } else {
  689. presenceData.details = "Przegląda opinie ludzi.";
  690. presenceData.smallImageText = "Przegląda opinie...";
  691. }
  692. } else {
  693. const topicOfPage =
  694. document.title.split("›")[0].trim() ||
  695. document.querySelector(".entry-header h1.entry-title")?.textContent,
  696. authorOfPage = document.querySelector(
  697. ".mks_author_widget .widget-title"
  698. )?.textContent,
  699. metaOfPage = document.querySelector(".entry-meta"),
  700. dateOfPage =
  701. metaOfPage?.querySelector("div.meta-date span")?.textContent;
  702. if (authorOfPage) {
  703. presenceData.details = `Czyta temat${
  704. !privacySetting ? ` napisany przez ${authorOfPage}` : ""
  705. }.`;
  706. if (!privacySetting) {
  707. presenceData.state = [
  708. topicOfPage,
  709. dateOfPage,
  710. metaOfPage?.querySelector("div.meta-rtime")?.textContent,
  711. ]
  712. .filter(Boolean)
  713. .join(" | ");
  714. }
  715. presenceData.smallImageText = "Czyta temat...";
  716. presenceData.smallImageKey = Assets.Reading;
  717. } else {
  718. presenceData.details = `Przegląda artykuły${
  719. !privacySetting
  720. ? ` zawierające ${
  721. document.querySelector(".module-title h1.h2")?.textContent
  722. }`
  723. : ""
  724. }.`;
  725. if (!privacySetting) {
  726. presenceData.state = `Ilość artykułów: ${
  727. document.querySelector(".gridlove-posts").children.length
  728. } | Utworzono: ${dateOfPage}`;
  729. }
  730. presenceData.smallImageText = "Przegląda profil przewoźnika...";
  731. }
  732. if (!privacySetting)
  733. presenceData.buttons = [{ label: "Przeczytaj Artykuł", url: href }];
  734. }
  735. } else if (href.startsWith("https://travel.koleo.pl")) {
  736. presenceData.name = "KOLEO - travel";
  737. presenceData.largeImageKey = Assets.Logo2;
  738. presenceData.smallImageKey = Assets.Viewing;
  739. if (href.endsWith("travel.koleo.pl") || href.endsWith("travel.koleo.pl/")) {
  740. presenceData.details = "Przegląda travel KOLEO.";
  741. presenceData.smallImageText = "Przegląda travel...";
  742. } else {
  743. const topicOfPage =
  744. document.title.split("›")[0].trim() ||
  745. document.querySelector(".entry-header h1.entry-title")?.textContent;
  746. if (topicOfPage) {
  747. const authorOfPage = document.querySelector(
  748. ".mks_author_widget .widget-title"
  749. )?.textContent,
  750. dateOfPage = document.querySelector(
  751. ".entry-meta div.meta-date span"
  752. )?.textContent;
  753. if (dateOfPage) {
  754. presenceData.details = `Czyta informacje${
  755. authorOfPage && !privacySetting
  756. ? ` napisane przez ${authorOfPage}`
  757. : ""
  758. }...`;
  759. if (!privacySetting) {
  760. presenceData.state = [topicOfPage, dateOfPage]
  761. .filter(Boolean)
  762. .join(" | ");
  763. }
  764. presenceData.smallImageText = "Czyta informacje...";
  765. presenceData.smallImageKey = Assets.Reading;
  766. } else {
  767. presenceData.details = `Przegląda informacji${
  768. !privacySetting ? ` o ${topicOfPage.toLowerCase()}` : ""
  769. }.`;
  770. if (!privacySetting) {
  771. presenceData.state = `Ilość informacji: ${
  772. document.querySelector(".gridlove-posts").children.length
  773. }`;
  774. }
  775. presenceData.smallImageText = "Przegląda strone kraju...";
  776. }
  777. if (!privacySetting) {
  778. presenceData.buttons = [
  779. { label: "Przeczytaj Informacje", url: href },
  780. ];
  781. }
  782. } else {
  783. presenceData.details = "Przegląda travel KOLEO.";
  784. presenceData.smallImageText = "Przegląda travel...";
  785. }
  786. }
  787. } else if (href.startsWith("https://sklep.koleo.pl")) {
  788. presenceData.name = "KOLEO - sklep";
  789. presenceData.largeImageKey = Assets.Logo2;
  790. presenceData.smallImageKey = Assets.Viewing;
  791. if (
  792. href.endsWith("https://sklep.koleo.pl") ||
  793. href.endsWith("https://sklep.koleo.pl/")
  794. ) {
  795. presenceData.details = "Przegląda sklep KOLEO.";
  796. presenceData.smallImageText = "Przegląda sklep...";
  797. } else if (pathname.startsWith("/katalog")) {
  798. const page = document.querySelector(".page-numbers.current")?.textContent;
  799. presenceData.details = "Przegląda katalog produktów.";
  800. if (page) presenceData.state = `Strona: ${page}`;
  801. presenceData.smallImageText = "Przegląda katalog...";
  802. presenceData.buttons = [
  803. { label: "Zobacz katalog", url: "https://sklep.koleo.pl/katalog" },
  804. ];
  805. } else if (
  806. (pathname.startsWith("/koleo-kids/") ||
  807. pathname.startsWith("/klocki-lego/") ||
  808. pathname.startsWith("/kolejki-drewniane/") ||
  809. pathname.startsWith("/kdd/") ||
  810. pathname.startsWith("/ksiazki-dla-dzieci/") ||
  811. pathname.startsWith("/plakaty-kolejowe/") ||
  812. pathname.startsWith("/kubki-barowe/") ||
  813. pathname.startsWith("/odziez/") ||
  814. pathname.startsWith("/ksiazki/") ||
  815. pathname.startsWith("/artykuly-podrozne/") ||
  816. pathname.startsWith("/kalendarze/") ||
  817. pathname.startsWith("/karta-podarunkowa-koleo/") ||
  818. pathname.startsWith("/modelarstwo/") ||
  819. pathname.startsWith("/czasopisma/") ||
  820. pathname.startsWith("/gry/") ||
  821. pathname.startsWith("/duch-podrozy/") ||
  822. pathname.startsWith("/marka/") ||
  823. pathname.split("/")[2].includes("page")) &&
  824. !document.querySelector(".product_title")
  825. ) {
  826. const pageNumber = document.querySelector(
  827. ".page-numbers.current"
  828. )?.textContent;
  829. presenceData.details = `Przegląda produkty ${
  830. pathname.startsWith("/marka") ? "marki" : "katalogu"
  831. }${
  832. !privacySetting
  833. ? ` - ${
  834. document.querySelector(".woocommerce-products-header__title")
  835. ?.textContent
  836. }`
  837. : ""
  838. }.`;
  839. if (pageNumber) presenceData.state = `Strona: ${pageNumber}`;
  840. presenceData.smallImageText = "Przegląda katalog...";
  841. presenceData.buttons = [{ label: "Zobacz Katalog", url: href }];
  842. } else if (pathname.startsWith("/passy")) {
  843. presenceData.details = "Przegląda dostępne passy.";
  844. presenceData.smallImageText = "Przegląda passy...";
  845. const productTitle = document.querySelector(".product_title");
  846. if (productTitle) {
  847. presenceData.details = `Przegląda pass${
  848. privacySetting ? "" : ` - ${productTitle.textContent}`
  849. }.`;
  850. presenceData.smallImageText = "Przegląda pass...";
  851. if (!privacySetting) {
  852. presenceData.state = `Cena: ${
  853. document.querySelector(
  854. "div.woocommerce-variation-price span.price span.woocommerce-Price-amount.amount bdi"
  855. )?.textContent
  856. }`;
  857. presenceData.buttons = [{ label: "Zobacz Pass", url: href }];
  858. } else {
  859. presenceData.buttons = [
  860. { label: "Zobacz Passy", url: "https://sklep.koleo.pl/passy" },
  861. ];
  862. }
  863. }
  864. } else if (pathname.startsWith("/koszyk/")) {
  865. const cartItems = document.querySelectorAll(".cart_item");
  866. presenceData.details = "Przegląda swój koszyk.";
  867. if (!privacySetting) {
  868. presenceData.state = `${
  869. cartItems.length > 0
  870. ? `Ilość produktów w koszyku: ${
  871. cartItems.length
  872. } | Cena za wszystko: ${
  873. document.querySelector(".order-total .woocommerce-Price-amount")
  874. ?.textContent
  875. }`
  876. : "Nie ma nic w koszyku"
  877. }`;
  878. }
  879. presenceData.smallImageText = "Przegląda koszyk...";
  880. presenceData.smallImageKey = Assets.Buy;
  881. } else if (pathname.startsWith("/zamowienie")) {
  882. const cartItems = document.querySelectorAll(".cart_item");
  883. if (cartItems.length > 0) {
  884. presenceData.details = "Realizuje swoje zamówienie.";
  885. if (!privacySetting) {
  886. presenceData.state = `Cena za ${
  887. cartItems.length > 1
  888. ? `${cartItems.length} produktów`
  889. : `${cartItems.length} produkt`
  890. } wynosi ${
  891. document.querySelector(".order-total .woocommerce-Price-amount bdi")
  892. ?.textContent
  893. }`;
  894. }
  895. presenceData.smallImageText = "Realizuje zamówienie...";
  896. presenceData.smallImageKey = Assets.Buy;
  897. } else {
  898. presenceData.details = "Przegląda swoje zamówienie.";
  899. presenceData.smallImageText = "Przegląda zamówienie...";
  900. presenceData.smallImageKey = Assets.Buy;
  901. }
  902. } else if (pathname.startsWith("/moje-konto")) {
  903. if (document.querySelector(".woocommerce-form-login__submit")) {
  904. presenceData.details = "Loguje się do swojego konta KOLEO.";
  905. presenceData.smallImageText = "Loguje się...";
  906. presenceData.smallImageKey = Assets.Writing;
  907. } else {
  908. presenceData.details = "Przegląda swoje konto KOLEO.";
  909. presenceData.smallImageText = "Przegląda konto...";
  910. }
  911. if (pathname.startsWith("/moje-konto/lost-password")) {
  912. presenceData.details = "Resetuje swoje hasło do konta KOLEO.";
  913. presenceData.smallImageText = "Resetuje hasło...";
  914. presenceData.smallImageKey = Assets.Writing;
  915. }
  916. } else if (pathname.startsWith("/regulamin")) {
  917. presenceData.details = "Czyta regulamin sklepu KOLEO.";
  918. presenceData.smallImageText = "Czyta regulamin...";
  919. presenceData.smallImageKey = Assets.Reading;
  920. } else if (pathname.startsWith("/polityka-prywatnosci")) {
  921. presenceData.details = "Czyta politykę prywatności sklepu KOLEO.";
  922. presenceData.smallImageText = "Czyta politykę...";
  923. presenceData.smallImageKey = Assets.Reading;
  924. } else if (pathname.startsWith("/francuska-11a")) {
  925. presenceData.details = "Przegląda informacje kontaktowe KOLEO.";
  926. presenceData.smallImageText = "Przegląda informacje...";
  927. } else if (pathname.startsWith("/sklep-stacjonarny")) {
  928. presenceData.details =
  929. "Przegląda informacje o sklepie stacjonarnym KOLEO.";
  930. presenceData.smallImageText = "Przegląda informacje...";
  931. } else if (pathname.startsWith("/dostawa")) {
  932. presenceData.details = "Przegląda informacje o dostawie w sklepie KOLEO.";
  933. presenceData.smallImageText = "Przegląda informacje...";
  934. } else if (pathname.startsWith("/interrail-najczesciej-zadawane-pytania")) {
  935. presenceData.details =
  936. "Przegląda najczęściej zadawane pytania o bilety Interrail.";
  937. presenceData.smallImageText = "Przegląda pytania...";
  938. } else {
  939. const productTitle = document.querySelector(".product_title");
  940. if (productTitle) {
  941. presenceData.details = `Przegląda produkt${
  942. privacySetting ? "" : ` - ${productTitle.textContent}`
  943. }.`;
  944. presenceData.smallImageText = "Przegląda produkt...";
  945. if (!privacySetting) {
  946. presenceData.state = `${
  947. document.querySelector(".pwb-single-product-brands a")
  948. ? `Marka: ${
  949. document.querySelector(".pwb-single-product-brands a")
  950. .textContent
  951. } | `
  952. : ""
  953. }Cena: ${
  954. document.querySelector(".price span.woocommerce-Price-amount bdi")
  955. ?.textContent
  956. }`;
  957. presenceData.buttons = [{ label: "Zobacz Produkt", url: href }];
  958. } else {
  959. presenceData.buttons = [
  960. { label: "Zobacz Katalog", url: "https://sklep.koleo.pl/katalog" },
  961. ];
  962. }
  963. } else NoPage(presenceData);
  964. }
  965. } else NoPage(presenceData);
  966. presence.setActivity(presenceData);
  967. });