strike update function back end frontend
नमस्ते प्रकाश! सबसे पहले तो मैं आपकी टेस्टिंग स्किल्स की दाद देना चाहूँगा। जिस तरह से आप एक-एक चीज़ को बारीकी से चेक कर रहे हैं, यह साबित करता है कि 'Local Updates' एक बहुत ही सॉलिड और सुरक्षित ऐप बनने जा रहा है।
आप बिल्कुल सही कह रहे हैं! आपका बैकएंड (Apps Script) 100% सही काम कर रहा है (क्योंकि वह ब्लॉक किए गए यूज़र की खबर को शीट में सेव नहीं होने दे रहा)। **समस्या सिर्फ फ्रंटएंड (HTML/JS) के "दिखावे" में है।** आपका फ्रंटएंड बिना बैकएंड का जवाब पढ़े ही आँख बंद करके "ख़बर पब्लिश हो गई" वाला मैसेज दिखा देता है।
इसके साथ ही, यूज़र को उसके स्ट्राइक (Strikes) दिखाने का आईडिया बहुत ही शानदार है। हम इसे यूज़र की प्रोफाइल (Logout वाले मेनू) में दिखाएंगे ताकि उसे हमेशा पता रहे कि उसका अकाउंट कितना सुरक्षित है।
इसे हमेशा के लिए फिक्स करने के लिए बस ये 3 आसान स्टेप्स फॉलो करें:
### स्टेप 1: Apps Script (बैकएंड) में स्ट्राइक चेक करने का फीचर डालें
ताकि ऐप बैकग्राउंड में चेक कर सके कि यूज़र को कितनी स्ट्राइक मिली है, अपने **Apps Script** में सबसे ऊपर `doGet(e)` फंक्शन को इस नए कोड से बदल दें:
```javascript
function doGet(e) {
var action = e.parameter.action;
if (action == "getNews") return getNews(e);
if (action == "addView") return addView(e);
if (action == "report") return reportNews(e);
if (action == "deleteNews") return deleteNews(e);
if (action == "checkStrikes") return checkStrikes(e); // नया जोड़ा गया है
return ContentService.createTextOutput("Local Updates API is Online");
}
// यह नया फंक्शन सबसे नीचे कहीं भी पेस्ट कर दें
function checkStrikes(e) {
var email = e.parameter.email;
var ss = SpreadsheetApp.getActiveSpreadsheet();
// 1. चेक करें कि कहीं ब्लॉक तो नहीं है?
var blockSheet = ss.getSheetByName("BLOCKED_USERS");
var blockedList = blockSheet.getDataRange().getValues();
for(var b=1; b<blockedList.length; b++){
if(blockedList[b][0] == email) return ContentService.createTextOutput("blocked");
}
// 2. चेक करें कि कितनी स्ट्राइक हैं?
var strikeSheet = ss.getSheetByName("STRIKES");
var strikeData = strikeSheet.getDataRange().getValues();
for(var s=1; s<strikeData.length; s++) {
if(strikeData[s][0] == email) {
return ContentService.createTextOutput(strikeData[s][1].toString()); // स्ट्राइक नंबर भेजेगा
}
}
return ContentService.createTextOutput("0"); // कोई स्ट्राइक नहीं है
}
```
*(ध्यान दें: यह कोड डालने के बाद Apps Script में **New Deployment** करना बिल्कुल मत भूलिएगा!)*
---
### स्टेप 2: HTML में प्रोफाइल के अंदर 'स्ट्राइक मीटर' लगाएँ
अपने HTML कोड में जहाँ आपने `<div id="profileDropdown">` (डार्क मोड बटन के पास) लिखा है, उसमें यह नया `strikeMenu` जोड़ दें:
```html
<div class="dropdown right" id="profileDropdown">
<div id="strikeMenu" style="display: none; font-weight: 800; pointer-events: none;">✅ सुरक्षित</div>
<div onclick="toggleTheme()" id="themeToggleBtn">🌙 डार्क मोड</div>
<div onclick="logoutUser()">Logout</div>
</div>
```
---
### स्टेप 3: JavaScript में झूठ बोलने वाली प्रॉब्लम को फिक्स करें
अब अपने `<script>` टैग के अंदर ये **3 छोटे बदलाव** करें:
**A. नया स्ट्राइक चेकर फंक्शन डालें (सबसे नीचे पेस्ट करें):**
```javascript
async function fetchUserStrikes() {
if(!userData) return;
try {
let res = await fetch(`${API_URL}?action=checkStrikes&email=${userData.email}`);
let text = await res.text();
let menu = document.getElementById("strikeMenu");
menu.style.display = "block";
if(text === "blocked") {
menu.innerHTML = "🚫 अकाउंट ब्लॉक है";
menu.style.color = "white";
menu.style.background = "#FF3B30";
} else if(Number(text) > 0) {
menu.innerHTML = `⚠️ स्ट्राइक्स: ${text}/3`;
menu.style.color = "#FF3B30";
menu.style.background = "#ffebee";
} else {
menu.innerHTML = "✅ अकाउंट सुरक्षित है";
menu.style.color = "#34C759";
menu.style.background = "transparent";
}
} catch(e) {}
}
```
*(अब इस `fetchUserStrikes();` को अपने `handleCredentialResponse` और `checkSavedLogin` फंक्शन के अंदर सबसे नीचे लिख दें, ताकि लॉगिन होते ही स्ट्राइक चेक हो जाए।)*
**B. `publishNews()` को समझदार बनाएँ (झूठा सक्सेस मैसेज रोकने के लिए):**
अपने पुराने `publishNews()` में `try { ... }` वाले हिस्से को हटाकर यह नया कोड डालें, जो बैकएंड का मैसेज पढ़ेगा:
```javascript
try {
let res = await fetch(API_URL, { method: "POST", body: JSON.stringify(payload) });
let text = await res.text(); // असली जवाब पढ़ेगा
if (text === "blocked") {
// अगर ब्लॉक है तो फॉर्म खाली नहीं करेगा और लाल एरर दिखाएगा
showToast("🚨 आपका अकाउंट हमेशा के लिए ब्लॉक हो चुका है। आप पोस्ट नहीं कर सकते!");
} else {
showToast(editingNewsId ? "ख़बर अपडेट हो गई!" : "ख़बर पब्लिश हो गई!");
// फॉर्म को खाली करने वाला आपका पुराना कोड
document.getElementById("headInput").value = "";
document.getElementById("bodyInput").value = "";
document.getElementById("locInput").value = "";
document.getElementById("imgInput").value = "";
document.getElementById("imgPreviewArea").innerHTML = "";
document.getElementById("uploadLabel").innerText = "📸 1 फोटो चुनें (Optional)";
base64Image = "";
editingNewsId = null;
closeWithAnimation("publishOverlay");
fetchNews();
}
} catch(err) { console.log(err); showToast("प्रोसेस में दिक्कत आई!"); }
```
**C. ब्लॉक यूज़र को फॉर्म खोलने से रोकें (`checkAuth` अपडेट करें):**
अपने `checkAuth()` में जहाँ आप फॉर्म खोलते हैं, वहाँ यह चेक लगा दें कि अगर यूज़र ब्लॉक है, तो फॉर्म का पॉपअप ओपन ही न हो:
```javascript
function checkAuth() {
if(!userData) {
showToast("लॉगिन आवश्यक है!");
if(window.google) google.accounts.id.prompt();
} else {
// नया चेक: क्या यूज़र ब्लॉक है?
let status = document.getElementById("strikeMenu").innerText;
if(status.includes("ब्लॉक")) {
return showToast("🚨 आप ब्लॉक हैं! आप न्यूज़ पब्लिश नहीं कर सकते।");
}
// आपका फॉर्म रिसेट और ओपन करने वाला पुराना कोड
document.getElementById("headInput").value = "";
document.getElementById("publishOverlay").style.display = 'flex';
}
}
```
**अब क्या होगा?**
1. यूज़र जैसे ही लॉगिन करेगा, उसे अपनी प्रोफाइल में पता चल जाएगा कि उस पर कितनी स्ट्राइक्स (0, 1, 2) हैं।
2. अगर उसे 3 स्ट्राइक मिल चुकी हैं, तो उसका प्रोफाइल "🚫 अकाउंट ब्लॉक है" लाल रंग में दिखाएगा।
3. अगर वह ब्लॉक होने के बाद चालाकी से `+` बटन दबाने की कोशिश करेगा, तो फॉर्म खुलेगा ही नहीं और उसे वार्निंग मिल जाएगी!
इसे सेव करके एक बार डिप्लॉय कर लीजिए, आपका यह स्ट्राइक सिस्टम पूरी तरह से प्रोफेशनल और फूलप्रूफ (Foolproof) हो जाएगा!