מודל שמיעת הודעה חדשה - בשלוחת השמעות קבצים לא אישית! (האם לפתח?)

חדשה 11 פוסטים 49 צפיות 3 נחוץ
  • האם לבנות מודל שכל פעם שמחייגים למערכת ישמיע האם יש לך הודעות חדשות בשלוחה, שהיא לא הודעה אישית אלא שלוחה רגילה?
    אם יש מישהו שמעוניין שיסמן "נחוץ"

    תוספות לבקשה (1)

    כמובן שההשמעה תכלול גם את נתיב השלוחה שבה נמצאת ההודעה החדשה.
    יכול להועיל למערכות עם שלוחה אחת שמתעדכנת שוטף ושלוחה אחת שכמעט לא מתעדכנת.

    נחוץ2
    נחוץ3
  • זה לא מה שיש כאן?
    https://f2.freeivr.co.il/post/110982

  • בתגובה ליעקב יצחק

    נראה לי שאתה צודק

  • שם זה נראלי רק להודעות אישיות, ואז הוא מעביר לאריכיון, אני טועה?

  • בתגובה לאיל משולש

    אהה יש אופציה להודעות אישיות
    וגם הארכיון זה אופציה לשילוב זה מה שהם כותבים בסוף
    "טיפ
    מומלץ לשלב את האפשרות הזאת עם ההגדרות של ארכיון בשלוחת השמעת קבצים. ראו כאן."

  • ?
    התגובה נמחקה על ידי הכותב.
  • בתגובה להדיבל המעופף

    נראלי הכוונה שאם לא ישלבו את זה, אז הראשון ישמע טזה כבר לא יהיה חדש, צריך לבדוק את זה...

  • בתגובה לאיל משולש

    עיינתי עכשיו בפוסט, זה באמת נראה שאתה צודק

  • מה עם https://youhaveanewmessage.a775529301.workers.dev/?

  • בתגובה ליעקב יצחק

    מה זה?

  • בתגובה לאיל משולש

    @איל-משולש כתב:

    מה זה?

    הדיבל המעופף פרס שם את הקוד הזה:

    // ---------- עזרים ----------
    function sanitizeSpeech(s) {
      return String(s || "").replace(/[.,\-=&]/g, " ").replace(/\s+/g, " ").trim();
    }
    function yemot(body, status = 200) {
      return new Response(body, {
        status,
        headers: { "Content-Type": "text/plain; charset=utf-8" },
      });
    }
    function whereSpeech(ext) {
      if (ext.name) return `t-${sanitizeSpeech(ext.name)}.`;
      if (/^\d+$/.test(ext.path)) return `d-${ext.path}.`;
      return `t-${sanitizeSpeech(ext.path)}.`;
    }
    
    // ---------- אחסון ----------
    async function up(cmd, UP_URL, UP_TOKEN) {
      const r = await fetch(UP_URL, {
        method: "POST",
        headers: { Authorization: `Bearer ${UP_TOKEN}` },
        body: JSON.stringify(cmd),
      });
      return (await r.json()).result;
    }
    async function loadHeard(env, key, UP_URL, UP_TOKEN) {
      if (UP_URL) {
        const v = await up(["GET", key], UP_URL, UP_TOKEN);
        return v ? JSON.parse(v) : {};
      }
      const v = await env.HEARD_KV.get(key);
      return v ? JSON.parse(v) : {};
    }
    async function saveHeard(env, key, data, UP_URL, UP_TOKEN) {
      if (UP_URL) return up(["SET", key, JSON.stringify(data)], UP_URL, UP_TOKEN);
      await env.HEARD_KV.put(key, JSON.stringify(data));
    }
    
    // ---------- ימות ----------
    async function listFiles(token, path) {
      const res = await fetch("https://www.call2all.co.il/ym/api/GetIVR2Dir", {
        method: "POST",
        headers: { Authorization: token, "Content-Type": "application/json" },
        body: JSON.stringify({ path: "ivr2:/" + path }),
      });
      const j = await res.json().catch(() => ({}));
      if (j.responseStatus !== "OK") return null;
      return (j.files || [])
        .filter(f => f.exists !== false && /\.(wav|mp3|ogg|m4a)$/i.test(f.name))
        .map(f => `${f.name}|${f.mtime || ""}`);
    }
    
    // ---------- נקודת הכניסה ----------
    export default {
      async fetch(request, env, ctx) {
        const url = new URL(request.url);
    
        if (url.pathname !== "/entry") {
          return new Response("Not Found", { status: 404 });
        }
    
        try {
          if (!(request.headers.get("User-Agent") || "").startsWith("yemot-core-api"))
            return yemot("id_list_message=t-גישה נדחתה", 403);
    
          const q = {};
          url.searchParams.forEach((v, k) => { q[k] = v; });
          if (request.method === "POST" || request.method === "PUT") {
            const text = await request.text();
            const params = new URLSearchParams(text);
            params.forEach((v, k) => { q[k] = v; });
          }
    
          const token = q.token || "";
          if (!/^\d{7,}:[A-Za-z0-9]+$/.test(token))
            return yemot("id_list_message=t-שגיאת הזדהות. הטוקן חסר או לא תקין");
    
          const phone = String(q.ApiPhone || "").replace(/\D/g, "");
          if (!phone) return yemot("id_list_message=t-לא זוהה מספר מתקשר");
    
          const EXTENSIONS = JSON.parse(env.EXTENSIONS || "[]");
          const NEXT_EXT = (env.NEXT_EXT || "").replace(/^\/+/, "");
          const SILENT_IF_NONE = env.SILENT_IF_NONE === "1";
          const UP_URL = env.UPSTASH_URL;
          const UP_TOKEN = env.UPSTASH_TOKEN;
    
          const key = `heard:${token.split(":")[0]}:${phone}`;
          const heard = await loadHeard(env, key, UP_URL, UP_TOKEN);
          const parts = [];
    
          for (const ext of EXTENSIONS) {
            const current = await listFiles(token, ext.path);
            if (current === null) continue;
            const known = heard[ext.path];
            if (known) {
              const seen = new Set(known);
              const fresh = current.filter(f => !seen.has(f)).length;
              if (fresh) parts.push(`t-בשלוחה.${whereSpeech(ext)}t-יש.n-${fresh}.t-הודעות חדשות.`);
            }
            heard[ext.path] = current;
          }
          await saveHeard(env, key, heard, UP_URL, UP_TOKEN);
    
          const next = NEXT_EXT ? `g-/${NEXT_EXT}` : "";
          if (!parts.length) {
            if (SILENT_IF_NONE) return yemot(next ? `id_list_message=${next}` : "");
            return yemot(`id_list_message=t-אין הודעות חדשות.${next}`);
          }
          return yemot(`id_list_message=t-שלום.t-יש הודעות שטרם שמעת.${parts.join("")}${next}`);
        } catch (e) {
          console.error(e);
          return yemot("");
        }
      }
    };
    

התחברו כדי להגיב