name: Lock down obvious spam issues on: issues: types: [opened] permissions: issues: write jobs: lockdown: runs-on: ubuntu-latest steps: - name: Auto-close spam patterns from new accounts uses: actions/github-script@v7 with: script: | const issue = context.payload.issue; const author = issue.user; // Only consider brand-new accounts. If the user has been around // long enough to file good-faith issues elsewhere, don't touch. const created = new Date(author.created_at || 0); const ageDays = (Date.now() - created.getTime()) / 86_400_000; if (ageDays > 30) return; const blob = `${issue.title || ''}\n${issue.body || ''}`; const patterns = [ /\bcrypto\b/i, /\bairdrop\b/i, /\bnft\b/i, /\bpresale\b/i, /\busdt\b/i, /\btg\s*@/i, /\btelegram\s+@/i, /\bt\.me\//i, /\bwhatsapp\s+\+/i, /\bseo\s+service/i, /\bguest\s+post/i, /\bbacklink/i, /\bbuy\s+followers/i, /\bjoin\s+our\s+(community|server|group)/i, /\bpromot[ei]\s+your\b/i, ]; const hit = patterns.find(p => p.test(blob)); if (!hit) return; await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, body: [ 'This issue was auto-closed because the title or body matches', 'a spam pattern (paid promotion / unrelated link) and the author', 'account is less than 30 days old. If this is a real bug or', 'feature request, please reopen with a clearer description', '(in English or 中文) of the project-relevant context.', ].join(' '), }); await github.rest.issues.update({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, state: 'closed', state_reason: 'not_planned', }); await github.rest.issues.addLabels({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, labels: ['spam'], }).catch(() => {}); // ignore if label doesn't exist yet