mirror of
https://github.com/LightZirconite/Microsoft-Rewards-Bot.git
synced 2026-01-09 09:06:15 +00:00
Fix
This commit is contained in:
4
.github/copilot-instructions.md
vendored
4
.github/copilot-instructions.md
vendored
@@ -796,7 +796,7 @@ npm run creator # Account creation wizard
|
|||||||
## 📞 Support & Resources
|
## 📞 Support & Resources
|
||||||
|
|
||||||
- **Discord:** https://discord.gg/k5uHkx9mne (community support)
|
- **Discord:** https://discord.gg/k5uHkx9mne (community support)
|
||||||
- **GitHub Issues:** https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/issues
|
- **GitHub Issues:** https://github.com/LightZirconite/Microsoft-Rewards-Bot/issues
|
||||||
- **Documentation:** `/docs/index.md` (full guide index)
|
- **Documentation:** `/docs/index.md` (full guide index)
|
||||||
- **License:** CC BY-NC-SA 4.0 (non-commercial use)
|
- **License:** CC BY-NC-SA 4.0 (non-commercial use)
|
||||||
|
|
||||||
@@ -1145,7 +1145,7 @@ private combinedDeduplication(queries: string[], threshold = 0.65): string[] {
|
|||||||
|
|
||||||
**Last Updated:** 2025-11-09
|
**Last Updated:** 2025-11-09
|
||||||
**Version:** See `package.json` for current version
|
**Version:** See `package.json` for current version
|
||||||
**Maintainer:** Obsidian-wtf + Community Contributors
|
**Maintainer:** LightZirconite + Community Contributors
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
4
LICENSE
4
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
|
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
|
||||||
|
|
||||||
Copyright (c) 2025 Obsidian-wtf
|
Copyright (c) 2025 LightZirconite
|
||||||
|
|
||||||
This work is licensed under Creative Commons BY-NC-SA 4.0
|
This work is licensed under Creative Commons BY-NC-SA 4.0
|
||||||
https://creativecommons.org/licenses/by-nc-sa/4.0/
|
https://creativecommons.org/licenses/by-nc-sa/4.0/
|
||||||
@@ -21,4 +21,4 @@ MICROSOFT REWARDS WARNING:
|
|||||||
This software may violate Microsoft's Terms of Service.
|
This software may violate Microsoft's Terms of Service.
|
||||||
Use at your own risk.
|
Use at your own risk.
|
||||||
|
|
||||||
Questions: https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/issues
|
Questions: https://github.com/LightZirconite/Microsoft-Rewards-Bot/issues
|
||||||
@@ -7,8 +7,8 @@
|
|||||||
**Automate your Microsoft Rewards points collection**
|
**Automate your Microsoft Rewards points collection**
|
||||||
|
|
||||||
[](https://discord.gg/k5uHkx9mne)
|
[](https://discord.gg/k5uHkx9mne)
|
||||||
[](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot)
|
[](https://github.com/LightZirconite/Microsoft-Rewards-Bot)
|
||||||
[](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/releases)
|
[](https://github.com/LightZirconite/Microsoft-Rewards-Bot/releases)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ A **TypeScript bot** that automatically earns Microsoft Rewards points by comple
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Download the project
|
# 1. Download the project
|
||||||
git clone https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot.git
|
git clone https://github.com/LightZirconite/Microsoft-Rewards-Bot.git
|
||||||
cd Microsoft-Rewards-Bot
|
cd Microsoft-Rewards-Bot
|
||||||
|
|
||||||
# 2. Install dependencies
|
# 2. Install dependencies
|
||||||
@@ -505,7 +505,7 @@ This is fixed in v2.60.0! The bot now runs tasks immediately on startup before a
|
|||||||
|
|
||||||
- 💬 **[Discord Community](https://discord.gg/k5uHkx9mne)** — Get support & updates
|
- 💬 **[Discord Community](https://discord.gg/k5uHkx9mne)** — Get support & updates
|
||||||
- 📖 **[Documentation](docs/index.md)** — Complete guides
|
- 📖 **[Documentation](docs/index.md)** — Complete guides
|
||||||
- 🐛 **[Report Bug](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/issues)** — Found an issue?
|
- 🐛 **[Report Bug](https://github.com/LightZirconite/Microsoft-Rewards-Bot/issues)** — Found an issue?
|
||||||
- <20> **[Troubleshooting](docs/troubleshooting.md)** — Fix common problems
|
- <20> **[Troubleshooting](docs/troubleshooting.md)** — Fix common problems
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ Microsoft-Rewards-Bot/
|
|||||||
## 🆘 Getting Help
|
## 🆘 Getting Help
|
||||||
|
|
||||||
- **Discord:** https://discord.gg/k5uHkx9mne
|
- **Discord:** https://discord.gg/k5uHkx9mne
|
||||||
- **GitHub Issues:** https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/issues
|
- **GitHub Issues:** https://github.com/LightZirconite/Microsoft-Rewards-Bot/issues
|
||||||
- **Documentation:** [docs/index.md](index.md)
|
- **Documentation:** [docs/index.md](index.md)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ Before starting, you need:5. [First Run](#-first-run)*Complete setup guide for b
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|
||||||
git clone https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot.git ```bash
|
git clone https://github.com/LightZirconite/Microsoft-Rewards-Bot.git ```bash
|
||||||
|
|
||||||
cd Microsoft-Rewards-Bot
|
cd Microsoft-Rewards-Bot
|
||||||
|
|
||||||
@@ -124,7 +124,7 @@ npm install node --version
|
|||||||
|
|
||||||
Should show `v20.x.x` or higher
|
Should show `v20.x.x` or higher
|
||||||
|
|
||||||
1. Go to: https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot
|
1. Go to: https://github.com/LightZirconite/Microsoft-Rewards-Bot
|
||||||
|
|
||||||
2. Click **Code** → **Download ZIP**- **Microsoft accounts** with email + password
|
2. Click **Code** → **Download ZIP**- **Microsoft accounts** with email + password
|
||||||
|
|
||||||
@@ -210,7 +210,7 @@ The wizard will:--- - Verify: `node --version` should show v20 or higher<div a
|
|||||||
|
|
||||||
# Linux/Mac
|
# Linux/Mac
|
||||||
|
|
||||||
cp src/accounts.example.jsonc src/accounts.jsoncgit clone https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot.git
|
cp src/accounts.example.jsonc src/accounts.jsoncgit clone https://github.com/LightZirconite/Microsoft-Rewards-Bot.git
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -234,7 +234,7 @@ cd Microsoft-Rewards-Bot - Or download project as ZIP</div>
|
|||||||
|
|
||||||
"totp": "", // Leave empty for now
|
"totp": "", // Leave empty for now
|
||||||
|
|
||||||
"enabled": true1. Visit: https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot
|
"enabled": true1. Visit: https://github.com/LightZirconite/Microsoft-Rewards-Bot
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,7 +326,7 @@ npm run creator https://rewards.bing.com/welcome?rh=YOUR_CODE -y backup@gmail.co
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
During creation:- ✅ Saves all account details for yougit clone https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot.git- ✅ Help you create `src/accounts.json` with your Microsoft credentials
|
During creation:- ✅ Saves all account details for yougit clone https://github.com/LightZirconite/Microsoft-Rewards-Bot.git- ✅ Help you create `src/accounts.json` with your Microsoft credentials
|
||||||
|
|
||||||
1. **CAPTCHA**: Browser will pause - solve it manually
|
1. **CAPTCHA**: Browser will pause - solve it manually
|
||||||
|
|
||||||
@@ -374,7 +374,7 @@ Example content:
|
|||||||
|
|
||||||
"year": 1995
|
"year": 1995
|
||||||
|
|
||||||
},1. Go to: https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot
|
},1. Go to: https://github.com/LightZirconite/Microsoft-Rewards-Bot
|
||||||
|
|
||||||
"referralUrl": "https://rewards.bing.com/welcome?rh=YOUR_CODE",
|
"referralUrl": "https://rewards.bing.com/welcome?rh=YOUR_CODE",
|
||||||
|
|
||||||
@@ -780,7 +780,7 @@ bash setup/setup.sh
|
|||||||
|
|
||||||
- 📖 **[Documentation Hub](index.md)** — All guides
|
- 📖 **[Documentation Hub](index.md)** — All guides
|
||||||
|
|
||||||
- 🐛 **[Report Issue](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/issues)** — Found a bug?
|
- 🐛 **[Report Issue](https://github.com/LightZirconite/Microsoft-Rewards-Bot/issues)** — Found a bug?
|
||||||
|
|
||||||
1. **Copy the template:**4. **Complete**: Account details saved automaticallydocker compose up -d
|
1. **Copy the template:**4. **Complete**: Account details saved automaticallydocker compose up -d
|
||||||
|
|
||||||
@@ -908,7 +908,7 @@ Open `src/config.jsonc`:
|
|||||||
|
|
||||||
- Run `npm start` once
|
- Run `npm start` once
|
||||||
|
|
||||||
- Bot automatically schedules itself**⚠️ IMPORTANT: Keep this file safe!****Found a bug?** [Report it here](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/issues)
|
- Bot automatically schedules itself**⚠️ IMPORTANT: Keep this file safe!****Found a bug?** [Report it here](https://github.com/LightZirconite/Microsoft-Rewards-Bot/issues)
|
||||||
|
|
||||||
- Runs every day at your chosen time
|
- Runs every day at your chosen time
|
||||||
|
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ Having issues? Check these resources:
|
|||||||
### Support Resources
|
### Support Resources
|
||||||
|
|
||||||
- 💬 **[Discord Community](https://discord.gg/k5uHkx9mne)** — Get help from the community
|
- 💬 **[Discord Community](https://discord.gg/k5uHkx9mne)** — Get help from the community
|
||||||
- 🐛 **[GitHub Issues](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/issues)** — Report bugs
|
- 🐛 **[GitHub Issues](https://github.com/LightZirconite/Microsoft-Rewards-Bot/issues)** — Report bugs
|
||||||
- 📖 **[FAQ](FAQ.md)** — Frequently asked questions
|
- 📖 **[FAQ](FAQ.md)** — Frequently asked questions
|
||||||
- 🔍 **[Diagnostics Guide](diagnostics.md)** — Debug and capture logs
|
- 🔍 **[Diagnostics Guide](diagnostics.md)** — Debug and capture logs
|
||||||
|
|
||||||
@@ -200,9 +200,9 @@ Technical references and detailed information:
|
|||||||
Want to help improve the bot?
|
Want to help improve the bot?
|
||||||
|
|
||||||
- 📖 **[Contributing Guide](../CONTRIBUTING.md)** — How to contribute
|
- 📖 **[Contributing Guide](../CONTRIBUTING.md)** — How to contribute
|
||||||
- 🐛 **[Report Bugs](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/issues)** — Found an issue?
|
- 🐛 **[Report Bugs](https://github.com/LightZirconite/Microsoft-Rewards-Bot/issues)** — Found an issue?
|
||||||
- 💡 **[Feature Requests](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/issues)** — Suggest new features
|
- 💡 **[Feature Requests](https://github.com/LightZirconite/Microsoft-Rewards-Bot/issues)** — Suggest new features
|
||||||
- 📝 **[Improve Docs](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/tree/main/docs)** — Help with documentation
|
- 📝 **[Improve Docs](https://github.com/LightZirconite/Microsoft-Rewards-Bot/tree/main/docs)** — Help with documentation
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -347,7 +347,7 @@ If sending too many notifications:
|
|||||||
|
|
||||||
- 💬 **[Discord Community](https://discord.gg/k5uHkx9mne)** — Get support
|
- 💬 **[Discord Community](https://discord.gg/k5uHkx9mne)** — Get support
|
||||||
- 📖 **[Configuration Guide](config.md)** — All config options
|
- 📖 **[Configuration Guide](config.md)** — All config options
|
||||||
- 🐛 **[Report Issue](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/issues)** — Found a bug?
|
- 🐛 **[Report Issue](https://github.com/LightZirconite/Microsoft-Rewards-Bot/issues)** — Found a bug?
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -43,7 +43,7 @@
|
|||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "github",
|
"type": "github",
|
||||||
"url": "https://github.com/sponsors/Obsidian-wtf"
|
"url": "https://github.com/sponsors/LightZirconite"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@cspotcode/source-map-support": {
|
"node_modules/@cspotcode/source-map-support": {
|
||||||
@@ -4257,4 +4257,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
12
package.json
12
package.json
@@ -9,12 +9,12 @@
|
|||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot.git"
|
"url": "https://github.com/LightZirconite/Microsoft-Rewards-Bot.git"
|
||||||
},
|
},
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/issues"
|
"url": "https://github.com/LightZirconite/Microsoft-Rewards-Bot/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot#readme",
|
"homepage": "https://github.com/LightZirconite/Microsoft-Rewards-Bot#readme",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"go": "node -e \"const fs = require('fs'); const cp = require('child_process'); console.log('🚀 Running complete setup and start...'); if (!fs.existsSync('.playwright-chromium-installed')) { console.log('📦 Installing Chromium...'); cp.execSync('npx playwright install chromium --with-deps', {stdio: 'inherit'}); fs.writeFileSync('.playwright-chromium-installed', new Date().toISOString()); } if (!fs.existsSync('dist/index.js')) { console.log('🔨 Building project...'); cp.execSync('npm run build', {stdio: 'inherit'}); } console.log('✅ Setup complete! Starting bot...'); cp.execSync('npm start', {stdio: 'inherit'});\"",
|
"go": "node -e \"const fs = require('fs'); const cp = require('child_process'); console.log('🚀 Running complete setup and start...'); if (!fs.existsSync('.playwright-chromium-installed')) { console.log('📦 Installing Chromium...'); cp.execSync('npx playwright install chromium --with-deps', {stdio: 'inherit'}); fs.writeFileSync('.playwright-chromium-installed', new Date().toISOString()); } if (!fs.existsSync('dist/index.js')) { console.log('🔨 Building project...'); cp.execSync('npm run build', {stdio: 'inherit'}); } console.log('✅ Setup complete! Starting bot...'); cp.execSync('npm start', {stdio: 'inherit'});\"",
|
||||||
"clean": "rimraf dist",
|
"clean": "rimraf dist",
|
||||||
@@ -50,14 +50,14 @@
|
|||||||
"Playwright",
|
"Playwright",
|
||||||
"Cheerio"
|
"Cheerio"
|
||||||
],
|
],
|
||||||
"author": "Obsidian-wtf",
|
"author": "LightZirconite",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"Microsoft Rewards Bot Community (https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/graphs/contributors)"
|
"Microsoft Rewards Bot Community (https://github.com/LightZirconite/Microsoft-Rewards-Bot/graphs/contributors)"
|
||||||
],
|
],
|
||||||
"license": "CC-BY-NC-SA-4.0",
|
"license": "CC-BY-NC-SA-4.0",
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "github",
|
"type": "github",
|
||||||
"url": "https://github.com/sponsors/Obsidian-wtf"
|
"url": "https://github.com/sponsors/LightZirconite"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/express": "^4.17.25",
|
"@types/express": "^4.17.25",
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ async function checkVersion() {
|
|||||||
const localVersion = localPkg.version
|
const localVersion = localPkg.version
|
||||||
|
|
||||||
// Fetch remote version from GitHub API (no cache)
|
// Fetch remote version from GitHub API (no cache)
|
||||||
const repoOwner = 'Obsidian-wtf'
|
const repoOwner = 'LightZirconite'
|
||||||
const repoName = 'Microsoft-Rewards-Bot'
|
const repoName = 'Microsoft-Rewards-Bot'
|
||||||
const branch = 'main'
|
const branch = 'main'
|
||||||
|
|
||||||
@@ -448,7 +448,7 @@ async function performUpdate() {
|
|||||||
|
|
||||||
// Step 3: Download latest code from GitHub
|
// Step 3: Download latest code from GitHub
|
||||||
process.stdout.write('📥 Downloading...')
|
process.stdout.write('📥 Downloading...')
|
||||||
const repoOwner = 'Obsidian-wtf'
|
const repoOwner = 'LightZirconite'
|
||||||
const repoName = 'Microsoft-Rewards-Bot'
|
const repoName = 'Microsoft-Rewards-Bot'
|
||||||
const branch = 'main'
|
const branch = 'main'
|
||||||
const archiveUrl = `https://github.com/${repoOwner}/${repoName}/archive/refs/heads/${branch}.zip`
|
const archiveUrl = `https://github.com/${repoOwner}/${repoName}/archive/refs/heads/${branch}.zip`
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ export const DISCORD = {
|
|||||||
COLOR_GREEN: 0x00D26A,
|
COLOR_GREEN: 0x00D26A,
|
||||||
COLOR_GRAY: 0x95A5A6,
|
COLOR_GRAY: 0x95A5A6,
|
||||||
WEBHOOK_USERNAME: 'Microsoft-Rewards-Bot',
|
WEBHOOK_USERNAME: 'Microsoft-Rewards-Bot',
|
||||||
AVATAR_URL: 'https://raw.githubusercontent.com/Obsidian-wtf/Microsoft-Rewards-Bot/main/assets/logo.png'
|
AVATAR_URL: 'https://raw.githubusercontent.com/LightZirconite/Microsoft-Rewards-Bot/main/assets/logo.png'
|
||||||
} as const
|
} as const
|
||||||
|
|
||||||
export const LOGGER_CLEANUP = {
|
export const LOGGER_CLEANUP = {
|
||||||
|
|||||||
@@ -1756,7 +1756,7 @@ export class Login {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private getDocsUrl(anchor?: string) {
|
private getDocsUrl(anchor?: string) {
|
||||||
const base = process.env.DOCS_BASE?.trim() || 'https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/blob/main/docs/security.md'
|
const base = process.env.DOCS_BASE?.trim() || 'https://github.com/LightZirconite/Microsoft-Rewards-Bot/blob/main/docs/security.md'
|
||||||
const map: Record<string, string> = {
|
const map: Record<string, string> = {
|
||||||
'recovery-email-mismatch': '#recovery-email-mismatch',
|
'recovery-email-mismatch': '#recovery-email-mismatch',
|
||||||
'we-cant-sign-you-in': '#we-cant-sign-you-in-blocked'
|
'we-cant-sign-you-in': '#we-cant-sign-you-in-blocked'
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import type { Page } from 'playwright'
|
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
|
import type { Page } from 'playwright'
|
||||||
|
|
||||||
import { Workers } from '../Workers'
|
|
||||||
import { DELAYS } from '../../constants'
|
import { DELAYS } from '../../constants'
|
||||||
|
import { Workers } from '../Workers'
|
||||||
|
|
||||||
import { MorePromotion, PromotionalItem } from '../../interface/DashboardData'
|
import { MorePromotion, PromotionalItem } from '../../interface/DashboardData'
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ export class SearchOnBing extends Workers {
|
|||||||
// Fetch from the repo directly so the user doesn't need to redownload the script for the new activities
|
// Fetch from the repo directly so the user doesn't need to redownload the script for the new activities
|
||||||
const response = await this.bot.axios.request({
|
const response = await this.bot.axios.request({
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
url: 'https://raw.githubusercontent.com/Obsidian-wtf/Microsoft-Rewards-Bot/refs/heads/main/src/functions/queries.json'
|
url: 'https://raw.githubusercontent.com/LightZirconite/Microsoft-Rewards-Bot/refs/heads/main/src/functions/queries.json'
|
||||||
})
|
})
|
||||||
queries = response.data
|
queries = response.data
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ export interface ConfigUpdate {
|
|||||||
// DEPRECATED (v2.56.2+, remove in v3.0): method, docker fields no longer used
|
// DEPRECATED (v2.56.2+, remove in v3.0): method, docker fields no longer used
|
||||||
// Migration: update.mjs now exclusively uses GitHub API for all update methods
|
// Migration: update.mjs now exclusively uses GitHub API for all update methods
|
||||||
// See: scripts/installer/README.md for migration details
|
// See: scripts/installer/README.md for migration details
|
||||||
// TODO(@Obsidian-wtf): Remove deprecated fields in v3.0 major release
|
// TODO(@LightZirconite): Remove deprecated fields in v3.0 major release
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ConfigVacation {
|
export interface ConfigVacation {
|
||||||
|
|||||||
Reference in New Issue
Block a user