presence.ts 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739
  1. const presence = new Presence({
  2. clientId: "930914836773224498",
  3. }),
  4. browsingStamp = Math.floor(Date.now() / 1000);
  5. let remaining = 0,
  6. leftTimestamp = 0,
  7. player = {
  8. total: "",
  9. elapsed: "",
  10. isPlaying: false,
  11. },
  12. video = {
  13. currentTime: 0,
  14. duration: 0,
  15. paused: true,
  16. };
  17. enum OtherAssets {
  18. airborne = "https://cdn.rcd.gg/PreMiD/websites/F/Flightradar24/assets/0.png",
  19. arriving = "https://cdn.rcd.gg/PreMiD/websites/F/Flightradar24/assets/1.png",
  20. departing = "https://cdn.rcd.gg/PreMiD/websites/F/Flightradar24/assets/2.png",
  21. diverting = "https://cdn.rcd.gg/PreMiD/websites/F/Flightradar24/assets/3.png",
  22. onground = "https://cdn.rcd.gg/PreMiD/websites/F/Flightradar24/assets/4.png",
  23. }
  24. presence.on(
  25. "iFrameData",
  26. (data: {
  27. elapsed: string;
  28. total: string;
  29. isPlaying: boolean;
  30. currentTime: number;
  31. duration: number;
  32. paused: boolean;
  33. }) => {
  34. (player = {
  35. total: data.total,
  36. elapsed: data.elapsed,
  37. isPlaying: data.isPlaying,
  38. }),
  39. (video = {
  40. currentTime: data.currentTime,
  41. duration: data.duration,
  42. paused: data.paused,
  43. });
  44. }
  45. );
  46. presence.on("UpdateData", async () => {
  47. const [elapsed, buttons, images, timeLeft] = await Promise.all([
  48. presence.getSetting<boolean>("elapsed"),
  49. presence.getSetting<boolean>("buttons"),
  50. presence.getSetting<boolean>("images"),
  51. presence.getSetting<boolean>("timeLeft"),
  52. ]),
  53. presenceData: PresenceData = {
  54. largeImageKey:
  55. "https://cdn.rcd.gg/PreMiD/websites/F/Flightradar24/assets/logo.png",
  56. startTimestamp: browsingStamp,
  57. };
  58. switch (document.location.hostname.split(".")[0]) {
  59. case "www":
  60. switch (document.location.pathname.split("/")[1]) {
  61. case "data":
  62. switch (document.location.pathname.split("/")[2]) {
  63. case "airports":
  64. if (document.location.pathname === "/data/airports")
  65. presenceData.details = "Browsing Airports";
  66. else if (
  67. document.querySelector("[data-testid='cnt-subpage-title']")
  68. ) {
  69. presenceData.details = `Browsing ${
  70. document.querySelector("[data-testid='cnt-subpage-title']")
  71. .firstElementChild.firstChild.textContent
  72. }`;
  73. presenceData.state = `${
  74. document.querySelector("small").textContent.split(" ")[1]
  75. } ${document
  76. .querySelector("small")
  77. .textContent.split(" ")[2][0]
  78. .toUpperCase()}${document
  79. .querySelector("small")
  80. .textContent.split(" ")[2]
  81. .slice(1)}`;
  82. } else if (document.querySelector(".airport-name")) {
  83. presenceData.details = `Viewing ${
  84. document.querySelector(".airport-name").textContent
  85. }`;
  86. presenceData.state = document.querySelector<HTMLAnchorElement>(
  87. ".btn.active"
  88. ).childNodes[2]
  89. ? document.querySelector<HTMLAnchorElement>(".btn.active")
  90. .childNodes[2].textContent
  91. : document.querySelector<HTMLAnchorElement>(".btn.active")
  92. .textContent;
  93. presenceData.buttons = [
  94. {
  95. label: "View Airport",
  96. url: document.location.href,
  97. },
  98. ];
  99. } else presenceData.details = "Browsing Airports";
  100. break;
  101. case "airlines":
  102. if (document.querySelector(".airline-name")) {
  103. presenceData.details = `Viewing ${
  104. document.querySelector(".airline-name").textContent
  105. }`;
  106. presenceData.state = document.querySelector<HTMLAnchorElement>(
  107. ".btn.active"
  108. ).childNodes[2]
  109. ? document.querySelector<HTMLAnchorElement>(".btn.active")
  110. .childNodes[2].textContent
  111. : document.querySelector<HTMLAnchorElement>(".btn.active")
  112. .textContent;
  113. presenceData.buttons = [
  114. {
  115. label: "View Airline",
  116. url: document.location.href,
  117. },
  118. ];
  119. } else presenceData.details = "Browsing Airlines";
  120. break;
  121. case "aircraft":
  122. if (
  123. document.querySelector("[data-testid='cnt-subpage-title'] > h1")
  124. ) {
  125. presenceData.details = `Viewing ${document
  126. .querySelector("[data-testid='cnt-subpage-title'] > h1 ")
  127. .textContent.replace("Production lists - ", "")}`;
  128. presenceData.buttons = [
  129. {
  130. label: "View Page",
  131. url: document.location.href,
  132. },
  133. ];
  134. } else if (
  135. document.querySelector("[data-testid='cnt-subpage-info'] > h1")
  136. ) {
  137. presenceData.details = `Viewing ${document
  138. .querySelector("[data-testid='cnt-subpage-info'] > h1 ")
  139. .textContent.replace(
  140. "Flight history for aircraft -",
  141. "Aircraft"
  142. )}`;
  143. if (
  144. images &&
  145. document.querySelector(".img-responsive") &&
  146. document.querySelector<HTMLImageElement>(".img-responsive")
  147. .src !== ""
  148. ) {
  149. presenceData.largeImageKey =
  150. document.querySelector<HTMLImageElement>(
  151. ".img-responsive"
  152. ).src;
  153. }
  154. presenceData.buttons = [
  155. {
  156. label: "View Aircraft",
  157. url: document.location.href,
  158. },
  159. ];
  160. } else presenceData.details = "Browsing Aircraft";
  161. break;
  162. case "flights":
  163. if (
  164. document.querySelector("[data-testid='cnt-subpage-info'] > h1")
  165. ) {
  166. presenceData.details = `Viewing ${document
  167. .querySelector("[data-testid='cnt-subpage-info'] > h1 ")
  168. .textContent.match(/(flight .+$)/g)}`;
  169. presenceData.state = `${document
  170. .querySelector("[data-testid='cnt-subpage-info'] > h1 ")
  171. .textContent.replace(/(flight .+$)/g, "")
  172. .replace("Flight history for ", "")}`;
  173. presenceData.buttons = [
  174. {
  175. label: "View Page",
  176. url: document.location.href,
  177. },
  178. ];
  179. } else presenceData.details = "Browsing Flights";
  180. break;
  181. case "pinned":
  182. if (
  183. document.querySelector("[data-testid='cnt-subpage-info'] > h1")
  184. ) {
  185. presenceData.details = `Viewing ${document
  186. .querySelector("[data-testid='cnt-subpage-info'] > h1 ")
  187. .textContent.replace(
  188. "Flight history for aircraft -",
  189. "Aircraft"
  190. )}`;
  191. if (
  192. images &&
  193. document.querySelector(".img-responsive") &&
  194. document.querySelector<HTMLImageElement>(".img-responsive")
  195. .src !== ""
  196. ) {
  197. presenceData.largeImageKey =
  198. document.querySelector<HTMLImageElement>(
  199. ".img-responsive"
  200. ).src;
  201. }
  202. presenceData.buttons = [
  203. {
  204. label: "View Aircraft",
  205. url: document.location.href,
  206. },
  207. ];
  208. } else presenceData.details = "Browsing Pinned Flights";
  209. break;
  210. case "statistics":
  211. presenceData.details = "Viewing Statistics";
  212. break;
  213. case null:
  214. presenceData.details = "Searching Data";
  215. break;
  216. default:
  217. presenceData.details = "Searching Data";
  218. break;
  219. }
  220. break;
  221. case "apps":
  222. presenceData.details = "Viewing Mobile Apps";
  223. presenceData.state = document.querySelector("a.active").textContent;
  224. break;
  225. case "add-coverage":
  226. presenceData.details = "Viewing Add Coverage";
  227. break;
  228. case "apply-for-receiver":
  229. presenceData.details = "Viewing Apply For Receiver";
  230. break;
  231. case "share-your-data":
  232. presenceData.details = "Viewing Share Data";
  233. presenceData.state = document.querySelector("li.active").textContent;
  234. break;
  235. case "build-your-own":
  236. presenceData.details = "Viewing Build Your Own";
  237. presenceData.state = document.querySelector("li.active").textContent;
  238. break;
  239. case "share-statistics":
  240. presenceData.details = "Viewing Data Statistics";
  241. presenceData.state = `${
  242. document.querySelector("a.active").textContent.split(" ")[0]
  243. } ${document
  244. .querySelector("a.active")
  245. .textContent.split(" ")[1][0]
  246. .toUpperCase()}${document
  247. .querySelector("a.active")
  248. .textContent.split(" ")[1]
  249. .slice(1)}`;
  250. break;
  251. case "premium":
  252. presenceData.details = "Viewing Subscription Plans";
  253. break;
  254. case "about":
  255. presenceData.details = "Viewing About Flightradar24";
  256. break;
  257. case "how-it-works":
  258. presenceData.details = "Viewing How It Works";
  259. break;
  260. case "glossary":
  261. presenceData.details = "Viewing Glossary";
  262. break;
  263. case "faq":
  264. presenceData.details = "Viewing FAQ";
  265. break;
  266. case "contact-us":
  267. presenceData.details = "Viewing Contact Us";
  268. break;
  269. case "privacy-policy":
  270. presenceData.details = "Viewing Privacy Policy";
  271. break;
  272. case "terms-and-conditions":
  273. presenceData.details = "Viewing Terms of Service";
  274. break;
  275. case "commercial-services":
  276. if (
  277. document.location.pathname === "/commercial-services/data-services"
  278. )
  279. presenceData.details = "Viewing Data Services";
  280. else if (
  281. document.location.pathname ===
  282. "/commercial-services/app-integration"
  283. )
  284. presenceData.details = "Viewing App Integration";
  285. break;
  286. case "blog":
  287. switch (document.location.pathname) {
  288. case "/blog/": {
  289. presenceData.details = "Browsing Blog Posts";
  290. break;
  291. }
  292. case "/blog/newsletter/": {
  293. presenceData.details = "Viewing Newsletter";
  294. break;
  295. }
  296. case "/blog/avtalk-podcast/": {
  297. presenceData.details = "Viewing Podcast";
  298. break;
  299. }
  300. default:
  301. if (document.querySelector("iframe.blubrryplayer")) {
  302. [presenceData.details, presenceData.state] = document
  303. .querySelector(
  304. ".elementor-heading-title.elementor-size-default"
  305. )
  306. .textContent.split(":");
  307. if (player.isPlaying) {
  308. presenceData.smallImageKey = Assets.Play;
  309. presenceData.smallImageText = "Playing";
  310. [presenceData.startTimestamp, presenceData.endTimestamp] =
  311. presence.getTimestamps(
  312. presence.timestampFromFormat(player.total),
  313. presence.timestampFromFormat(player.elapsed)
  314. );
  315. } else {
  316. presenceData.smallImageKey = Assets.Pause;
  317. presenceData.smallImageText = "Paused";
  318. }
  319. } else if (
  320. document.querySelector(
  321. "h1.elementor-heading-title.elementor-size-default > i.fas.fa-video"
  322. )
  323. ) {
  324. if (video.duration !== 0) {
  325. [presenceData.startTimestamp, presenceData.endTimestamp] =
  326. presence.getTimestamps(
  327. presence.timestampFromFormat(player.total),
  328. presence.timestampFromFormat(player.elapsed)
  329. );
  330. } else if (document.querySelector("video")) {
  331. [presenceData.startTimestamp, presenceData.endTimestamp] =
  332. presence.getTimestampsfromMedia(
  333. document.querySelector<HTMLMediaElement>("video")
  334. );
  335. } else {
  336. presenceData.details = "Viewing Blog Post";
  337. presenceData.state = document.querySelector(
  338. "h1.elementor-heading-title.elementor-size-default"
  339. ).textContent;
  340. presenceData.buttons = [
  341. {
  342. label: "View Page",
  343. url: document.location.href,
  344. },
  345. ];
  346. }
  347. presenceData.details = "Watching Video";
  348. presenceData.state = document
  349. .querySelector(
  350. "h1.elementor-heading-title.elementor-size-default"
  351. )
  352. .textContent.replace("Video: ", "");
  353. if (video.duration !== 0) {
  354. presenceData.buttons = [
  355. {
  356. label: "View Page",
  357. url: document.location.href,
  358. },
  359. {
  360. label: "Watch Video",
  361. url: `https://www.youtube.com/watch?v=${
  362. document
  363. .querySelector<HTMLVideoElement>(
  364. "iframe.elementor-video"
  365. )
  366. .src.split("/")[4]
  367. .split("?")[0]
  368. }`,
  369. },
  370. ];
  371. } else if (document.querySelector("video")) {
  372. presenceData.buttons = [
  373. {
  374. label: "View Page",
  375. url: document.location.href,
  376. },
  377. {
  378. label: "Watch Video",
  379. url: document.querySelector<HTMLMetaElement>(
  380. "meta[itemprop='url']"
  381. ).content,
  382. },
  383. ];
  384. }
  385. if (video.duration !== 0) {
  386. if (video.paused) {
  387. presenceData.smallImageKey = Assets.Pause;
  388. presenceData.smallImageText = "Paused";
  389. } else {
  390. presenceData.smallImageKey = Assets.Play;
  391. presenceData.smallImageText = "Playing";
  392. }
  393. } else if (document.querySelector("video")) {
  394. if (
  395. document.querySelector<HTMLMediaElement>("video").paused
  396. ) {
  397. presenceData.smallImageKey = Assets.Pause;
  398. presenceData.smallImageText = "Paused";
  399. } else {
  400. presenceData.smallImageKey = Assets.Play;
  401. presenceData.smallImageText = "Playing";
  402. }
  403. }
  404. } else {
  405. presenceData.details = "Viewing Blog Post";
  406. presenceData.state = document.querySelector(
  407. "h1.elementor-heading-title.elementor-size-default"
  408. ).textContent;
  409. presenceData.buttons = [
  410. {
  411. label: "View Page",
  412. url: document.location.href,
  413. },
  414. ];
  415. }
  416. }
  417. break;
  418. default:
  419. if (
  420. document.querySelector(
  421. "[data-testid='view-selector-toggle'] > span:nth-child(2)"
  422. ).textContent === "Multi"
  423. ) {
  424. presenceData.details = `Viewing ${
  425. document.querySelector(
  426. "[data-testid='view-selector-toggle'] > span:nth-child(2)"
  427. ).textContent
  428. } Mode`;
  429. if (
  430. document.querySelector("[data-testid='multiselect__info-panel']")
  431. ) {
  432. presenceData.buttons = [
  433. {
  434. label: "View Page",
  435. url: document.location.href,
  436. },
  437. ];
  438. if (
  439. document.querySelectorAll(
  440. "[data-testid='multiselect__info-panel']"
  441. ).length === 1
  442. ) {
  443. presenceData.state = `Tracking ${document
  444. .querySelectorAll("[data-testid='multiselect__info-panel']")
  445. .length.toString()} Flight`;
  446. } else if (
  447. document.querySelectorAll(
  448. "[data-testid='multiselect__info-panel']"
  449. ).length >= 2
  450. ) {
  451. presenceData.state = `Tracking ${document
  452. .querySelectorAll("[data-testid='multiselect__info-panel']")
  453. .length.toString()} Flights`;
  454. }
  455. }
  456. } else if (
  457. document.querySelector(
  458. "[data-testid='view-selector-toggle'] > span:nth-child(2)"
  459. ).textContent === "Map"
  460. ) {
  461. presenceData.details = `Viewing ${
  462. document.querySelector(
  463. "[data-testid='view-selector-toggle'] > span:nth-child(2)"
  464. ).textContent
  465. } Mode`;
  466. if (document.querySelector("[data-testid='aircraft-panel']")) {
  467. if (
  468. document.querySelector(
  469. "[data-testid='aircraft-panel__header__callsign']"
  470. ).textContent === "N/A"
  471. ) {
  472. presenceData.details = `Tracking ${
  473. document.querySelector(
  474. "[data-testid='aircraft-panel__registration']"
  475. ).textContent
  476. }`;
  477. } else {
  478. presenceData.details = `Tracking ${
  479. document.querySelector(
  480. "[data-testid='aircraft-panel__header__callsign']"
  481. ).textContent
  482. }`;
  483. }
  484. presenceData.smallImageKey =
  485. OtherAssets[
  486. document
  487. .querySelector(
  488. "[data-testid='aircraft-panel'] [data-testid='base-tooltip__content']"
  489. )
  490. .textContent.toLocaleLowerCase()
  491. .replaceAll(" ", "") as keyof typeof OtherAssets
  492. ];
  493. presenceData.smallImageText = document.querySelector(
  494. "[data-testid='aircraft-panel'] [data-testid='base-tooltip__content']"
  495. ).textContent;
  496. if (
  497. document.querySelector(
  498. "[data-testid='aircraft-panel__flight-time-remaining'] > span"
  499. )
  500. ) {
  501. if (
  502. remaining !==
  503. parseInt(
  504. document
  505. .querySelector(
  506. "[data-testid='aircraft-panel__flight-time-remaining'] > span"
  507. )
  508. .textContent.slice(5)
  509. .split(":")[0]
  510. ) *
  511. 3600 +
  512. parseInt(
  513. document
  514. .querySelector(
  515. "[data-testid='aircraft-panel__flight-time-remaining'] > span"
  516. )
  517. .textContent.slice(5)
  518. .split(":")[1]
  519. ) *
  520. 60
  521. ) {
  522. remaining =
  523. parseInt(
  524. document
  525. .querySelector(
  526. "[data-testid='aircraft-panel__flight-time-remaining'] > span"
  527. )
  528. .textContent.slice(5)
  529. .split(":")[0]
  530. ) *
  531. 3600 +
  532. parseInt(
  533. document
  534. .querySelector(
  535. "[data-testid='aircraft-panel__flight-time-remaining'] > span"
  536. )
  537. .textContent.slice(5)
  538. .split(":")[1]
  539. ) *
  540. 60;
  541. leftTimestamp = Math.floor(Date.now() / 1000) + remaining;
  542. presenceData.endTimestamp = leftTimestamp;
  543. } else presenceData.endTimestamp = leftTimestamp;
  544. }
  545. if (
  546. images &&
  547. document.querySelector<HTMLAnchorElement>(
  548. "[data-testid='aircraft-panel__image-link']"
  549. ).href !== "https://www.jetphotos.com/addphotos/" &&
  550. document.querySelector<HTMLAnchorElement>(
  551. "[data-testid='aircraft-panel__image-link']"
  552. ).href !== ""
  553. ) {
  554. presenceData.largeImageKey =
  555. document.querySelector<HTMLImageElement>(
  556. "[data-testid='aircraft-panel__image-link'] > img"
  557. ).src;
  558. }
  559. presenceData.buttons = [
  560. {
  561. label: "View Page",
  562. url: document.location.href,
  563. },
  564. ];
  565. } else if (
  566. document.querySelector("[data-testid='airport-panel']")
  567. ) {
  568. presenceData.details = `Tracking ${
  569. document.querySelector(
  570. "[data-testid='airport-panel__header__name']"
  571. ).textContent
  572. }`;
  573. if (document.querySelector("span[class='AM']")) {
  574. presenceData.state = `${
  575. document.querySelector("span[class='AM']").textContent
  576. }am | ${
  577. document
  578. .querySelector(".pnl-component.airport-info > .time > span")
  579. .textContent.split("|")[1]
  580. } | ${
  581. document
  582. .querySelector(".pnl-component.airport-info > .time > span")
  583. .textContent.split("|")[2]
  584. }`;
  585. } else if (document.querySelector("span[class='PM']")) {
  586. presenceData.state = `${
  587. document.querySelector("span[class='PM']").textContent
  588. }pm | ${
  589. document
  590. .querySelector(".pnl-component.airport-info > .time > span")
  591. .textContent.split("|")[1]
  592. } | ${
  593. document
  594. .querySelector(".pnl-component.airport-info > .time > span")
  595. .textContent.split("|")[2]
  596. }`;
  597. }
  598. if (
  599. images &&
  600. document.querySelector<HTMLAnchorElement>(
  601. "[data-testid='airport-panel__image-link']"
  602. ).href !== "https://www.jetphotos.com/addphotos/" &&
  603. document.querySelector<HTMLAnchorElement>(
  604. "[data-testid='airport-panel__image-link']"
  605. ).href !== ""
  606. ) {
  607. presenceData.largeImageKey =
  608. document.querySelector<HTMLImageElement>(
  609. "[data-testid='airport-panel__image-link'] > img"
  610. ).src;
  611. }
  612. presenceData.buttons = [
  613. {
  614. label: "View Page",
  615. url: document.location.href,
  616. },
  617. ];
  618. }
  619. } else {
  620. presenceData.details = "Unsupported Page";
  621. presenceData.state = document.location.pathname;
  622. }
  623. break;
  624. }
  625. if (document.querySelector("[class='session-timeout-modal visible']"))
  626. presenceData.details = "Session Timed Out";
  627. break;
  628. case "forum":
  629. if (document.location.pathname === "/") {
  630. presenceData.details = `Viewing ${
  631. document.querySelector(".ui-state-active").textContent
  632. }`;
  633. } else if (document.location.pathname.split("/")[1] === "member") {
  634. presenceData.details = `Viewing ${
  635. document.querySelector(".ui-state-active").textContent
  636. } Of User`;
  637. presenceData.state = document.querySelector(".username").textContent;
  638. presenceData.buttons = [
  639. {
  640. label: "View Profile",
  641. url: document.location.href,
  642. },
  643. ];
  644. } else if (
  645. document.querySelector(".widget-tabs-nav > ul > .ui-state-active") &&
  646. document.querySelector("h1.main-title")
  647. ) {
  648. presenceData.details = `Viewing ${
  649. document.querySelector(".widget-tabs-nav > ul > .ui-state-active")
  650. .textContent
  651. } Of`;
  652. presenceData.state =
  653. document.querySelectorAll("h1.main-title")[1].textContent;
  654. presenceData.buttons = [
  655. {
  656. label: "View Page",
  657. url: document.location.href,
  658. },
  659. ];
  660. } else if (document.querySelector("h1.main-title")) {
  661. presenceData.details = `Viewing ${
  662. document.querySelectorAll("h1.main-title")[1].textContent
  663. }`;
  664. presenceData.buttons = [
  665. {
  666. label: "View Page",
  667. url: document.location.href,
  668. },
  669. ];
  670. } else {
  671. presenceData.details = "Unsupported Page";
  672. presenceData.state = document.location.pathname;
  673. }
  674. if (
  675. document.location.pathname.split("/")[1] === "search" &&
  676. document.querySelector(".search-controls-keywords")
  677. ) {
  678. presenceData.state = document.querySelector(
  679. ".search-controls-keywords"
  680. ).lastChild.textContent;
  681. }
  682. break;
  683. case "my":
  684. if (document.location.pathname.split("/")[1] === "settings") {
  685. presenceData.details = "Viewing Settings";
  686. presenceData.state = document.querySelector("li.active").textContent;
  687. } else if (document.location.pathname.split("/")[1] === "friends")
  688. presenceData.details = "Viewing Friends";
  689. else if (document.location.pathname.split("/")[1] === "add-flight")
  690. presenceData.details = "Adding Flight To Log";
  691. else if (document.location.pathname !== "/") {
  692. presenceData.details = `Viewing Profile Of ${
  693. document.querySelector("h3").textContent
  694. }`;
  695. presenceData.state = document.querySelector("h2").textContent;
  696. presenceData.buttons = [
  697. {
  698. label: "View Page",
  699. url: document.location.href,
  700. },
  701. ];
  702. if (images) {
  703. presenceData.largeImageKey = document
  704. .querySelector<HTMLImageElement>("img.avatar")
  705. .src.replace("=64", "=1024")
  706. .replace("=64", "=1024");
  707. }
  708. } else presenceData.details = "Viewing Logbook Homepage";
  709. break;
  710. case "careers":
  711. presenceData.details = "Careers at Flightradar24";
  712. if (document.location.pathname === "/jobs")
  713. presenceData.state = "Browsing Jobs";
  714. else if (document.querySelector("span.textFitted")) {
  715. presenceData.state =
  716. document.querySelector("span.textFitted").textContent;
  717. } else
  718. presenceData.state = document.querySelectorAll("h2")[1].textContent;
  719. break;
  720. default:
  721. presenceData.details = "Unsupported Subdomain";
  722. presenceData.state = document.location.hostname;
  723. break;
  724. }
  725. if (!elapsed) delete presenceData.startTimestamp;
  726. if (!timeLeft) delete presenceData.endTimestamp;
  727. if (!buttons && presenceData.buttons) delete presenceData.buttons;
  728. presence.setActivity(presenceData);
  729. });