Updated mirrors and LICENSE
This commit is contained in:
parent
d8596dd59f
commit
9b80d6a73b
2
LICENSE
2
LICENSE
@ -1,6 +1,6 @@
|
|||||||
ISC License
|
ISC License
|
||||||
|
|
||||||
Copyright (c) 2023, acidvegas <acid.vegas@acid.vegas>
|
Copyright (c) 2024, acidvegas <acid.vegas@acid.vegas>
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
17
README.md
17
README.md
@ -16,7 +16,19 @@ The bot is designed to be very minimal, secure, & trustless by nature. This mean
|
|||||||
|
|
||||||
It is highly recommended that you use a [random spoofing ident protocol daemon](https://github.com/internet-relay-chat/archive/blob/master/identd.py)
|
It is highly recommended that you use a [random spoofing ident protocol daemon](https://github.com/internet-relay-chat/archive/blob/master/identd.py)
|
||||||
|
|
||||||
## Commands
|
## Requirements
|
||||||
|
- [Python](https://python.org/)
|
||||||
|
- [aiosocks](https:///pypi.org/aiosocks) *(`pip install aiosocks`)*
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
###### CLI Options
|
||||||
|
| Argument | Description |
|
||||||
|
| ----------------- | ---------------------------------------- |
|
||||||
|
| `-p`, `--proxies` | set input file containing proxies to use |
|
||||||
|
| `-v`, `--vhosts` | set input file containin vhosts to use |
|
||||||
|
| `-c`, `--clones` | set the concurrency limit per-server |
|
||||||
|
|
||||||
|
###### Commands
|
||||||
| Command | Description |
|
| Command | Description |
|
||||||
| ---------------------- | ---------------------------------------------------------------------------------------------------------- |
|
| ---------------------- | ---------------------------------------------------------------------------------------------------------- |
|
||||||
| `5000 <chan>` | Emulates SuperNETs #5000 channel *(Join #5000 on irc.supernets.org for help using this command)* |
|
| `5000 <chan>` | Emulates SuperNETs #5000 channel *(Join #5000 on irc.supernets.org for help using this command)* |
|
||||||
@ -75,5 +87,4 @@ This is an accurate map of the [EFNet](http://efnet.org) IRC network as of *05/1
|
|||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
###### Mirrors
|
###### Mirrors for this repository: [acid.vegas](https://git.acid.vegas/jupiter) • [SuperNETs](https://git.supernets.org/acidvegas/jupiter) • [GitHub](https://github.com/acidvegas/jupiter) • [GitLab](https://gitlab.com/acidvegas/jupiter) • [Codeberg](https://codeberg.org/acidvegas/jupiter)
|
||||||
[acid.vegas](https://git.acid.vegas/jupiter) • [GitHub](https://github.com/acidvegas/jupiter) • [GitLab](https://gitlab.com/acidvegas/jupiter) • [SuperNETs](https://git.supernets.org/acidvegas/jupiter)
|
|
||||||
|
40
jupiter.py
40
jupiter.py
@ -11,7 +11,6 @@ import random
|
|||||||
import re
|
import re
|
||||||
import socket
|
import socket
|
||||||
import ssl
|
import ssl
|
||||||
import sys
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -25,7 +24,7 @@ servers = (
|
|||||||
{'server':'efnet.port80.se', 'ssl':6697, 'ipv6': True},
|
{'server':'efnet.port80.se', 'ssl':6697, 'ipv6': True},
|
||||||
#{'server':'efnet.portlane.se', 'ssl':6697, 'ipv6': True}, # Removed (efnet.portlane.se is an alias for irc.efnet.org)
|
#{'server':'efnet.portlane.se', 'ssl':6697, 'ipv6': True}, # Removed (efnet.portlane.se is an alias for irc.efnet.org)
|
||||||
{'server':'irc.choopa.net', 'ssl':9000, 'ipv6': True},
|
{'server':'irc.choopa.net', 'ssl':9000, 'ipv6': True},
|
||||||
{'server':'irc.colosolutions.net', 'ssl':None, 'ipv6':False}, # error: SSL handshake failed: unsafe legacy renegotiation disabled
|
# {'server':'irc.colosolutions.net', 'ssl':None, 'ipv6':False}, # error: SSL handshake failed: unsafe legacy renegotiation disabled
|
||||||
#{'server':'irc.deft.com', 'ssl':None, 'ipv6':False}, # Removed (irc.deft.com points to irc.servercentral.net)
|
#{'server':'irc.deft.com', 'ssl':None, 'ipv6':False}, # Removed (irc.deft.com points to irc.servercentral.net)
|
||||||
{'server':'irc.du.se', 'ssl':None, 'ipv6':False}, # error: handshake failed: dh key too small
|
{'server':'irc.du.se', 'ssl':None, 'ipv6':False}, # error: handshake failed: dh key too small
|
||||||
#{'server':'irc.efnet.fr', 'ssl':6697, 'ipv6': True}, # Removed (irc.efnet.fr is an alias for irc.efnet.nl)
|
#{'server':'irc.efnet.fr', 'ssl':6697, 'ipv6': True}, # Removed (irc.efnet.fr is an alias for irc.efnet.nl)
|
||||||
@ -33,19 +32,19 @@ servers = (
|
|||||||
{'server':'irc.homelien.no', 'ssl':6697, 'ipv6': True},
|
{'server':'irc.homelien.no', 'ssl':6697, 'ipv6': True},
|
||||||
{'server':'irc.mzima.net', 'ssl':6697, 'ipv6': True},
|
{'server':'irc.mzima.net', 'ssl':6697, 'ipv6': True},
|
||||||
#{'server':'irc.nordunet.se', 'ssl':6697, 'ipv6': True}, # Removed (irc.nordunet.se is an alias for irc.swepipe.se)
|
#{'server':'irc.nordunet.se', 'ssl':6697, 'ipv6': True}, # Removed (irc.nordunet.se is an alias for irc.swepipe.se)
|
||||||
{'server':'irc.prison.net', 'ssl':None, 'ipv6':False},
|
# {'server':'irc.prison.net', 'ssl':None, 'ipv6':False},
|
||||||
{'server':'irc.swepipe.se', 'ssl':6697, 'ipv6': True},
|
{'server':'irc.swepipe.se', 'ssl':6697, 'ipv6': True},
|
||||||
{'server':'irc.underworld.no', 'ssl':6697, 'ipv6': True},
|
{'server':'irc.underworld.no', 'ssl':6697, 'ipv6': True},
|
||||||
{'server':'irc.servercentral.net', 'ssl':9999, 'ipv6':False}
|
{'server':'irc.servercentral.net', 'ssl':9999, 'ipv6':False}
|
||||||
)
|
)
|
||||||
ipv6 = True # Set to False if your system does not have an IPv6 address
|
ipv6 = False #True # Set to False if your system does not have an IPv6 address
|
||||||
channel = '#jupiter'
|
channel = '#jupiter2'
|
||||||
backup = '#jupiter-' + str(random.randint(1000,9999)) # Use /list -re #jupiter-* on weechat to find your bots
|
backup = '#jupiter2-' + str(random.randint(1000,9999)) # Use /list -re #jupiter-* on weechat to find your bots
|
||||||
key = 'xChangeMex'
|
key = 'xChangeMex'
|
||||||
|
|
||||||
# Settings
|
# Settings
|
||||||
admin = 'nick!user@host' # Can use wildcards (Must be in nick!user@host format)
|
admin = 'acidvegas!*@*' #'nick!user@host' # Can use wildcards (Must be in nick!user@host format)
|
||||||
connect_delay = True # Random delay between 5-15 minutes before connecting a clone to a server
|
connect_delay = False #True # Random delay between 5-15 minutes before connecting a clone to a server
|
||||||
id = 'TEST' # Unique ID so you can tell which bots belong what server
|
id = 'TEST' # Unique ID so you can tell which bots belong what server
|
||||||
|
|
||||||
# Formatting Control Characters / Color Codes
|
# Formatting Control Characters / Color Codes
|
||||||
@ -135,8 +134,9 @@ class clone():
|
|||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
if connect_delay:
|
if connect_delay:
|
||||||
await asyncio.sleep(random.randint(300,900))
|
await asyncio.sleep(random.randint(30,120))
|
||||||
if self.proxy:
|
if self.proxy:
|
||||||
|
self.ssl_status = False
|
||||||
auth = self.proxy.split('@')[0].split(':') if '@' in self.proxy else None
|
auth = self.proxy.split('@')[0].split(':') if '@' in self.proxy else None
|
||||||
proxy_ip, proxy_port = self.proxy.split('@')[1].split(':') if '@' in self.proxy else self.proxy.split(':')
|
proxy_ip, proxy_port = self.proxy.split('@')[1].split(':') if '@' in self.proxy else self.proxy.split(':')
|
||||||
options = {
|
options = {
|
||||||
@ -147,7 +147,7 @@ class clone():
|
|||||||
'ssl' : ssl_ctx() if self.server['ssl'] and self.ssl_status else None,
|
'ssl' : ssl_ctx() if self.server['ssl'] and self.ssl_status else None,
|
||||||
'family' : 2
|
'family' : 2
|
||||||
}
|
}
|
||||||
self.reader, self.writer = await asyncio.wait_for(aiosocks.open_connection(**options), 15)
|
self.reader, self.writer = await asyncio.wait_for(aiosocks.open_connection(**options), 30)
|
||||||
else:
|
else:
|
||||||
options = {
|
options = {
|
||||||
'host' : self.server['server'],
|
'host' : self.server['server'],
|
||||||
@ -157,13 +157,14 @@ class clone():
|
|||||||
'family' : socket.AF_INET6 if self.use_ipv6 else socket.AF_INET,
|
'family' : socket.AF_INET6 if self.use_ipv6 else socket.AF_INET,
|
||||||
'local_addr' : (self.vhost, random.randint(5000,60000)) if self.vhost else None
|
'local_addr' : (self.vhost, random.randint(5000,60000)) if self.vhost else None
|
||||||
}
|
}
|
||||||
self.reader, self.writer = await asyncio.wait_for(asyncio.open_connection(**options), 15)
|
self.reader, self.writer = await asyncio.wait_for(asyncio.open_connection(**options), 30)
|
||||||
await self.raw(f'USER {rndnick()} 0 * :{rndnick()}')
|
await self.raw(f'USER {rndnick()} 0 * :{rndnick()}')
|
||||||
await self.raw('NICK ' + self.nickname)
|
await self.raw('NICK ' + self.nickname)
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
v6 = 'using IPv6 ' if self.use_ipv6 else ''
|
v6 = 'using IPv6 ' if self.use_ipv6 else ''
|
||||||
if self.ssl_status and self.server['ssl']:
|
if self.ssl_status and self.server['ssl']:
|
||||||
self.ssl_status = False
|
self.ssl_status = False
|
||||||
|
print(options)
|
||||||
error('Failed to connect to \'{0}\' IRC server {1}on port {2} using SSL/TLS'.format(self.server['server'], v6, str(self.server['ssl'])), ex)
|
error('Failed to connect to \'{0}\' IRC server {1}on port {2} using SSL/TLS'.format(self.server['server'], v6, str(self.server['ssl'])), ex)
|
||||||
else:
|
else:
|
||||||
if not self.ssl_status and self.server['ssl']:
|
if not self.ssl_status and self.server['ssl']:
|
||||||
@ -172,7 +173,7 @@ class clone():
|
|||||||
else:
|
else:
|
||||||
await self.listen()
|
await self.listen()
|
||||||
finally:
|
finally:
|
||||||
await asyncio.sleep(86400+random.randint(1800,3600))
|
await asyncio.sleep(10) #await asyncio.sleep(86400+random.randint(1800,3600))
|
||||||
|
|
||||||
async def event_message(self, ident, nick, target, msg):
|
async def event_message(self, ident, nick, target, msg):
|
||||||
if target == self.relay:
|
if target == self.relay:
|
||||||
@ -281,6 +282,7 @@ class clone():
|
|||||||
line = data.decode('utf-8').strip()
|
line = data.decode('utf-8').strip()
|
||||||
args = line.split()
|
args = line.split()
|
||||||
if line.startswith('ERROR :Closing Link:'):
|
if line.startswith('ERROR :Closing Link:'):
|
||||||
|
print(line)
|
||||||
raise Exception('Banned')
|
raise Exception('Banned')
|
||||||
elif line.startswith('ERROR :Reconnecting too fast'):
|
elif line.startswith('ERROR :Reconnecting too fast'):
|
||||||
raise Exception('Throttled')
|
raise Exception('Throttled')
|
||||||
@ -424,6 +426,7 @@ async def main(input_data=None):
|
|||||||
jobs.append(asyncio.ensure_future(clone(server, vhost=item, use_ipv6=True).connect()))
|
jobs.append(asyncio.ensure_future(clone(server, vhost=item, use_ipv6=True).connect()))
|
||||||
else:
|
else:
|
||||||
jobs.append(asyncio.ensure_future(clone(server, vhost=item).connect()))
|
jobs.append(asyncio.ensure_future(clone(server, vhost=item).connect()))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
jobs.append(asyncio.ensure_future(clone(server).connect()))
|
jobs.append(asyncio.ensure_future(clone(server).connect()))
|
||||||
if ipv6 and server['ipv6']:
|
if ipv6 and server['ipv6']:
|
||||||
@ -444,11 +447,16 @@ if __name__ == '__main__':
|
|||||||
parser.add_argument('-v', '--vhosts', type=str, help="Path to file containing vhosts.")
|
parser.add_argument('-v', '--vhosts', type=str, help="Path to file containing vhosts.")
|
||||||
parser.add_argument('-c', '--clones', type=int, default=3, help="Number to define the concurrency to use. Default is 3.")
|
parser.add_argument('-c', '--clones', type=int, default=3, help="Number to define the concurrency to use. Default is 3.")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
if (input_file := args.proxies if args.proxies else args.vhosts if args.vhosts else None):
|
if args.proxies and args.vhosts:
|
||||||
|
raise SystemExit('Cannot use both proxies & vhosts at the same time!')
|
||||||
|
elif (input_file := args.proxies if args.proxies else args.vhosts if args.vhosts else None):
|
||||||
if os.path.exists(input_file):
|
if os.path.exists(input_file):
|
||||||
data = open(input_file, 'r').read().split('\n')
|
data = set([item.rstrip() for item in open(input_file, 'r').read().splitlines() if item])
|
||||||
print('Loaded {0:,} items from {1}'.format(len(data), input_file))
|
if data:
|
||||||
asyncio.run(main(data))
|
print('Loaded {0:,} items from {1}'.format(len(data), input_file))
|
||||||
|
asyncio.run(main(data))
|
||||||
|
else:
|
||||||
|
raise SystemExit(f'Error: {input_file} is empty!')
|
||||||
else:
|
else:
|
||||||
raise SystemExit(f'Error: {input_file} does not exist!')
|
raise SystemExit(f'Error: {input_file} does not exist!')
|
||||||
else:
|
else:
|
||||||
|
Loading…
Reference in New Issue
Block a user