nglstrike 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 mallikmusaddiq1
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,168 @@
1
+ Metadata-Version: 2.4
2
+ Name: nglstrike
3
+ Version: 1.0.0
4
+ Summary: Anonymous Auto-Sender for NGL
5
+ Author: Mallik Mohammed Musaddiq
6
+ Author-email: Mallik Mohammed Musaddiq <mallikmusaddiq1@gmail.com>
7
+ License: MIT
8
+ Project-URL: Homepage, https://github.com/mallikmusaddiq1/nglstrike
9
+ Requires-Python: >=3.6
10
+ Description-Content-Type: text/markdown
11
+ License-File: LICENSE
12
+ Requires-Dist: requests
13
+ Dynamic: author
14
+ Dynamic: license-file
15
+ Dynamic: requires-python
16
+
17
+ # nglstrike
18
+
19
+ Anonymous Auto-Sender for NGL โ€” because sometimes, kindness needs a little automation.
20
+
21
+ ## ๐Ÿ“Œ Overview
22
+
23
+ `nglstrike` is a professional-grade command-line tool that automates the process of sending anonymous messages via [ngl.link](https://ngl.link). Built for thoughtful experimentation and personal use, it supports single-message repetition or bulk message delivery from `.txt` files โ€” with built-in delay, dry-run simulation, offensive word filtering, and message shuffling.
24
+
25
+ ---
26
+
27
+ ## โœจ Features
28
+
29
+ * โœ… **Send anonymous messages to any NGL username**
30
+ * ๐Ÿ“„ **Load messages from a `.txt` file**
31
+ * โฑ๏ธ **Custom interval delay between messages**
32
+ * ๐Ÿ” **Single message repeat or random pick from message pool**
33
+ * ๐Ÿ”„ **Shuffle mode (no message repeats until exhausted)**
34
+ * ๐Ÿงช **Dry-run mode** to preview message flow before actually sending
35
+ * ๐Ÿšซ **Built-in offensive language filter**
36
+ * ๐Ÿ” **Common argument mistake detection**
37
+ * ๐Ÿ“ˆ **Clean logging + ETA predictions**
38
+ * ๐Ÿ“‹ **Auto-generated summary after run**
39
+
40
+ ---
41
+
42
+ ## ๐Ÿš€ Installation
43
+
44
+
45
+
46
+ Option 1 - Clone the repo:
47
+
48
+ ```bash
49
+ git clone https://github.com/mallikmusaddiq1/nglstrike.git
50
+ cd nglstrike
51
+ ```
52
+
53
+ Make it executable:
54
+
55
+ ```bash
56
+ chmod +x nglstrike.py
57
+ ```
58
+
59
+ Run with Python 3:
60
+
61
+ ```bash
62
+ nglstrike.py [options]
63
+ ```
64
+
65
+ ---
66
+
67
+ Option 2: Pip installation.
68
+
69
+ ```bash
70
+ pip install nglstrike
71
+ ```
72
+
73
+ ## ๐Ÿง  Usage Examples
74
+
75
+ ### Send a single message repeatedly:
76
+
77
+ ```bash
78
+ nglstrike.py -u your_username -m "Stay strong!"
79
+ ```
80
+
81
+ ### Send multiple messages from a file:
82
+
83
+ ```bash
84
+ nglstrike.py -u your_username -m-path messages.txt --limit 10 -i 30
85
+ ```
86
+
87
+ ### Preview sending order (no actual messages):
88
+
89
+ ```bash
90
+ nglstrike.py -u your_username -m-path messages.txt --dry-run --limit 5
91
+ ```
92
+
93
+ ### Shuffle messages (each sent only once):
94
+
95
+ ```bash
96
+ nglstrike.py -u your_username -m-path messages.txt --shuffle
97
+ ```
98
+
99
+ ---
100
+
101
+ ## ๐Ÿ“ Format for `messages.txt`
102
+
103
+ Plaintext file with one message per line. Example:
104
+
105
+ ```
106
+ You're amazing.
107
+ Keep going โ€” you're close.
108
+ Someone out there believes in you.
109
+ The best is yet to come.
110
+ ```
111
+
112
+ ---
113
+
114
+ ## โš™๏ธ Arguments
115
+
116
+ | Argument | Description |
117
+ | --------------------------- | ------------------------------------------------- |
118
+ | `-u`, `--username` | **(Required)** Your NGL username (no link) |
119
+ | `-m`, `--message` | Send a single repeated message |
120
+ | `-m-path`, `--message-path` | Path to `.txt` file with multiple messages |
121
+ | `-i`, `--interval` | Delay between messages in seconds (default: `60`) |
122
+ | `--limit` | Stop after sending `N` messages |
123
+ | `--dry-run` | Preview messages instead of sending |
124
+ | `--shuffle` | Send each message only once in random order |
125
+ | `-v`, `--version` | Show version and legal info |
126
+ | `-h`, `--help` | Show help message |
127
+
128
+ ---
129
+
130
+ ## ๐Ÿงผ Offensive Word Filter
131
+
132
+ Before sending, `nglstrike` checks each message for offensive content using a predefined blacklist of strictly abusive terms. If **all messages** are flagged as offensive, the tool exits.
133
+
134
+ Use responsibly.
135
+
136
+ ---
137
+
138
+ ## ๐Ÿ›‘ Legal & Ethical Notice
139
+
140
+ ```
141
+ This tool is intended strictly for educational and personal experimentation.
142
+ Do NOT use this tool to spam, harass, or disturb anyone.
143
+ Misuse may violate NGL's Terms of Service.
144
+ You alone are responsible for your actions.
145
+ ```
146
+
147
+ Keep digital spaces kind, safe, and human.
148
+
149
+ ---
150
+
151
+ ## ๐Ÿ‘ค Author
152
+
153
+ **Mallik Mohammed Musaddiq**
154
+ GitHub: [@mallikmusaddiq1](https://github.com/mallikmusaddiq1)
155
+ Email: [mallikmusaddiq1@gmail.com](mailto:mallikmusaddiq1@gmail.com)
156
+
157
+ ---
158
+
159
+ ## ๐Ÿ“„ License
160
+
161
+ This project is licensed under the MIT License. See `LICENSE` for more details.
162
+
163
+ ---
164
+
165
+ ## โค๏ธ Support
166
+
167
+ If this project helped you, feel free to โญ the repo or contribute.
168
+ Spread kindness. Automate it โ€” ethically.
@@ -0,0 +1,152 @@
1
+ # nglstrike
2
+
3
+ Anonymous Auto-Sender for NGL โ€” because sometimes, kindness needs a little automation.
4
+
5
+ ## ๐Ÿ“Œ Overview
6
+
7
+ `nglstrike` is a professional-grade command-line tool that automates the process of sending anonymous messages via [ngl.link](https://ngl.link). Built for thoughtful experimentation and personal use, it supports single-message repetition or bulk message delivery from `.txt` files โ€” with built-in delay, dry-run simulation, offensive word filtering, and message shuffling.
8
+
9
+ ---
10
+
11
+ ## โœจ Features
12
+
13
+ * โœ… **Send anonymous messages to any NGL username**
14
+ * ๐Ÿ“„ **Load messages from a `.txt` file**
15
+ * โฑ๏ธ **Custom interval delay between messages**
16
+ * ๐Ÿ” **Single message repeat or random pick from message pool**
17
+ * ๐Ÿ”„ **Shuffle mode (no message repeats until exhausted)**
18
+ * ๐Ÿงช **Dry-run mode** to preview message flow before actually sending
19
+ * ๐Ÿšซ **Built-in offensive language filter**
20
+ * ๐Ÿ” **Common argument mistake detection**
21
+ * ๐Ÿ“ˆ **Clean logging + ETA predictions**
22
+ * ๐Ÿ“‹ **Auto-generated summary after run**
23
+
24
+ ---
25
+
26
+ ## ๐Ÿš€ Installation
27
+
28
+
29
+
30
+ Option 1 - Clone the repo:
31
+
32
+ ```bash
33
+ git clone https://github.com/mallikmusaddiq1/nglstrike.git
34
+ cd nglstrike
35
+ ```
36
+
37
+ Make it executable:
38
+
39
+ ```bash
40
+ chmod +x nglstrike.py
41
+ ```
42
+
43
+ Run with Python 3:
44
+
45
+ ```bash
46
+ nglstrike.py [options]
47
+ ```
48
+
49
+ ---
50
+
51
+ Option 2: Pip installation.
52
+
53
+ ```bash
54
+ pip install nglstrike
55
+ ```
56
+
57
+ ## ๐Ÿง  Usage Examples
58
+
59
+ ### Send a single message repeatedly:
60
+
61
+ ```bash
62
+ nglstrike.py -u your_username -m "Stay strong!"
63
+ ```
64
+
65
+ ### Send multiple messages from a file:
66
+
67
+ ```bash
68
+ nglstrike.py -u your_username -m-path messages.txt --limit 10 -i 30
69
+ ```
70
+
71
+ ### Preview sending order (no actual messages):
72
+
73
+ ```bash
74
+ nglstrike.py -u your_username -m-path messages.txt --dry-run --limit 5
75
+ ```
76
+
77
+ ### Shuffle messages (each sent only once):
78
+
79
+ ```bash
80
+ nglstrike.py -u your_username -m-path messages.txt --shuffle
81
+ ```
82
+
83
+ ---
84
+
85
+ ## ๐Ÿ“ Format for `messages.txt`
86
+
87
+ Plaintext file with one message per line. Example:
88
+
89
+ ```
90
+ You're amazing.
91
+ Keep going โ€” you're close.
92
+ Someone out there believes in you.
93
+ The best is yet to come.
94
+ ```
95
+
96
+ ---
97
+
98
+ ## โš™๏ธ Arguments
99
+
100
+ | Argument | Description |
101
+ | --------------------------- | ------------------------------------------------- |
102
+ | `-u`, `--username` | **(Required)** Your NGL username (no link) |
103
+ | `-m`, `--message` | Send a single repeated message |
104
+ | `-m-path`, `--message-path` | Path to `.txt` file with multiple messages |
105
+ | `-i`, `--interval` | Delay between messages in seconds (default: `60`) |
106
+ | `--limit` | Stop after sending `N` messages |
107
+ | `--dry-run` | Preview messages instead of sending |
108
+ | `--shuffle` | Send each message only once in random order |
109
+ | `-v`, `--version` | Show version and legal info |
110
+ | `-h`, `--help` | Show help message |
111
+
112
+ ---
113
+
114
+ ## ๐Ÿงผ Offensive Word Filter
115
+
116
+ Before sending, `nglstrike` checks each message for offensive content using a predefined blacklist of strictly abusive terms. If **all messages** are flagged as offensive, the tool exits.
117
+
118
+ Use responsibly.
119
+
120
+ ---
121
+
122
+ ## ๐Ÿ›‘ Legal & Ethical Notice
123
+
124
+ ```
125
+ This tool is intended strictly for educational and personal experimentation.
126
+ Do NOT use this tool to spam, harass, or disturb anyone.
127
+ Misuse may violate NGL's Terms of Service.
128
+ You alone are responsible for your actions.
129
+ ```
130
+
131
+ Keep digital spaces kind, safe, and human.
132
+
133
+ ---
134
+
135
+ ## ๐Ÿ‘ค Author
136
+
137
+ **Mallik Mohammed Musaddiq**
138
+ GitHub: [@mallikmusaddiq1](https://github.com/mallikmusaddiq1)
139
+ Email: [mallikmusaddiq1@gmail.com](mailto:mallikmusaddiq1@gmail.com)
140
+
141
+ ---
142
+
143
+ ## ๐Ÿ“„ License
144
+
145
+ This project is licensed under the MIT License. See `LICENSE` for more details.
146
+
147
+ ---
148
+
149
+ ## โค๏ธ Support
150
+
151
+ If this project helped you, feel free to โญ the repo or contribute.
152
+ Spread kindness. Automate it โ€” ethically.
File without changes
File without changes
@@ -0,0 +1,289 @@
1
+ #!/usr/bin/env python3
2
+
3
+ import argparse
4
+ import requests
5
+ import random
6
+ import time
7
+ from pathlib import Path
8
+ import sys
9
+ from datetime import datetime, timedelta
10
+
11
+ # ========== COMMON ARGUMENT MISTAKES ==========
12
+ common_mistakes = {
13
+ "-message": "--message",
14
+ "-limit": "--limit",
15
+ "-username": "--username",
16
+ "--m-path": "-m-path",
17
+ "-message-path": "--message-path",
18
+ "-interval": "--interval",
19
+ "-dry-run": "--dry-run",
20
+ "-shuffle": "--shuffle"
21
+ }
22
+
23
+ # ========== OFFENSIVE WORD LIST ==========
24
+ OFFENSIVE_WORDS = [
25
+ "arse", "arsehole", "ass", "asshole", "asswipe", "baklola", "bakloli", "bakrichod", "bastard", "behenchara",
26
+ "bellend", "bhenchod", "bhenchodi", "bhosda", "bhosdake", "bhosdika", "bhosdi", "bhosdiwala", "bhoska",
27
+ "bhosadpappu", "bitch", "bollocks", "bugger", "chakka", "chhinar", "chhinal", "chhokri", "chhokru",
28
+ "chodu", "choot", "chudal", "chuda", "chudail", "chudasi", "chut", "chutad", "chutappa", "chutkan",
29
+ "chutkul", "chutmar", "chutmarani", "chutmarike", "chutni", "chutpana", "chutroo", "chutiya", "chutiyapa",
30
+ "clunt", "cock", "coon", "crap", "cum", "dalla", "dick", "dickhead", "dickwad", "dipshit", "douche",
31
+ "douchebag", "douchecanoe", "faggot", "fuck", "fucker", "fucktard", "fuckwit", "gandiya", "gand",
32
+ "gandfat", "gandhasti", "gandmar", "gandmara", "gandora", "ganduk", "ganduwa", "gaandu", "gook", "hagni",
33
+ "harami", "haramkhor", "hijra", "jackass", "jhaant", "jhaantoo", "jizz", "kameena", "kameeni", "kamina",
34
+ "khotey", "khotta", "kike", "knob", "kotha", "kutti", "kutta", "lavda", "lavde", "madarchod", "madarsi",
35
+ "motherfucker", "napunsak", "nigger", "paki", "phuddi", "prick", "pricktease", "pussy", "randbaaz",
36
+ "randipana", "randwa", "randi", "retard", "sali", "schmuck", "scumbag", "shit", "shitbag", "shitface",
37
+ "shithead", "shitty", "skank", "slag", "slut", "slutbag", "spic", "spick", "suar", "suar ka baccha",
38
+ "tatti", "tossbag", "tosser", "tosspot", "tramp", "turd", "tattu", "twat", "wanker", "wankstain"
39
+ ]
40
+
41
+ for arg in sys.argv:
42
+ if arg in common_mistakes:
43
+ correct = common_mistakes[arg]
44
+ sys.stderr.write(f"[ERROR] Did you mean {correct} instead of {arg} ?\n")
45
+ sys.exit(1)
46
+
47
+ # ========== VERSION INFO ==========
48
+ LEGAL_NOTICE = """\
49
+ nglstrike 1.0.0 - Anonymous Auto-Sender for NGL
50
+
51
+ Author : Mallik Mohammed Musaddiq
52
+ GitHub : https://github.com/mallikmusaddiq1/nglstrike
53
+ Email : mallikmusaddiq1@gmail.com
54
+
55
+ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
56
+ LEGAL & ETHICAL NOTICE:
57
+ This tool is intended strictly for educational and personal experimentation.
58
+
59
+ It was created to promote thoughtful, uplifting, and respectful anonymous communication.
60
+ Do NOT use this tool to spam, harass, or disturb anyone in any form.
61
+
62
+ Misuse may violate NGL's Terms of Service and lead to penalties or bans.
63
+ You alone are responsible for how you use this tool.
64
+
65
+ Use it wisely โ€” and help keep digital spaces kind, safe, and human.
66
+ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
67
+ """
68
+
69
+ # ========== LOAD MESSAGES ==========
70
+ def load_messages_from_file(file_path):
71
+ path = Path(file_path)
72
+ if path.suffix.lower() != ".txt":
73
+ sys.stderr.write(f"[ERROR] Only .txt files are supported. You provided: {path.suffix}\n")
74
+ sys.exit(1)
75
+ if not path.exists():
76
+ sys.stderr.write(f"[ERROR] File not found: {file_path}\n")
77
+ sys.exit(1)
78
+ if not path.is_file():
79
+ sys.stderr.write(f"[ERROR] Path is not a file: {file_path}\n")
80
+ sys.exit(1)
81
+ try:
82
+ with open(path, "r", encoding="utf-8") as f:
83
+ messages = [line.strip() for line in f if line.strip()]
84
+ if not messages:
85
+ sys.stderr.write("[ERROR] Message file is empty.\n")
86
+ sys.exit(1)
87
+ return messages
88
+ except Exception as e:
89
+ sys.stderr.write(f"[ERROR] Failed to read messages from file: {e}\n")
90
+ sys.exit(1)
91
+
92
+ def is_offensive(message):
93
+ lowered = message.lower()
94
+ return any(bad_word in lowered for bad_word in OFFENSIVE_WORDS)
95
+
96
+ # ========== SEND MESSAGE ==========
97
+ def send_message(username, message, dry_run=False, counter=None, device_id="termux-nglstrike"):
98
+ if dry_run:
99
+ prefix = f"[DRY-RUN] #{counter} โ†’ " if counter else "[DRY-RUN] โ†’ "
100
+ print(f"{prefix}{message}")
101
+ return True
102
+
103
+ url = "https://ngl.link/api/submit"
104
+ payload = {
105
+ "username": username,
106
+ "question": message,
107
+ "deviceId": device_id
108
+ }
109
+ headers = {
110
+ "Content-Type": "application/x-www-form-urlencoded"
111
+ }
112
+
113
+ try:
114
+ response = requests.post(url, data=payload, headers=headers)
115
+ if response.status_code == 200:
116
+ print(f"[SENT] {message}")
117
+ return True
118
+ elif response.status_code == 404:
119
+ sys.stderr.write(f"[ERROR] Username does not exist on NGL (404 Not Found): @{username}\n")
120
+ sys.exit(1)
121
+ else:
122
+ print(f"[FAILED] HTTP {response.status_code} โ†’ {message}")
123
+ return False
124
+ except Exception as e:
125
+ sys.stderr.write(f"[ERROR] Network error: {e}\n")
126
+ return False
127
+
128
+ # ========== MAIN ==========
129
+ def main():
130
+ parser = argparse.ArgumentParser(
131
+ prog="nglstrike",
132
+ description="""\
133
+ nglstrike - Anonymous Auto-Sender for NGL
134
+ Version: 1.0.0
135
+
136
+ USAGE EXAMPLES:
137
+ nglstrike -u your_username -m "Stay strong!"
138
+ nglstrike -u your_username -m-path messages.txt --limit 10 -i 15
139
+
140
+ MESSAGE MODES:
141
+ -m, --message Send a single repeated message
142
+ -m-path, --message-path
143
+ Load multiple messages from a .txt file
144
+ (One per line. Empty lines ignored.)
145
+
146
+ OPTIONS:
147
+ -u, --username Required. Your NGL username (no link)
148
+ -i, --interval Interval between messages in seconds [default: 60]
149
+ --limit Stop after sending N messages
150
+ --dry-run Preview messages without sending
151
+ --shuffle Send each message once in random order (no repeats)
152
+ -v, --version Show version and legal notice
153
+ -h, --help Show this help message and exit
154
+
155
+ EXAMPLE messages.txt:
156
+ You're doing great.
157
+ Someone out there believes in you.
158
+ Keep pushing. You're almost there.
159
+ The best is yet to come.
160
+
161
+ NOTES:
162
+ - Only plain .txt files are supported for --message-path.
163
+ - --limit restricts total messages; --dry-run disables actual sending.
164
+ - With --shuffle, each message is sent only once until exhausted.
165
+
166
+ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
167
+ Created by Mallik Mohammed Musaddiq
168
+ GitHub: https://github.com/mallikmusaddiq1/nglstrike
169
+ Email : mallikmusaddiq1@gmail.com
170
+ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
171
+ """,
172
+ formatter_class=argparse.RawTextHelpFormatter
173
+ )
174
+
175
+ parser.add_argument("-u", "--username", required=True, help="Your NGL username (no URL)")
176
+ group = parser.add_mutually_exclusive_group(required=True)
177
+ group.add_argument("-m", "--message", help="Single message to send")
178
+ group.add_argument("-m-path", "--message-path", help="Path to .txt file containing messages (1 per line)")
179
+ parser.add_argument("-i", "--interval", default="60", help="Delay between messages in seconds (default: 60)")
180
+ parser.add_argument("--limit", type=int, help="Limit number of messages to send, then exit")
181
+ parser.add_argument("--dry-run", action="store_true", help="Print messages instead of sending")
182
+ parser.add_argument("--shuffle", action="store_true", help="Send each message once in shuffled order (no repeats)")
183
+ parser.add_argument("-v", "--version", action="version", version=LEGAL_NOTICE)
184
+
185
+ args = parser.parse_args()
186
+ try:
187
+ interval = int(args.interval)
188
+ if interval < 1:
189
+ raise ValueError
190
+ except ValueError:
191
+ sys.stderr.write("[ERROR] Use positive integers only: -i/--interval 5, 10, 60 etc.\n")
192
+ sys.exit(1)
193
+
194
+ if args.limit is not None and args.limit < 1:
195
+ sys.stderr.write("[ERROR] Limit must be at least 1.\n")
196
+ sys.exit(1)
197
+
198
+ if args.message:
199
+ messages = [args.message.strip()]
200
+ if args.shuffle:
201
+ print("[WARNING] --shuffle has no effect when using a single message. Ignoring it.")
202
+ args.shuffle = False
203
+ elif args.message_path:
204
+ messages = load_messages_from_file(args.message_path)
205
+ if args.shuffle:
206
+ random.shuffle(messages)
207
+ else:
208
+ sys.stderr.write("[ERROR] Either --message or --message-path must be provided.\n")
209
+ sys.exit(1)
210
+ if all(is_offensive(msg) for msg in messages):
211
+ sys.stderr.write("[ERROR] All messages are offensive. Exiting.\n")
212
+ sys.exit(1)
213
+
214
+ print(f"[INFO] Starting nglstrike on @{args.username} every {interval}s.")
215
+ print("[INFO] Press CTRL+C to exit.")
216
+ if args.dry_run:
217
+ print("[INFO] Dry-run mode: No messages will actually be sent.")
218
+ if args.shuffle:
219
+ print("[INFO] Shuffle mode enabled: Messages will not repeat.")
220
+
221
+ if args.dry_run and args.limit:
222
+ print(f"\n[DRY-RUN] Planned Message Order (Limit: {args.limit}):\n")
223
+ preview = messages[:args.limit] if args.shuffle else [random.choice(messages) for _ in range(args.limit)]
224
+ for i, msg in enumerate(preview, 1):
225
+ print(f" #{i} โ†’ {msg}")
226
+ print(f"\n[DRY-RUN] {len(preview)} messages would be sent to @{args.username}, interval: {interval}s\n")
227
+ return
228
+ elif args.dry_run and args.message:
229
+ print(f"\n[DRY-RUN] Would repeatedly send:\n โ†’ {messages[0]}\n")
230
+ return
231
+
232
+ count = 0
233
+ index = 0
234
+ sent = 0
235
+ skipped = 0
236
+ failed = 0
237
+ start_time = datetime.now()
238
+ print(f"[INFO] Started at: {start_time.strftime('%H:%M:%S')}")
239
+
240
+ try:
241
+ while True:
242
+ if args.shuffle:
243
+ if index >= len(messages):
244
+ print("[INFO] All messages sent (shuffled list exhausted). Exiting.")
245
+ break
246
+ message = messages[index]
247
+ index += 1
248
+ else:
249
+ message = random.choice(messages)
250
+
251
+ if is_offensive(message):
252
+ print(f"[SKIPPED] Offensive content detected โ†’ {message}")
253
+ skipped += 1
254
+ else:
255
+ result = send_message(args.username, message, dry_run=args.dry_run, counter=count + 1)
256
+ if result:
257
+ sent += 1
258
+ else:
259
+ failed += 1
260
+
261
+ count += 1 # โ† Always increment once per loop
262
+
263
+ if args.limit and count >= args.limit:
264
+ print(f"[INFO] Limit of {args.limit} messages reached. Exiting.")
265
+ break
266
+
267
+ remaining = (args.limit - count) if args.limit else None
268
+ if remaining:
269
+ eta = datetime.now() + timedelta(seconds=interval * remaining)
270
+ print(f"[ETA] {remaining} remaining. Estimated finish: {eta.strftime('%H:%M:%S')}")
271
+
272
+ time.sleep(interval)
273
+
274
+ except KeyboardInterrupt:
275
+ print("\n[INFO] Interrupted. Exiting.")
276
+ sys.exit(0)
277
+
278
+ # ======= FINAL SUMMARY ========
279
+ end_time = datetime.now()
280
+ duration = end_time - start_time
281
+ print("\n[SUMMARY]")
282
+ print(f" Sent : {sent}")
283
+ print(f" Failed : {failed}")
284
+ print(f" Skipped : {skipped}")
285
+ print(f" Duration : {str(duration).split('.')[0]}")
286
+ print(f" Finished : {end_time.strftime('%H:%M:%S')}")
287
+
288
+ if __name__ == "__main__":
289
+ main()
@@ -0,0 +1,168 @@
1
+ Metadata-Version: 2.4
2
+ Name: nglstrike
3
+ Version: 1.0.0
4
+ Summary: Anonymous Auto-Sender for NGL
5
+ Author: Mallik Mohammed Musaddiq
6
+ Author-email: Mallik Mohammed Musaddiq <mallikmusaddiq1@gmail.com>
7
+ License: MIT
8
+ Project-URL: Homepage, https://github.com/mallikmusaddiq1/nglstrike
9
+ Requires-Python: >=3.6
10
+ Description-Content-Type: text/markdown
11
+ License-File: LICENSE
12
+ Requires-Dist: requests
13
+ Dynamic: author
14
+ Dynamic: license-file
15
+ Dynamic: requires-python
16
+
17
+ # nglstrike
18
+
19
+ Anonymous Auto-Sender for NGL โ€” because sometimes, kindness needs a little automation.
20
+
21
+ ## ๐Ÿ“Œ Overview
22
+
23
+ `nglstrike` is a professional-grade command-line tool that automates the process of sending anonymous messages via [ngl.link](https://ngl.link). Built for thoughtful experimentation and personal use, it supports single-message repetition or bulk message delivery from `.txt` files โ€” with built-in delay, dry-run simulation, offensive word filtering, and message shuffling.
24
+
25
+ ---
26
+
27
+ ## โœจ Features
28
+
29
+ * โœ… **Send anonymous messages to any NGL username**
30
+ * ๐Ÿ“„ **Load messages from a `.txt` file**
31
+ * โฑ๏ธ **Custom interval delay between messages**
32
+ * ๐Ÿ” **Single message repeat or random pick from message pool**
33
+ * ๐Ÿ”„ **Shuffle mode (no message repeats until exhausted)**
34
+ * ๐Ÿงช **Dry-run mode** to preview message flow before actually sending
35
+ * ๐Ÿšซ **Built-in offensive language filter**
36
+ * ๐Ÿ” **Common argument mistake detection**
37
+ * ๐Ÿ“ˆ **Clean logging + ETA predictions**
38
+ * ๐Ÿ“‹ **Auto-generated summary after run**
39
+
40
+ ---
41
+
42
+ ## ๐Ÿš€ Installation
43
+
44
+
45
+
46
+ Option 1 - Clone the repo:
47
+
48
+ ```bash
49
+ git clone https://github.com/mallikmusaddiq1/nglstrike.git
50
+ cd nglstrike
51
+ ```
52
+
53
+ Make it executable:
54
+
55
+ ```bash
56
+ chmod +x nglstrike.py
57
+ ```
58
+
59
+ Run with Python 3:
60
+
61
+ ```bash
62
+ nglstrike.py [options]
63
+ ```
64
+
65
+ ---
66
+
67
+ Option 2: Pip installation.
68
+
69
+ ```bash
70
+ pip install nglstrike
71
+ ```
72
+
73
+ ## ๐Ÿง  Usage Examples
74
+
75
+ ### Send a single message repeatedly:
76
+
77
+ ```bash
78
+ nglstrike.py -u your_username -m "Stay strong!"
79
+ ```
80
+
81
+ ### Send multiple messages from a file:
82
+
83
+ ```bash
84
+ nglstrike.py -u your_username -m-path messages.txt --limit 10 -i 30
85
+ ```
86
+
87
+ ### Preview sending order (no actual messages):
88
+
89
+ ```bash
90
+ nglstrike.py -u your_username -m-path messages.txt --dry-run --limit 5
91
+ ```
92
+
93
+ ### Shuffle messages (each sent only once):
94
+
95
+ ```bash
96
+ nglstrike.py -u your_username -m-path messages.txt --shuffle
97
+ ```
98
+
99
+ ---
100
+
101
+ ## ๐Ÿ“ Format for `messages.txt`
102
+
103
+ Plaintext file with one message per line. Example:
104
+
105
+ ```
106
+ You're amazing.
107
+ Keep going โ€” you're close.
108
+ Someone out there believes in you.
109
+ The best is yet to come.
110
+ ```
111
+
112
+ ---
113
+
114
+ ## โš™๏ธ Arguments
115
+
116
+ | Argument | Description |
117
+ | --------------------------- | ------------------------------------------------- |
118
+ | `-u`, `--username` | **(Required)** Your NGL username (no link) |
119
+ | `-m`, `--message` | Send a single repeated message |
120
+ | `-m-path`, `--message-path` | Path to `.txt` file with multiple messages |
121
+ | `-i`, `--interval` | Delay between messages in seconds (default: `60`) |
122
+ | `--limit` | Stop after sending `N` messages |
123
+ | `--dry-run` | Preview messages instead of sending |
124
+ | `--shuffle` | Send each message only once in random order |
125
+ | `-v`, `--version` | Show version and legal info |
126
+ | `-h`, `--help` | Show help message |
127
+
128
+ ---
129
+
130
+ ## ๐Ÿงผ Offensive Word Filter
131
+
132
+ Before sending, `nglstrike` checks each message for offensive content using a predefined blacklist of strictly abusive terms. If **all messages** are flagged as offensive, the tool exits.
133
+
134
+ Use responsibly.
135
+
136
+ ---
137
+
138
+ ## ๐Ÿ›‘ Legal & Ethical Notice
139
+
140
+ ```
141
+ This tool is intended strictly for educational and personal experimentation.
142
+ Do NOT use this tool to spam, harass, or disturb anyone.
143
+ Misuse may violate NGL's Terms of Service.
144
+ You alone are responsible for your actions.
145
+ ```
146
+
147
+ Keep digital spaces kind, safe, and human.
148
+
149
+ ---
150
+
151
+ ## ๐Ÿ‘ค Author
152
+
153
+ **Mallik Mohammed Musaddiq**
154
+ GitHub: [@mallikmusaddiq1](https://github.com/mallikmusaddiq1)
155
+ Email: [mallikmusaddiq1@gmail.com](mailto:mallikmusaddiq1@gmail.com)
156
+
157
+ ---
158
+
159
+ ## ๐Ÿ“„ License
160
+
161
+ This project is licensed under the MIT License. See `LICENSE` for more details.
162
+
163
+ ---
164
+
165
+ ## โค๏ธ Support
166
+
167
+ If this project helped you, feel free to โญ the repo or contribute.
168
+ Spread kindness. Automate it โ€” ethically.
@@ -0,0 +1,13 @@
1
+ LICENSE
2
+ README.md
3
+ pyproject.toml
4
+ setup.py
5
+ nglstrike/__init__.py
6
+ nglstrike/__main__.py
7
+ nglstrike/main.py
8
+ nglstrike.egg-info/PKG-INFO
9
+ nglstrike.egg-info/SOURCES.txt
10
+ nglstrike.egg-info/dependency_links.txt
11
+ nglstrike.egg-info/entry_points.txt
12
+ nglstrike.egg-info/requires.txt
13
+ nglstrike.egg-info/top_level.txt
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ nglstrike = nglstrike.main:main
@@ -0,0 +1 @@
1
+ requests
@@ -0,0 +1,2 @@
1
+ dist
2
+ nglstrike
@@ -0,0 +1,28 @@
1
+ [build-system]
2
+ requires = ["setuptools", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "nglstrike"
7
+ version = "1.0.0"
8
+ description = "Anonymous Auto-Sender for NGL"
9
+ authors = [
10
+ { name="Mallik Mohammed Musaddiq", email="mallikmusaddiq1@gmail.com" }
11
+ ]
12
+ readme = "README.md"
13
+ requires-python = ">=3.6"
14
+ dependencies = [
15
+ "requests"
16
+ ]
17
+
18
+ [project.license]
19
+ text = "MIT"
20
+
21
+ [project.urls]
22
+ Homepage = "https://github.com/mallikmusaddiq1/nglstrike"
23
+
24
+ [project.scripts]
25
+ nglstrike = "nglstrike.main:main"
26
+
27
+ [tool.setuptools.packages.find]
28
+ where = ["."]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,26 @@
1
+ from setuptools import setup, find_packages
2
+
3
+ setup(
4
+ name="nglstrike",
5
+ version="1.0.0",
6
+ author="Mallik Mohammed Musaddiq",
7
+ author_email="mallikmusaddiq1@gmail.com",
8
+ description="Anonymous Auto-Sender for NGL",
9
+ long_description=open("README.md", encoding="utf-8").read(),
10
+ long_description_content_type="text/markdown",
11
+ packages=find_packages(where="."),
12
+ install_requires=[
13
+ "requests"
14
+ ],
15
+ entry_points={
16
+ "console_scripts": [
17
+ "nglstrike = nglstrike.main:main"
18
+ ]
19
+ },
20
+ classifiers=[
21
+ "Programming Language :: Python :: 3",
22
+ "License :: OSI Approved :: MIT License",
23
+ "Operating System :: OS Independent"
24
+ ],
25
+ python_requires='>=3.6',
26
+ )