123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439 |
- const presence = new Presence({
- clientId: "839409255979155516",
- }),
- getStrings = async () => {
- return presence.getStrings(
- {
- play: "general.playing",
- pause: "general.paused",
- browse: "general.browsing",
- searchFor: "general.searchFor",
- searchSomething: "general.searchSomething",
- viewEpisode: "general.buttonViewEpisode",
- viewAnime: "general.viewAnime",
- viewSeries: "general.buttonViewSeries",
- viewAccount: "general.viewAccount",
- viewMovie: "general.viewMovie",
- buttonViewMovie: "general.buttonViewMovie",
- watchMovie: "general.watchingMovie",
- watchSeries: "general.watchingSeries",
- },
- await presence.getSetting<string>("lang").catch(() => "en")
- );
- },
- data: {
- oldLang?: string;
- startedSince?: number;
- meta?: {
- [key: string]: string;
- };
- settings?: {
- id?: string;
- delete?: boolean;
- value?: boolean;
- uses?: (keyof PresenceData)[];
- presence?: {
- page: string;
- uses?: keyof PresenceData;
- setTo?: string;
- if?:
- | {
- k: boolean;
- v?: string;
- delete?: boolean;
- }
- | {
- k: boolean;
- v?: string;
- delete?: boolean;
- }[];
- replace?: {
- input: string;
- output: string;
- }[];
- }[];
- }[];
- presence: {
- [key: string]: {
- disabled?: boolean;
- setPresenceData?: () => void;
- };
- };
- presenceData: PresenceData;
- } = {
- presence: {},
- meta: {},
- oldLang: "",
- startedSince: ~~(Date.now() / 1000),
- presenceData: {
- type: ActivityType.Watching,
- largeImageKey:
- "https://cdn.rcd.gg/PreMiD/websites/B/BetterAnime/assets/logo.png",
- smallImageKey: Assets.Search,
- },
- };
- let strings: Awaited<ReturnType<typeof getStrings>>,
- video: {
- duration: number;
- currentTime: number;
- paused: boolean;
- };
- presence.on("iFrameData", (data: typeof video) => {
- if (data) video = data;
- });
- presence.on("UpdateData", async () => {
- const [
- newLang,
- privacy,
- anime,
- movie,
- browse,
- timestamp,
- AnimeState,
- MovieState,
- ] = await Promise.all([
- presence.getSetting<string>("lang").catch(() => "en"),
- presence.getSetting<boolean>("privacy"),
- presence.getSetting<boolean>("anime"),
- presence.getSetting<boolean>("movie"),
- presence.getSetting<boolean>("browse"),
- presence.getSetting<boolean>("timestamp"),
- presence.getSetting<string>("AnimeState"),
- presence.getSetting<string>("MovieState"),
- ]),
- { pathname, search, href } = document.location;
- if (data.oldLang !== newLang || !strings) {
- data.oldLang = newLang;
- strings = await getStrings();
- }
- if (browse) data.presenceData.details = strings.browse;
- if (
- timestamp &&
- !data.presenceData.startTimestamp &&
- !data.presenceData.endTimestamp
- )
- data.presenceData.startTimestamp = data.startedSince;
- data.presence = {
- "/anime/(dublado|legendado)/([a-zA-Z0-9-]+)/([a-z-0-9]+)": {
- disabled: !anime,
- async setPresenceData() {
- data.meta.episode = document.querySelector(
- "div.anime-title > h3"
- )?.textContent;
- data.meta.title = document
- .querySelector("div.anime-title")
- ?.textContent?.replace(data.meta.episode, "");
- data.presenceData.smallImageKey = video.paused
- ? Assets.Pause
- : Assets.Play;
- data.presenceData.smallImageText = video.paused
- ? (await strings).pause
- : (await strings).play;
- [data.presenceData.startTimestamp, data.presenceData.endTimestamp] =
- presence.getTimestamps(video.currentTime, video.duration);
- const seriesURL = document.querySelector<HTMLAnchorElement>(
- "div.anime-title > h2 > a"
- )?.href;
- if (!seriesURL) {
- data.presenceData.buttons = [
- {
- label: (await strings).viewEpisode,
- url: href,
- },
- ];
- } else {
- data.presenceData.buttons = [
- {
- label: (await strings).viewEpisode,
- url: href,
- },
- {
- label: (await strings).viewSeries,
- url: seriesURL,
- },
- ];
- }
- if (video.paused) {
- delete data.presenceData.endTimestamp;
- delete data.presenceData.startTimestamp;
- }
- },
- },
- "/anime/(dublado|legendado)/([a-zA-Z0-9-]+)": {
- disabled: privacy || !anime,
- async setPresenceData() {
- data.presenceData.details = (await strings).viewAnime;
- data.presenceData.state = document.querySelector(
- "div.infos_left > div > h2"
- )?.textContent;
- data.presenceData.buttons = [
- {
- label: (await strings).viewSeries,
- url: href,
- },
- ];
- },
- },
- "/filme/(dublado|legendado)/([a-zA-Z0-9-]+)/([a-z-]+)": {
- disabled: !movie,
- async setPresenceData() {
- data.meta.title =
- document
- .querySelector("div.anime-title")
- ?.textContent?.replace(
- document.querySelector("div.anime-title > h3")?.textContent ?? "",
- ""
- ) ?? "";
- data.presenceData.smallImageKey = video.paused
- ? Assets.Pause
- : Assets.Play;
- data.presenceData.smallImageText = video.paused
- ? (await strings).pause
- : (await strings).play;
- [data.presenceData.startTimestamp, data.presenceData.endTimestamp] =
- presence.getTimestamps(video.currentTime, video.duration);
- data.presenceData.buttons = [
- {
- label: (await strings).buttonViewMovie,
- url: href,
- },
- ];
- if (video.paused) {
- delete data.presenceData.endTimestamp;
- delete data.presenceData.startTimestamp;
- }
- },
- },
- "/filme/(dublado|legendado)/([a-zA-Z0-9-]+)": {
- disabled: privacy || !movie,
- async setPresenceData() {
- data.presenceData.details = (await strings).viewMovie;
- data.presenceData.state = document.querySelector(
- "div.infos_left > div > h2"
- )?.textContent;
- data.presenceData.buttons = [
- {
- label: (await strings).buttonViewMovie,
- url: href,
- },
- ];
- },
- },
- "/minha-conta": {
- disabled: privacy,
- async setPresenceData() {
- data.presenceData.details = (await strings).viewAccount;
- },
- },
- "/pesquisa": {
- async setPresenceData() {
- data.presenceData.details = (await strings).searchFor;
- data.presenceData.state = new URLSearchParams(search).get("titulo");
- },
- },
- };
- data.settings = [
- {
- id: "timestamp",
- delete: true,
- uses: ["startTimestamp", "endTimestamp"],
- },
- {
- id: "buttons",
- delete: true,
- uses: ["buttons"],
- },
- {
- id: "privacy",
- delete: true,
- value: true,
- uses: ["buttons"],
- },
- {
- presence: [
- {
- page: "/pesquisa",
- uses: "state",
- if: {
- k: privacy,
- delete: true,
- },
- },
- {
- page: "/pesquisa",
- uses: "details",
- if: {
- k: privacy,
- v: (await strings).searchSomething,
- },
- },
- {
- page: "/anime/(dublado|legendado)/([a-zA-Z0-9-]+)/([a-z-0-9]+)",
- uses: "details",
- setTo: await presence.getSetting<string>("AnimeDetails"),
- if: [
- {
- k: privacy && anime,
- v: (await strings).watchSeries,
- },
- {
- k: !anime,
- delete: true,
- },
- ],
- replace: [
- {
- input: "%title%",
- output: data.meta.title,
- },
- {
- input: "%episode%",
- output: data.meta.episode,
- },
- ],
- },
- {
- page: "/anime/(dublado|legendado)/([a-zA-Z0-9-]+)/([a-z-0-9]+)",
- uses: "state",
- setTo: AnimeState,
- if: {
- k: !anime || privacy || AnimeState.includes("{0}"),
- delete: true,
- },
- replace: [
- {
- input: "%title%",
- output: data.meta.title,
- },
- {
- input: "%episode%",
- output: data.meta.episode,
- },
- ],
- },
- {
- page: "/filme/(dublado|legendado)/([a-zA-Z0-9-]+)/([a-z-0-9]+)",
- uses: "details",
- setTo: await presence.getSetting<string>("MovieDetails"),
- if: [
- {
- k: privacy && movie,
- v: (await strings).watchMovie,
- },
- {
- k: !movie,
- delete: true,
- },
- ],
- replace: [
- {
- input: "%title%",
- output: data.meta.title,
- },
- ],
- },
- {
- page: "/filme/(dublado|legendado)/([a-zA-Z0-9-]+)/([a-z-0-9]+)",
- uses: "state",
- setTo: MovieState,
- if: {
- k: !movie || privacy || MovieState.includes("{0}"),
- delete: true,
- },
- replace: [
- {
- input: "%title%",
- output: data.meta.title,
- },
- ],
- },
- ],
- },
- ];
- for (const [k, v] of Object.entries(data.presence)) {
- if (pathname.match(k) && !v.disabled) {
- v.setPresenceData();
- break;
- }
- }
- for (const setting of data.settings) {
- const settingValue = await presence
- .getSetting<boolean>(setting.id)
- .catch(() => null);
- if (
- ((!settingValue && !setting.value) || settingValue === setting.value) &&
- setting.delete &&
- !setting.presence
- ) {
- for (const PData of setting.uses)
- delete data.presenceData[PData as keyof PresenceData];
- } else if (setting.presence) {
- for (const presenceSetting of setting.presence) {
- if (pathname.match(presenceSetting.page)) {
- if (presenceSetting.setTo && !presenceSetting.replace) {
- data.presenceData[presenceSetting.uses as "details"] =
- presenceSetting.setTo;
- } else if (presenceSetting.setTo && presenceSetting.replace) {
- let replaced = presenceSetting.setTo;
- for (const toReplace of presenceSetting.replace)
- replaced = replaced.replace(toReplace.input, toReplace.output);
- if (replaced)
- data.presenceData[presenceSetting.uses as "details"] = replaced;
- }
- if (presenceSetting.if) {
- if (Array.isArray(presenceSetting.if)) {
- for (const setting of presenceSetting.if) {
- if (setting.k) {
- if (setting.delete && !setting.v)
- delete data.presenceData[presenceSetting.uses];
- else if (setting.v) {
- data.presenceData[presenceSetting.uses as "details"] =
- setting.v;
- }
- }
- }
- } else if (presenceSetting.if.k) {
- if (presenceSetting.if.delete && !presenceSetting.if.v)
- delete data.presenceData[presenceSetting.uses];
- else if (presenceSetting.if.v) {
- data.presenceData[presenceSetting.uses as "details"] =
- presenceSetting.if.v;
- }
- }
- }
- }
- }
- }
- }
- for (const x of ["state", "details"]) {
- if (data.presenceData[x as "details"] === "undefined")
- delete data.presenceData[x as "details"];
- }
- if (!data.presenceData.details) presence.setActivity();
- else presence.setActivity(data.presenceData);
- });
|