mirror of
https://github.com/bellingcat/octosuite.git
synced 2026-06-13 05:48:34 +03:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d5119a87b0 | ||
|
|
c4bd431620 |
@@ -7,7 +7,7 @@ banner = f'''{red}
|
|||||||
░ ████▓▒░▒ ▓███▀ ░ ▒██▒ ░ ░ ████▓▒░▒██████▒▒▒█████▓ ░██░ ▒██▒ ░ ░▒████▒
|
░ ████▓▒░▒ ▓███▀ ░ ▒██▒ ░ ░ ████▓▒░▒██████▒▒▒█████▓ ░██░ ▒██▒ ░ ░▒████▒
|
||||||
░ ▒░▒░▒░ ░ ░▒ ▒ ░ ▒ ░░ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░
|
░ ▒░▒░▒░ ░ ░▒ ▒ ░ ▒ ░░ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ ░▓ ▒ ░░ ░░ ▒░ ░
|
||||||
░ ▒ ▒░ ░ ▒ ░ ░ ▒ ▒░ ░ ░▒ ░ ░░░▒░ ░ ░ ▒ ░ ░ ░ ░ ░
|
░ ▒ ▒░ ░ ▒ ░ ░ ▒ ▒░ ░ ░▒ ░ ░░░▒░ ░ ░ ▒ ░ ░ ░ ░ ░
|
||||||
░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ v1.4.0
|
░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░░ ░ ░ ▒ v1.5.0
|
||||||
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
|
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
|
||||||
░ {white}— Advanced Github {red}OSINT{white} Framework{reset}
|
░ {white}— Advanced Github {red}OSINT{white} Framework{reset}
|
||||||
|
|
||||||
|
|||||||
131
src/main.py
131
src/main.py
@@ -6,8 +6,9 @@ import subprocess
|
|||||||
import urllib.request
|
import urllib.request
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
from lib import colors,banner
|
from lib.banner import banner
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from lib.colors import red, white, green, reset
|
||||||
|
|
||||||
class octosuite:
|
class octosuite:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -160,8 +161,8 @@ class octosuite:
|
|||||||
else:
|
else:
|
||||||
subprocess.run(['clear'],shell=False)
|
subprocess.run(['clear'],shell=False)
|
||||||
|
|
||||||
print(banner.banner)
|
print(banner)
|
||||||
command = input(f'''{colors.white}┌─({colors.red}{platform.node()}{colors.white}@{colors.red}octosuite{colors.white})-[{colors.green}{os.getcwd()}{colors.white}]\n└─╼[{colors.green}:~{colors.white}]{colors.reset} ''')
|
command = input(f'''{white}┌─({red}{platform.node()}{white}@{red}octosuite{white})-[{green}{os.getcwd()}{white}]\n└─╼[{green}:~{white}]{reset} ''')
|
||||||
if command == 'orginfo':
|
if command == 'orginfo':
|
||||||
self.org_info()
|
self.org_info()
|
||||||
elif command == 'userinfo':
|
elif command == 'userinfo':
|
||||||
@@ -200,204 +201,204 @@ class octosuite:
|
|||||||
print(self.help())
|
print(self.help())
|
||||||
elif command == 'exit':
|
elif command == 'exit':
|
||||||
logging.info('Session terminated.')
|
logging.info('Session terminated.')
|
||||||
exit(f'\n{colors.white}[{colors.red}-{colors.white}] Session terminated.{colors.reset}')
|
exit(f'\n{white}[{red}-{white}] Session terminated.{reset}')
|
||||||
else:
|
else:
|
||||||
print(f'\n{colors.white}[{colors.red}!{colors.white}] Unknown command: ‘{command}’{colors.reset}')
|
print(f'\n{white}[{red}!{white}] Unknown command: ‘{command}’{reset}')
|
||||||
logging.warning(f'Unknown command: ‘{command}’')
|
logging.warning(f'Unknown command: ‘{command}’')
|
||||||
|
|
||||||
input(f'\n{colors.white}^ Press any key to continue{colors.reset} ')
|
input(f'\n{white}^ Press any key to continue{reset} ')
|
||||||
|
|
||||||
|
|
||||||
def org_info(self):
|
def org_info(self):
|
||||||
organization = input(f'{colors.white}@{colors.green}Organization{colors.white} >> {colors.reset}')
|
organization = input(f'{white}@{green}Organization{white} >> {reset}')
|
||||||
api = f'https://api.github.com/orgs/{organization}'
|
api = f'https://api.github.com/orgs/{organization}'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
print(f'\n{colors.white}[{colors.red}-{colors.white}] Organization @{organization} {colors.red}Not Found{colors.reset}')
|
print(f'\n{white}[{red}-{white}] Organization @{organization} {red}Not Found{reset}')
|
||||||
else:
|
else:
|
||||||
response = response.json()
|
response = response.json()
|
||||||
print(f"\n{colors.white}{response['name']}{colors.reset}")
|
print(f"\n{white}{response['name']}{reset}")
|
||||||
for attr in self.org_attrs:
|
for attr in self.org_attrs:
|
||||||
print(f'{colors.white}├─ {self.org_attr_dict[attr]}: {colors.green}{response[attr]}{colors.reset}')
|
print(f'{white}├─ {self.org_attr_dict[attr]}: {green}{response[attr]}{reset}')
|
||||||
|
|
||||||
|
|
||||||
# Fetching user information
|
# Fetching user information
|
||||||
def user_profile(self):
|
def user_profile(self):
|
||||||
username = input(f'{colors.white}@{colors.green}Username{colors.white} >> {colors.reset}')
|
username = input(f'{white}@{green}Username{white} >> {reset}')
|
||||||
api = f'https://api.github.com/users/{username}'
|
api = f'https://api.github.com/users/{username}'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
print(f'\n{colors.white}[{colors.red}-{colors.white}] User @{username} {colors.red}Not Found{colors.reset}')
|
print(f'\n{white}[{red}-{white}] User @{username} {red}Not Found{reset}')
|
||||||
else:
|
else:
|
||||||
response = response.json()
|
response = response.json()
|
||||||
print(f"\n{colors.white}{response['name']}{colors.reset}")
|
print(f"\n{white}{response['name']}{reset}")
|
||||||
for attr in self.profile_attrs:
|
for attr in self.profile_attrs:
|
||||||
print(f'{colors.white}├─ {self.profile_attr_dict[attr]}: {colors.green}{response[attr]}{colors.reset}')
|
print(f'{white}├─ {self.profile_attr_dict[attr]}: {green}{response[attr]}{reset}')
|
||||||
|
|
||||||
|
|
||||||
# Fetching repository information
|
# Fetching repository information
|
||||||
def repo_info(self):
|
def repo_info(self):
|
||||||
username = input(f'{colors.white}@{colors.green}Owner-username{colors.white} >> {colors.reset}')
|
username = input(f'{white}@{green}Owner-username{white} >> {reset}')
|
||||||
repo_name = input(f'{colors.white}%{colors.green}reponame{colors.white} >> {colors.reset}')
|
repo_name = input(f'{white}%{green}reponame{white} >> {reset}')
|
||||||
api = f'https://api.github.com/repos/{username}/{repo_name}'
|
api = f'https://api.github.com/repos/{username}/{repo_name}'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
print(f'\n{colors.white}[{colors.red}-{colors.white}] Repository %{repo_name} {colors.red}Not Found{colors.reset}')
|
print(f'\n{white}[{red}-{white}] Repository %{repo_name} {red}Not Found{reset}')
|
||||||
else:
|
else:
|
||||||
response = response.json()
|
response = response.json()
|
||||||
print(f"\n{colors.white}{response['full_name']}{colors.reset}")
|
print(f"\n{white}{response['full_name']}{reset}")
|
||||||
for attr in self.repo_attrs:
|
for attr in self.repo_attrs:
|
||||||
print(f"{colors.white}├─ {self.repo_attr_dict[attr]}: {colors.green}{response[attr]}{colors.reset}")
|
print(f"{white}├─ {self.repo_attr_dict[attr]}: {green}{response[attr]}{reset}")
|
||||||
|
|
||||||
|
|
||||||
# Get path contents
|
# Get path contents
|
||||||
def path_contents(self):
|
def path_contents(self):
|
||||||
username = input(f'{colors.white}@{colors.green}Owner-username{colors.white} >> {colors.reset}')
|
username = input(f'{white}@{green}Owner-username{white} >> {reset}')
|
||||||
repo_name = input(f'{colors.white}%{colors.green}reponame{colors.white} >> {colors.reset}')
|
repo_name = input(f'{white}%{green}reponame{white} >> {reset}')
|
||||||
path_name = input(f'{colors.white}/path/name >>{colors.reset} ')
|
path_name = input(f'{white}/path/name >>{reset} ')
|
||||||
api = f'https://api.github.com/repos/{username}/{repo_name}/contents/{path_name}'
|
api = f'https://api.github.com/repos/{username}/{repo_name}/contents/{path_name}'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
print(f'\n{colors.white}[{colors.red}-{colors.white}] Information {colors.red}Not Found{colors.reset}')
|
print(f'\n{white}[{red}-{white}] Information {red}Not Found{reset}')
|
||||||
else:
|
else:
|
||||||
response = response.json()
|
response = response.json()
|
||||||
for item in response:
|
for item in response:
|
||||||
print(f"\n{colors.white}{item['name']}{colors.reset}")
|
print(f"\n{white}{item['name']}{reset}")
|
||||||
for attr in self.path_attrs:
|
for attr in self.path_attrs:
|
||||||
print(f'{colors.white}├─ {self.path_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}')
|
print(f'{white}├─ {self.path_attr_dict[attr]}: {green}{item[attr]}{reset}')
|
||||||
|
|
||||||
|
|
||||||
# Fetching organozation repositories
|
# Fetching organozation repositories
|
||||||
def org_repos(self):
|
def org_repos(self):
|
||||||
organization = input(f'{colors.white}@{colors.green}Organization{colors.white} >> {colors.reset}')
|
organization = input(f'{white}@{green}Organization{white} >> {reset}')
|
||||||
api = f'https://api.github.com/orgs/{organization}/repos?per_page=100'
|
api = f'https://api.github.com/orgs/{organization}/repos?per_page=100'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
print(f'\n{colors.white}[{colors.red}-{colors.white}] Organization @{organization} {colors.red}Not Found{colors.reset}')
|
print(f'\n{white}[{red}-{white}] Organization @{organization} {red}Not Found{reset}')
|
||||||
else:
|
else:
|
||||||
response = response.json()
|
response = response.json()
|
||||||
for repo in response:
|
for repo in response:
|
||||||
print(f"\n{colors.white}{repo['full_name']}{colors.reset}")
|
print(f"\n{white}{repo['full_name']}{reset}")
|
||||||
for attr in self.repo_attrs:
|
for attr in self.repo_attrs:
|
||||||
print(f"{colors.white}├─ {self.repo_attr_dict[attr]}: {colors.green}{repo[attr]}{colors.reset}")
|
print(f"{white}├─ {self.repo_attr_dict[attr]}: {green}{repo[attr]}{reset}")
|
||||||
print('\n')
|
print('\n')
|
||||||
|
|
||||||
|
|
||||||
# Fetching user repositories
|
# Fetching user repositories
|
||||||
def user_repos(self):
|
def user_repos(self):
|
||||||
username = input(f'{colors.white}@{colors.green}Username{colors.white} >> {colors.reset}')
|
username = input(f'{white}@{green}Username{white} >> {reset}')
|
||||||
api = f'https://api.github.com/users/{username}/repos?per_page=100'
|
api = f'https://api.github.com/users/{username}/repos?per_page=100'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
print(f'\n{colors.white}[{colors.red}-{colors.white}] User @{username} {colors.red}Not Found{colors.reset}')
|
print(f'\n{white}[{red}-{white}] User @{username} {red}Not Found{reset}')
|
||||||
else:
|
else:
|
||||||
response = response.json()
|
response = response.json()
|
||||||
for repo in response:
|
for repo in response:
|
||||||
print(f"\n{colors.white}{repo['full_name']}{colors.reset}")
|
print(f"\n{white}{repo['full_name']}{reset}")
|
||||||
for attr in self.repo_attrs:
|
for attr in self.repo_attrs:
|
||||||
print(f"{colors.white}├─ {self.repo_attr_dict[attr]}: {colors.green}{repo[attr]}{colors.reset}")
|
print(f"{white}├─ {self.repo_attr_dict[attr]}: {green}{repo[attr]}{reset}")
|
||||||
print('\n')
|
print('\n')
|
||||||
|
|
||||||
|
|
||||||
# Fetching user's gists
|
# Fetching user's gists
|
||||||
def user_gists(self):
|
def user_gists(self):
|
||||||
username = input(f'{colors.white}@{colors.green}Username{colors.white} >> {colors.reset}')
|
username = input(f'{white}@{green}Username{white} >> {reset}')
|
||||||
api = f'https://api.github.com/users/{username}/gists'
|
api = f'https://api.github.com/users/{username}/gists'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
if response == []:
|
if response == []:
|
||||||
print(f'{colors.white}[{colors.red}-{colors.white}]User @{username} does not have any active gists.{colors.reset}')
|
print(f'{white}[{red}-{white}]User @{username} does not have any active gists.{reset}')
|
||||||
else:
|
else:
|
||||||
for item in response:
|
for item in response:
|
||||||
print(f"\n{colors.white}{item['id']}{colors.reset}")
|
print(f"\n{white}{item['id']}{reset}")
|
||||||
for attr in self.gists_attrs:
|
for attr in self.gists_attrs:
|
||||||
print(f"{colors.white}├─ {self.gists_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}")
|
print(f"{white}├─ {self.gists_attr_dict[attr]}: {green}{item[attr]}{reset}")
|
||||||
print('\n')
|
print('\n')
|
||||||
|
|
||||||
|
|
||||||
# Fetching user's followera'
|
# Fetching user's followera'
|
||||||
def followers(self):
|
def followers(self):
|
||||||
username = input(f'{colors.white}@{colors.green}Username{colors.white} >> {colors.reset}')
|
username = input(f'{white}@{green}Username{white} >> {reset}')
|
||||||
api = f'https://api.github.com/users/{username}/followers?per_page=100'
|
api = f'https://api.github.com/users/{username}/followers?per_page=100'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
if response == []:
|
if response == []:
|
||||||
print(f'\n{colors.white}[{colors.red}-{colors.white}]User @{username} does not have followers.{colors.reset}')
|
print(f'\n{white}[{red}-{white}]User @{username} does not have followers.{reset}')
|
||||||
else:
|
else:
|
||||||
for item in response:
|
for item in response:
|
||||||
print(f"\n{colors.white}@{item['login']}{colors.reset}")
|
print(f"\n{white}@{item['login']}{reset}")
|
||||||
for attr in self.user_attrs:
|
for attr in self.user_attrs:
|
||||||
print(f"{colors.white}├─ {self.user_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}")
|
print(f"{white}├─ {self.user_attr_dict[attr]}: {green}{item[attr]}{reset}")
|
||||||
print('\n')
|
print('\n')
|
||||||
|
|
||||||
|
|
||||||
# Checking whether or not user[A] follows user[B]
|
# Checking whether or not user[A] follows user[B]
|
||||||
def following(self):
|
def following(self):
|
||||||
user_a = input(f'{colors.white}@{colors.green}User[A]{colors.white} >> {colors.reset}')
|
user_a = input(f'{white}@{green}User[A]{white} >> {reset}')
|
||||||
user_b = input(f'{colors.white}@{colors.green}User[B]{colors.white} >> {colors.reset}')
|
user_b = input(f'{white}@{green}User[B]{white} >> {reset}')
|
||||||
api = f'https://api.github.com/users/{user_a}/following/{user_b}'
|
api = f'https://api.github.com/users/{user_a}/following/{user_b}'
|
||||||
response = requests.get(api)
|
response = requests.get(api)
|
||||||
if response.status_code == 204:
|
if response.status_code == 204:
|
||||||
print(f'{colors.white}[{colors.green}+{colors.white}] @{user_a} follows @{user_b}.{colors.reset}')
|
print(f'{white}[{green}+{white}] @{user_a} follows @{user_b}.{reset}')
|
||||||
else:
|
else:
|
||||||
print(f'{colors.white}[{colors.red}-{colors.white}] @{user_a} does not follow @{user_b}.{colors.reset}')
|
print(f'{white}[{red}-{white}] @{user_a} does not follow @{user_b}.{reset}')
|
||||||
|
|
||||||
|
|
||||||
# User search
|
# User search
|
||||||
def user_search(self):
|
def user_search(self):
|
||||||
query = input(f'{colors.white}#{colors.green}Query{colors.white} >> {colors.reset}')
|
query = input(f'{white}#{green}Query{white} >> {reset}')
|
||||||
api = f'https://api.github.com/search/users?q={query}&per_page=100'
|
api = f'https://api.github.com/search/users?q={query}&per_page=100'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
for item in response['items']:
|
for item in response['items']:
|
||||||
print(f"\n{colors.white}@{item['login']}{colors.reset}")
|
print(f"\n{white}@{item['login']}{reset}")
|
||||||
for attr in self.user_attrs:
|
for attr in self.user_attrs:
|
||||||
print(f"{colors.white}├─ {self.user_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}")
|
print(f"{white}├─ {self.user_attr_dict[attr]}: {green}{item[attr]}{reset}")
|
||||||
print('\n')
|
print('\n')
|
||||||
|
|
||||||
|
|
||||||
# Repository search
|
# Repository search
|
||||||
def repo_search(self):
|
def repo_search(self):
|
||||||
query = input(f'{colors.white}#{colors.green}Query{colors.white} >> {colors.reset}')
|
query = input(f'{white}#{green}Query{white} >> {reset}')
|
||||||
api = f'https://api.github.com/search/repositories?q={query}&per_page=100'
|
api = f'https://api.github.com/search/repositories?q={query}&per_page=100'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
for item in response['items']:
|
for item in response['items']:
|
||||||
print(f"\n{colors.white}{item['full_name']}{colors.reset}")
|
print(f"\n{white}{item['full_name']}{reset}")
|
||||||
for attr in self.repo_attrs:
|
for attr in self.repo_attrs:
|
||||||
print(f"{colors.white}├─ {self.repo_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}")
|
print(f"{white}├─ {self.repo_attr_dict[attr]}: {green}{item[attr]}{reset}")
|
||||||
print('\n')
|
print('\n')
|
||||||
|
|
||||||
|
|
||||||
# Topics search
|
# Topics search
|
||||||
def topic_search(self):
|
def topic_search(self):
|
||||||
query = input(f'{colors.white}#{colors.green}Query{colors.white} >> {colors.reset}')
|
query = input(f'{white}#{green}Query{white} >> {reset}')
|
||||||
api = f'https://api.github.com/search/topics?q={query}&per_page=100'
|
api = f'https://api.github.com/search/topics?q={query}&per_page=100'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
for item in response['items']:
|
for item in response['items']:
|
||||||
print(f"\n{colors.white}{item['name']}{colors.reset}")
|
print(f"\n{white}{item['name']}{reset}")
|
||||||
for attr in self.topic_attrs:
|
for attr in self.topic_attrs:
|
||||||
print(f"{colors.white}├─ {self.topic_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}")
|
print(f"{white}├─ {self.topic_attr_dict[attr]}: {green}{item[attr]}{reset}")
|
||||||
print('\n')
|
print('\n')
|
||||||
|
|
||||||
|
|
||||||
# Issue search
|
# Issue search
|
||||||
def issue_search(self):
|
def issue_search(self):
|
||||||
query = input(f'{colors.white}#{colors.green}Query{colors.white} >> {colors.reset}')
|
query = input(f'{white}#{green}Query{white} >> {reset}')
|
||||||
api = f'https://api.github.com/search/issues?q={query}&per_page=100'
|
api = f'https://api.github.com/search/issues?q={query}&per_page=100'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
for item in response['items']:
|
for item in response['items']:
|
||||||
print(f"\n{colors.white}{item['title']}{colors.reset}")
|
print(f"\n{white}{item['title']}{reset}")
|
||||||
for attr in self.issue_attrs:
|
for attr in self.issue_attrs:
|
||||||
print(f"{colors.white}├─ {self.issue_attr_dict[attr]}: {colors.green}{item[attr]}{colors.reset}")
|
print(f"{white}├─ {self.issue_attr_dict[attr]}: {green}{item[attr]}{reset}")
|
||||||
print('\n')
|
print('\n')
|
||||||
|
|
||||||
|
|
||||||
# Commits search
|
# Commits search
|
||||||
def commits_search(self):
|
def commits_search(self):
|
||||||
query = input(f'{colors.white}#{colors.green}Query{colors.white} >> {colors.reset}')
|
query = input(f'{white}#{green}Query{white} >> {reset}')
|
||||||
api = f'https://api.github.com/search/commits?q={query}&per_page=100'
|
api = f'https://api.github.com/search/commits?q={query}&per_page=100'
|
||||||
response = requests.get(api).json()
|
response = requests.get(api).json()
|
||||||
n=0
|
n=0
|
||||||
for item in response['items']:
|
for item in response['items']:
|
||||||
n+=1
|
n+=1
|
||||||
print(f'{colors.white}{n}.{colors.reset}')
|
print(f'{white}{n}.{reset}')
|
||||||
pprint(item['commit'])
|
pprint(item['commit'])
|
||||||
print('\n')
|
print('\n')
|
||||||
|
|
||||||
@@ -406,32 +407,32 @@ class octosuite:
|
|||||||
def update(self):
|
def update(self):
|
||||||
logging.info('Fetching updates...')
|
logging.info('Fetching updates...')
|
||||||
files_to_update = ['src/main.py','lib/banner.py','lib/colors.py','octosuite','.github/dependabot.yml','LICENSE','README.md','requirements.txt']
|
files_to_update = ['src/main.py','lib/banner.py','lib/colors.py','octosuite','.github/dependabot.yml','LICENSE','README.md','requirements.txt']
|
||||||
for file in tqdm(files_to_update,desc=f'{colors.white}[{colors.green}*{colors.white}] Fetching updates...{colors.reset}'):
|
for file in tqdm(files_to_update,desc=f'{white}[{green}*{white}] Updating{reset}'):
|
||||||
data = urllib.request.urlopen(f'https://raw.githubusercontent.com/rly0nheart/octosuite/master/{file}').read()
|
data = urllib.request.urlopen(f'https://raw.githubusercontent.com/rly0nheart/octosuite/master/{file}').read()
|
||||||
with open(file, 'wb') as code:
|
with open(file, 'wb') as code:
|
||||||
code.write(data)
|
code.write(data)
|
||||||
code.close()
|
code.close()
|
||||||
|
|
||||||
logging.info('Update complete.')
|
logging.info('Update complete.')
|
||||||
exit(f'{colors.white}[{colors.green}+{colors.white}] Update complete. Re-run octosuite.{colors.reset}')
|
exit(f'{white}[{green}+{white}] Updated successfully. Re-run octosuite.{reset}')
|
||||||
|
|
||||||
|
|
||||||
# Show changelog
|
# Show changelog
|
||||||
def changelog(self):
|
def changelog(self):
|
||||||
# lol yes the changelog is hard coded
|
# lol yes the changelog is hard coded
|
||||||
changelog_text = '''
|
changelog_text = '''
|
||||||
v1.4.0 Changelog:
|
v1.5.0 Changelog:
|
||||||
|
|
||||||
• Minor changes to the interface
|
• Fixed import error in src/main.py
|
||||||
'''
|
'''
|
||||||
return changelog_text
|
return changelog_text
|
||||||
|
|
||||||
|
|
||||||
# Author info
|
# Author info
|
||||||
def author(self):
|
def author(self):
|
||||||
print(f'\n{colors.white}Richard Mwewa (Ritchie){colors.reset}')
|
print(f'\n{white}Richard Mwewa (Ritchie){reset}')
|
||||||
for key,value in self.author_dict.items():
|
for key,value in self.author_dict.items():
|
||||||
print(f'{colors.white}├─ {key}: {colors.green}{value}{colors.reset}')
|
print(f'{white}├─ {key}: {green}{value}{reset}')
|
||||||
|
|
||||||
|
|
||||||
def help(self):
|
def help(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user