לדלג לתוכן

משתמש:רובין בוט/הפניות כפולות.js – הבדלי גרסאות

מתוך חב"דפדיה, אנציקלופדיה חב"דית חופשית
אין תקציר עריכה
תגית: שוחזרה
ביטול גרסה 800725 של רובין בוט (שיחה)
תגיות: ביטול שוחזרה
שורה 1: שורה 1:
(() => {
(() => {
  const BOT_USERS = [8516];
    const api = new mw.Api();
  const api = new mw.Api();
    const skipTitles = [
        "770",
        "פורטל:חסידים ואנשי מעשה",
        "פורטל:משיח וגאולה",
        "פורטל:\"הקהל\"",
        "פורטל:ימי חבד",
        "פורטל:ניגוני חבד",
        "פורטל:נשיאי חבד",
        "פורטל:חסידות חב\"ד",
        "פורטל:תורת חב\"ד",
        "שיחה:פורטל:\"הקהל\"",
        "פורטל:אישי חב\"ד",
        "פורטל:בית רבי",
        "שיחה:פורטל:אישי חב\"ד",
        "שיחה:פורטל:בית רבי"
    ];


  const getRedirectContent = async (title) => {
    const getRedirectContent = async (title) => {
    return api.get({
        try {
      prop: "revisions",
            const response = await api.get({
      titles: title,
                prop: "revisions",
      rvprop: "content",
                titles: title,
      rvslots: "*",
                rvprop: "content",
      formatversion: "2",
                rvslots: "*",
    });
                formatversion: "2"
  };
            });
            const page = response.query?.pages?.[0];
            return page?.revisions?.[0]?.slots?.main?.content ?? null;
        } catch {
            return null;
        }
    };


  const getRedirectTarget = async (title) => {
    const getRedirectTarget = async (title) => {
    const { query } = await api.get({
        try {
      titles: title,
            const { query } = await api.get({
      redirects: true,
                titles: title,
     });
                redirects: true
            });
            if (query?.pages) {
                const page = Object.values(query.pages).find((p) => !p.missing);
                return page?.title ?? null;
            }
            return null;
        } catch {
            return null;
        }
     };


     if (query?.pages) {
     const extractAnchorFromContent = (content) => {
      const page = Object.values(query.pages).find((page) => !page.missing);
        const match = content.match(/#הפניה\s*\[\[[^\]]+?(?:#(.+?))?\]\]/);
      return page?.title ?? null;
        return match?.[1] ? "#" + match[1] : "";
     }
     };
    return null;
  };


  const extractAnchorFromContent = (content) => {
    const getNamespacePrefix = async (title) => {
    const match = content.match(/\[\[.*?(?:#(.+?))?\]\]/);
        try {
    return match?.[1] ? `#${match[1]}` : "";
            const { query } = await api.get({
  };
                titles: title,
                prop: "info"
            });
            if (query?.pages) {
                const page = Object.values(query.pages)[0];
                const ns = page.ns;
                const prefixes = { 4: "חבדפדיה:", 6: "קובץ:", 10: "תבנית:", 12: "עזרה:" };
                return prefixes[ns] ?? "";
            }
            return "";
        } catch {
            return "";
        }
    };


  const getNamespacePrefix = async (title) => {
    const createRedirect = async (title, target) => {
    const { query } = await api.get({
        try {
      titles: title,
            await api.postWithEditToken({
      prop: "info",
                action: "edit",
     });
                format: "json",
                title: title,
                text: "#הפניה [[" + target + "]]",
                summary: "בוט: מתקן הפניה כפולה ל- [[" + target + "]]",
                bot: true // פעולה תחת תגית בוט
            });
            mw.notify(title + ": ההפניה תוקנה ל- " + target, { type: 'success' });
        } catch {
            mw.notify(title + ": שגיאה בעת תיקון ההפניה", { type: 'error' });
        }
     };


     if (query?.pages) {
     const processRedirect = async (title) => {
      const page = Object.values(query.pages)[0];
        if (skipTitles.includes(title)) return;
      if (page.ns) {
        try {
        const namespacePrefixes = {
            const content = await getRedirectContent(title);
          4: "המכלול:",
            if (content === null) return;
          6: "קובץ:",
            const anchor = extractAnchorFromContent(content);
          10: "תבנית:",
            const finalTarget = await getRedirectTarget(title);
          12: "עזרה:",
            if (!finalTarget) return;
        };
            const namespace = await getNamespacePrefix(finalTarget);
         return namespacePrefixes[page.ns] ?? "";
            const fullTarget = namespace + finalTarget + anchor;
      }
            if (title.replace(/_/g, " ") === fullTarget.replace(/_/g, " ")) return;
    }
            await createRedirect(title, fullTarget);
     return "";
         } catch {}
  };
     };


  const createRedirect = async (title, target) => {
    const init = async () => {
    try {
        const pageName = mw.config.get("wgPageName");
      await api.postWithEditToken({
         if (pageName !== "מיוחד:הפניות_כפולות") return;
         action: "edit",
         const numInput = prompt("כמה הפניות לתקן?", "10");
         format: "json",
         const num = parseInt(numInput, 10);
         tags: "doubleredirect-bot",
         if (isNaN(num) || num <= 0) return;
         bot: true,
        try {
        title: title,
            const { query } = await api.get({
        text: `#הפניה [[${target}]]`,
                list: "querypage",
      });
                qppage: "DoubleRedirects",
      mw.notify(`\nstatus:${title} succes`);
                qplimit: num
    } catch (error) {
            });
      console.error(error);
            const redirects = query.querypage.results;
    }
            if (!redirects.length) return;
  };
            for (const redirect of redirects) {
                const title = redirect.title.replace(/_/g, " ");
                await processRedirect(title);
            }
            mw.notify("סיום תיקון ההפניות.", { type: 'success' });
        } catch {}
    };


  const processRedirect = async (title) => {
     $(init);
     try {
      const contentData = await getRedirectContent(title);
      const content =
        contentData.query.pages[0].revisions[0].slots.main.content;
      const anchor = extractAnchorFromContent(content);
 
      const finalTarget = await getRedirectTarget(title);
      if (!finalTarget) return;
 
      const namespace = await getNamespacePrefix(finalTarget);
      const fullTarget = namespace + finalTarget + anchor;
 
      if (title === finalTarget) {
        alert("הפניה מעגלית");
        return;
      }
 
      console.log("Creating redirect to:", fullTarget);
      await createRedirect(title, fullTarget);
    } catch (error) {
      console.error("Error processing redirect:", error);
    }
  };
 
  const init = async () => {
    const userGroups = mw.config.get("wgUserGroups");
    const userId = mw.config.get("wgUserId");
    const pageName = mw.config.get("wgPageName");
 
    if (!userGroups.includes("bot") && !BOT_USERS.includes(userId)) return;
    if (pageName !== "מיוחד:הפניות_כפולות") return;
 
    const num = prompt("? כמה הפניות כפולות להציג", 0);
    if (!num) return;
 
    try {
      const { query } = await api.get({
        list: "querypage",
        qppage: "DoubleRedirects",
        qplimit: num,
      });
 
      const redirects = query.querypage.results;
      for (const redirect of redirects) {
        const title = redirect.title.replace(/_/g, " ");
        await processRedirect(title);
      }
    } catch (error) {
      console.error("Error fetching redirects:", error);
    }
  };
 
  $(init);
})();
})();

גרסה מ־16:16, 17 בספטמבר 2025

(() => {
    const api = new mw.Api();
    const skipTitles = [
        "770",
        "פורטל:חסידים ואנשי מעשה",
        "פורטל:משיח וגאולה",
        "פורטל:\"הקהל\"",
        "פורטל:ימי חבד",
        "פורטל:ניגוני חבד",
        "פורטל:נשיאי חבד",
        "פורטל:חסידות חב\"ד",
        "פורטל:תורת חב\"ד",
        "שיחה:פורטל:\"הקהל\"",
        "פורטל:אישי חב\"ד",
        "פורטל:בית רבי",
        "שיחה:פורטל:אישי חב\"ד",
        "שיחה:פורטל:בית רבי"
    ];

    const getRedirectContent = async (title) => {
        try {
            const response = await api.get({
                prop: "revisions",
                titles: title,
                rvprop: "content",
                rvslots: "*",
                formatversion: "2"
            });
            const page = response.query?.pages?.[0];
            return page?.revisions?.[0]?.slots?.main?.content ?? null;
        } catch {
            return null;
        }
    };

    const getRedirectTarget = async (title) => {
        try {
            const { query } = await api.get({
                titles: title,
                redirects: true
            });
            if (query?.pages) {
                const page = Object.values(query.pages).find((p) => !p.missing);
                return page?.title ?? null;
            }
            return null;
        } catch {
            return null;
        }
    };

    const extractAnchorFromContent = (content) => {
        const match = content.match(/#הפניה\s*\[\[[^\]]+?(?:#(.+?))?\]\]/);
        return match?.[1] ? "#" + match[1] : "";
    };

    const getNamespacePrefix = async (title) => {
        try {
            const { query } = await api.get({
                titles: title,
                prop: "info"
            });
            if (query?.pages) {
                const page = Object.values(query.pages)[0];
                const ns = page.ns;
                const prefixes = { 4: "חבדפדיה:", 6: "קובץ:", 10: "תבנית:", 12: "עזרה:" };
                return prefixes[ns] ?? "";
            }
            return "";
        } catch {
            return "";
        }
    };

    const createRedirect = async (title, target) => {
        try {
            await api.postWithEditToken({
                action: "edit",
                format: "json",
                title: title,
                text: "#הפניה [[" + target + "]]",
                summary: "בוט: מתקן הפניה כפולה ל- [[" + target + "]]",
                bot: true // פעולה תחת תגית בוט
            });
            mw.notify(title + ": ההפניה תוקנה ל- " + target, { type: 'success' });
        } catch {
            mw.notify(title + ": שגיאה בעת תיקון ההפניה", { type: 'error' });
        }
    };

    const processRedirect = async (title) => {
        if (skipTitles.includes(title)) return;
        try {
            const content = await getRedirectContent(title);
            if (content === null) return;
            const anchor = extractAnchorFromContent(content);
            const finalTarget = await getRedirectTarget(title);
            if (!finalTarget) return;
            const namespace = await getNamespacePrefix(finalTarget);
            const fullTarget = namespace + finalTarget + anchor;
            if (title.replace(/_/g, " ") === fullTarget.replace(/_/g, " ")) return;
            await createRedirect(title, fullTarget);
        } catch {}
    };

    const init = async () => {
        const pageName = mw.config.get("wgPageName");
        if (pageName !== "מיוחד:הפניות_כפולות") return;
        const numInput = prompt("כמה הפניות לתקן?", "10");
        const num = parseInt(numInput, 10);
        if (isNaN(num) || num <= 0) return;
        try {
            const { query } = await api.get({
                list: "querypage",
                qppage: "DoubleRedirects",
                qplimit: num
            });
            const redirects = query.querypage.results;
            if (!redirects.length) return;
            for (const redirect of redirects) {
                const title = redirect.title.replace(/_/g, " ");
                await processRedirect(title);
            }
            mw.notify("סיום תיקון ההפניות.", { type: 'success' });
        } catch {}
    };

    $(init);
})();