Compare commits

..

1 commit
main ... main

11 changed files with 94 additions and 304 deletions

View file

@ -1,10 +0,0 @@
name: Check syntax
on: [push,workflow_dispatch]
jobs:
check:
runs-on: debian-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
- run: python -m py_compile sweebot.py
- run: jshint script.js

17
cc/give
View file

@ -1,28 +1,21 @@
from sys import argv from sys import argv
import sqlite3 import sqlite3
import re
conn = sqlite3.connect("/home/sweebotirc/sbirc.db") conn = sqlite3.connect("/home/sweebotirc/sbirc.db")
database = conn.cursor() database = conn.cursor()
def getperms(mask: str): def getperms(cloak: str):
try: try:
database.execute(f"SELECT * FROM users;") database.execute("SELECT * FROM users WHERE username = '"+ cloak + "';")
output = database.fetchall() output = database.fetchall()
for i in output: return output[0][1]
if re.match(i[0].replace("*", ".+"), mask):
return i[1]
return ''
except: except:
print(traceback.format_exc())
return '' return ''
if argv[2] == "full": if getperms(argv[2]) == "full":
if len(argv) == 5: if len(argv) == 5:
if argv[3] == argv[2]: if argv[3] == argv[2]:
print(argv[1] + ": You wanna give yourself permissions!?") print(argv[1] + ": You wanna give yourself permissions!?")
else: else:
perms = getperms(argv[3]) perms = getperms(argv[3])
if argv[4] in perms: if perms != "":
print("The specified user already has these permissions.")
elif perms != "":
database.execute("UPDATE users SET perms = '" + perms + "," + argv[4] + "' WHERE username = '" + argv[3] + "';") database.execute("UPDATE users SET perms = '" + perms + "," + argv[4] + "' WHERE username = '" + argv[3] + "';")
print(argv[1] + ": Successfully appended '" + argv[4] + "' to the permissions of " + argv[3]) print(argv[1] + ": Successfully appended '" + argv[4] + "' to the permissions of " + argv[3])
else: else:

View file

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/python3
from random import choice from random import choice
opinions = ["Oreos are better than Chips Ahoy!", "Human baka, be furry!", "Cereal goes before milk!", "Cereal goes before milk, but what if I pour cereal before bowl? Answer: Chaos!", "Protogens don't run on swap, 1TB of physical RAM!", "Generative AI sucks.", "Y'know, we've all fought about cereal going before milk, but nobody discussed about if choccy powder goes before milk!! ;-;"] opinions = ["Oreos are better than Chips Ahoy!", "Human baka, be furry!", "Cereal goes before milk!", "Cereal goes before milk, but what if I pour cereal before bowl? Answer: Chaos!", "Protogens don't run on swap, 1TB of physical RAM!", "Generative AI sucks."]
print(choice(opinions)) print(choice(opinions))

View file

@ -1,7 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/python3
import sweecrypt import sweecrypt
from sys import argv from sys import argv
if argv[3][:2] == "-s": print(sweecrypt.decrypt(" ".join(argv[3:])))
print(sweecrypt.decrypt(" ".join(argv[4:]), int(argv[3][2:])))
else:
print(sweecrypt.decrypt(" ".join(argv[3:])))

View file

@ -1,7 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/python3
import sweecrypt import sweecrypt
from sys import argv from sys import argv
if argv[3][:2] == "-s": print(sweecrypt.encrypt(" ".join(argv[3:])))
print(sweecrypt.encrypt(" ".join(argv[4:]), int(argv[3][2:])))
else:
print(sweecrypt.encrypt(" ".join(argv[3:])))

View file

@ -11,11 +11,6 @@
<br> <br>
<br> <br>
<a class="download" style="background: #027ef9;" title="Refresh stats" onclick="refresh();"><img src="https://swee.codes/icons/refresh.svg"></a> <a class="download" style="background: #027ef9;" title="Refresh stats" onclick="refresh();"><img src="https://swee.codes/icons/refresh.svg"></a>
<hr>
<h1>Last AI Request:</h1>
<br>
<br>
<div width="100%" id="aichat">...</div>
</center> </center>
<script src="script.js"></script> <script src="script.js"></script>
</body> </body>

View file

@ -1,22 +0,0 @@
Configure the bot for the channel. Requires the "full" perms. (will be allowed by chanops soon)
Use +FLAG to enable a disabled-by-default, and -FLAG vice versa.
Available flags:
* multiline - be able to print multiline output (enabled default)
* colonthree - make the bot say ":3" when someone's message starts with ":3" (enabled default)
* :3c - oh weawwy? :3c (DISABLED default, overriden by colonthree)
* links - parse titles of links sent by users (DISABLED default)
* sed - parse sed expressions without the need of $sed command (DISABLED default)
* config - placeholder, do not modify.
---
Syntax:
```
$config [FLAG] [FLAG] - Apply one or more flags
$config clear - Clear all flags
$config - list all flags in the channel
```

View file

@ -1 +1,11 @@
Documentation for $config can now be found in https://irc-bot.swee.codes/docs/config Configure the bot for the channel. Requires the "full" perms. (will be allowed by chanops soon)
Use +FLAG to enable a disabled-by-default, and -FLAG vice versa.
Available flags:
multiline - be able to print multiline output (enabled default)
colonthree - make the bot say ":3" when someone's message starts with ":3" (enabled default)
links - parse titles of links sent by users (DISABLED default)
(the config flag is a placeholder, do not change it)
syntax:
> $config [FLAG] [FLAG] - Apply one or more flags
> $config clear - Clear all flags
> $config - list all flags in the channel

View file

@ -1 +1 @@
Pulls the latest version of MeowNexUS IRC from its Git repository. requires the "git" permissions. Pulls the latest version of sweeBot from its Git repository. requires the "git" permissions.

View file

@ -1,4 +1,3 @@
/*jshint esversion: 8 */
// Fetching the run value for the first time // Fetching the run value for the first time
fetch ("run.txt") fetch ("run.txt")
.then(x => x.text()) .then(x => x.text())
@ -10,26 +9,19 @@ fetch ("block.txt")
fetch ("link.txt") fetch ("link.txt")
.then(x => x.text()) .then(x => x.text())
.then(y => document.getElementById("links").innerHTML = y); .then(y => document.getElementById("links").innerHTML = y);
fetch ("lastquery.txt")
.then(x => x.text())
.then(y => document.getElementById("aichat").innerHTML = y);
async function refresh(){ async function refresh(){
// Refresh the HTML to show the spinners // Refresh the HTML to show the spinners
document.getElementById("run").innerHTML = "..."; document.getElementById("run").innerHTML = "..."
document.getElementById("blocked").innerHTML = "..."; document.getElementById("blocked").innerHTML = "..."
document.getElementById("links").innerHTML = "..."; document.getElementById("links").innerHTML = "..."
document.getElementById("aichat").innerHTML = "...";
// Then fetch the values the same way as on the first part of the script. // Then fetch the values the same way as on the first part of the script.
fetch ("run.txt") fetch ("run.txt")
.then(x => x.text()) .then(x => x.text())
.then(y => document.getElementById("run").innerHTML = y); .then(y => document.getElementById("run").innerHTML = y)
fetch ("block.txt") fetch ("block.txt")
.then(x => x.text()) .then(x => x.text())
.then(y => document.getElementById("blocked").innerHTML = y); .then(y => document.getElementById("blocked").innerHTML = y);
fetch ("link.txt") fetch ("link.txt")
.then(x => x.text()) .then(x => x.text())
.then(y => document.getElementById("links").innerHTML = y); .then(y => document.getElementById("links").innerHTML = y);
fetch ("lastquery.txt")
.then(x => x.text())
.then(y => document.getElementById("aichat").innerHTML = y);
} }

View file

@ -1,4 +1,4 @@
__version__ = "0.0.2 Funni update" + ". https://git.swee.codes/swee/MeowNex" __version__ = "0.0.2 Funni update" + ". https://git.swee.codes/MeowNex"
import socket import socket
import subprocess import subprocess
from time import sleep, time, ctime from time import sleep, time, ctime
@ -10,28 +10,16 @@ from random import choice, randint as random, randrange
import traceback import traceback
import threading import threading
from pathlib import Path from pathlib import Path
from urllib.parse import urlparse, parse_qs
from requests import get, exceptions as rex from requests import get, exceptions as rex
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from googleapiclient.discovery import build from googleapiclient.discovery import build
from characterai import pycai
import uuid
CAItoken = environ["CAItoken"]
CAImodel = environ["CAIchara"]
try:
cai = pycai.Client(CAItoken)
me = cai.get_me()
chats = []
except:
print(traceback.format_exc())
run = 0 run = 0
block = 0 block = 0
parsed = 0 parsed = 0
lastquery = "None yet."
# Dashboard thread # Dashboard thread
from flask import Flask, send_file, abort as abrt, redirect as redir from flask import Flask, send_file
app = Flask(__name__) app = Flask(__name__)
responses_ai = {} # {uuid: response}
@app.route('/') @app.route('/')
def index_html(): def index_html():
@ -48,52 +36,22 @@ def parses():
@app.route('/script.js') @app.route('/script.js')
def script_js(): def script_js():
return send_file("script.js", mimetype='application/javascript') return send_file("script.js", mimetype='application/javascript')
@app.route('/lastquery.txt')
def lastquery_txt():
return str(lastquery)
@app.route('/docs/config')
def config_docs():
return redir("https://git.swee.codes/swee/MeowNex/src/branch/main/docs/config.md")
@app.route('/response/<uuidd>')
def ai_response_truncate(uuidd):
if uuidd in responses_ai:
res = responses_ai[uuidd]
return f'<title>AI response {uuidd}</title>\n<meta name="viewport" content="width=device-width, initial-scale=1.0">\n<link rel="stylesheet" href="https://swee.codes/style.css" type="text/css">\n<body><center><h1>AI response {uuidd}</h1><br><br><div class=code width="100%" style="word-wrap: break-word;white-space: pre;text-align: left;">' + res
else:
abrt(404)
threading.Thread(target=app.run, daemon=True, kwargs={"port": 2005}).start() threading.Thread(target=app.run, daemon=True, kwargs={"port": 2005}).start()
# YouTube API
DEVELOPER_KEY = environ["ytapi"] DEVELOPER_KEY = environ["ytapi"]
headers = { headers = {
'User-Agent': 'MeowNexUS IRC ' + __version__ 'User-Agent': 'SweeBot IRC ' + __version__
} }
def get_yt_id(url):
query = urlparse(url)
# youtu.be already contains the ID in the path
if query.hostname == 'youtu.be': return query.path[1:]
if query.hostname in {'www.youtube.com', 'youtube.com', 'music.youtube.com'}:
# URLs that have the ID in the path instead of the query.
integrated_in_url = ["watch", "embed", "v", "shorts"]
try:
# The regular /watch path, which stores the ID in the query.
if query.path == '/watch': return parse_qs(query.query)['v'][0]
# Alternatively, it will get the ID in the path if the path was in the list above.
elif query.path.split('/')[1] in integrated_in_url: return query.path.split('/')[2]
except:
return None
class config: class config:
def __init__(self): def __init__(self):
self.conn = sqlite3.connect(environ["SBconfig"]) self.conn = sqlite3.connect(environ["SBconfig"])
self.database = self.conn.cursor() self.database = self.conn.cursor()
def perms(self, mask: str): def perms(self, cloak: str):
try: try:
self.database.execute(f"SELECT * FROM users;") self.database.execute(f"SELECT * FROM users WHERE username = ?;", [cloak])
output = self.database.fetchall() output = self.database.fetchall()
for i in output: return output[0][1]
if re.match(i[0].replace("*", ".+"), mask):
return i[1]
return ''
except: except:
print(traceback.format_exc()) print(traceback.format_exc())
return '' return ''
@ -163,11 +121,6 @@ def humanbytes(B):
return '{0:.2f}GB'.format(B / GB) return '{0:.2f}GB'.format(B / GB)
elif TB <= B: elif TB <= B:
return '{0:.2f}TB'.format(B / TB) return '{0:.2f}TB'.format(B / TB)
def rplce(text, old, new, n):
parts = text.split(old)
if len(parts) <= n:
return text # Not enough occurrences to replace
return old.join(parts[:n]) + new + old.join(parts[n:])
def replace_color_codes(text): def replace_color_codes(text):
def replacer(match): def replacer(match):
code = match.group(0) code = match.group(0)
@ -218,7 +171,7 @@ class bot_irc:
self.irc_socket.send( self.irc_socket.send(
bytes( bytes(
"USER " + bot_nick + " " + bot_nick + " " + bot_nick + " :MeowNexUS, a very cool bot made by Swee :3\n", "USER " + bot_nick + " " + bot_nick + " " + bot_nick + " :SweeBot, a very cool bot made by Swee :3\n",
"UTF-8", "UTF-8",
) )
) )
@ -271,12 +224,9 @@ pats = ["-w-", "Meep...", "Prr!"]
meows_happy = ['Meow!', 'Nyaa~', 'Mrow.', 'Prr! :3', "Mrrp?", "Mreow.", "!woeM", "3: !rrP", "~aayN", "Mew!", "Moew!"] meows_happy = ['Meow!', 'Nyaa~', 'Mrow.', 'Prr! :3', "Mrrp?", "Mreow.", "!woeM", "3: !rrP", "~aayN", "Mew!", "Moew!"]
meows_upset = ['Hiss!', "!ssiH", "Grrr..."] meows_upset = ['Hiss!', "!ssiH", "Grrr..."]
my_self = ["MeowNexUS", "MeowNexU5", "MeowN3xUS"] my_self = ["MeowNexUS", "MeowNexU5", "MeowN3xUS"]
logs = {} # {channel: [line, line]} max 10 lines
happiness = 5 happiness = 5
global times global times
times = 0 times = 0
ai_storage = {}
emoticons = {";3": "I think you forgot to press shift", ":#": "Wait no, don't hold shift THAT long!"}
def irci2(): def irci2():
irc2.connect_irc( irc2.connect_irc(
server_irc, port_irc, channel_irc, "sweeB0t", botpass_irc, botnickpass_irc + "/B" server_irc, port_irc, channel_irc, "sweeB0t", botpass_irc, botnickpass_irc + "/B"
@ -354,9 +304,8 @@ while True:
channel = text.split("PRIVMSG")[1].split(" ")[1] channel = text.split("PRIVMSG")[1].split(" ")[1]
nick = text.split(" ")[0][1:].split("!")[0] nick = text.split(" ")[0][1:].split("!")[0]
username = text.split(" ")[0][1:].split("@")[1] username = text.split(" ")[0][1:].split("@")[1]
mask = text.split(" ")[0][1:]
try: try:
perms = sbconfig.perms(mask) perms = sbconfig.perms(username)
except: except:
perms = "" perms = ""
print(command) print(command)
@ -364,65 +313,15 @@ while True:
print(nick) print(nick)
print(username) print(username)
print(perms) print(perms)
cont = " ".join(command)
if not channel in logs:
logs[channel] = [{"nick": nick, "content": cont}]
else:
logs[channel].append({"nick": nick, "content": cont})
if len(logs[channel]) > 128: logs[channel] = logs[channel][::-1][:128][::-1]
#open("log-text-"+channel, "a").write(" ".join(command) + "\n") #open("log-text-"+channel, "a").write(" ".join(command) + "\n")
#open("log-name-"+channel, "a").write(nick + "\n") #open("log-name-"+channel, "a").write(nick + "\n")
except: except:
print(traceback.format_exc()) #print(traceback.format_exc())
def replased(expression):
if channel in logs:
try:
if expression.split("/")[0].lower() != "s": raise IndexError()
find = expression.split("/")[1]
replace = expression.split("/")[2]
user = None
repeat = False
index = 1
try:
extraflags = expression.split("/")[3:]
for i in extraflags:
if i.strip() == "":
pass pass
elif i.lower() == "g":
repeat = True
elif i.strip().isdigit():
print(f"index = {int(i)}")
index = int(i)
else:
print(f"user = {i.lower()}")
user = i.lower()
except: pass
cache = None
for i in logs[channel][::-1]:
if find in i["content"] and (user == None or i["nick"].lower() == user):
cache = i
break
if cache == None:
raise Exception("The specified text couldn't be found")
else:
if repeat:
cache["content"] = cache["content"].replace(find, replace)
else:
cache["content"] = rplce(cache["content"], find, replace, index)
cachenick = cache["nick"]
cachecontent = cache["content"]
multiline(f"[RPL] <{cachenick}> {cachecontent}", channel)
except IndexError:
irc.send_irc(channel, nick + ": [ERR] Sed expression might be incorrectly written!")
except Exception as ex:
irc.send_irc(channel, nick + ": [ERR] " + str(ex))
else:
irc.send_irc(channel, nick + ": [!!!] No logs saved in " + channel)
try: try:
#if True: #if True:
if "PRIVMSG" in text and not nick in my_self: if "PRIVMSG" in text and not nick in my_self:
if "PRIVMSG" in text and command[0][0] == "$": if "PRIVMSG" in text and command[0][0] == "$":
logs[channel] = logs[channel][:-1]
run+=1 run+=1
if command[0] == "$ping": if command[0] == "$ping":
if random(1,2) == 1: if random(1,2) == 1:
@ -454,9 +353,9 @@ while True:
elif command[0] == "$whoami": elif command[0] == "$whoami":
if perms != "": if perms != "":
irc.send_irc(channel, nick + ": " + mask + " (Your hostmask has permissions, use the 'perms' command to see)") irc.send_irc(channel, nick + ": " + username + " (Your cloak has permissions, use the 'perms' command to see)")
else: else:
irc.send_irc(channel, nick + ": " + mask) irc.send_irc(channel, nick + ": " + username)
elif command[0] == "$welcome": elif command[0] == "$welcome":
name = nick if not len(command) > 1 else " ".join(command[1:]) name = nick if not len(command) > 1 else " ".join(command[1:])
@ -468,9 +367,9 @@ while True:
elif command[0] == "$perms": elif command[0] == "$perms":
if len(command) == 2: if len(command) == 2:
if sbconfig.perms(command[1]) != "": if sbconfig.perms(command[1]) != "":
irc.send_irc(channel, nick + ": permissions of hostmask " + command[1] + ": " + sbconfig.perms(command[1])) irc.send_irc(channel, nick + ": permissions of cloak " + command[1] + ": " + sbconfig.perms(command[1]))
else: else:
irc.send_irc(channel, nick + ": The hostmask wildcard " + command[1] + " Doesn't have permissions.") irc.send_irc(channel, nick + ": The cloak " + command[1] + " Doesn't have permissions.")
else: else:
if perms != "": if perms != "":
irc.send_irc(channel, nick + ": " + perms) irc.send_irc(channel, nick + ": " + perms)
@ -493,7 +392,8 @@ while True:
ossystem("git fetch") ossystem("git fetch")
ossystem("git pull") ossystem("git pull")
irc.send_irc(channel, nick + ": Pulled from Git, restarting bot...") irc.send_irc(channel, nick + ": Pulled from Git, restarting bot...")
restart() sleep(1)
ossystem("sudo systemctl restart sweebot")
else: else:
irc.send_irc(channel, nick + ": Permission denied.") irc.send_irc(channel, nick + ": Permission denied.")
block+=1 block+=1
@ -540,45 +440,7 @@ while True:
block+=1 block+=1
run-=1 run-=1
elif command[0] == "$ai-chat":
try:
aiconnector = cai.connect()
chatquery = f"--Listen Up--\nYour happiness level is {happiness} (Maximum 10), your emotion level will impact the conversation's tone.\n--END Listen Up--\n--IRC recieve--\n<{nick}> " + " ".join(command[1:])
if channel in ai_storage:
aimsg = aiconnector.send_message(CAImodel, ai_storage[channel], chatquery)
else:
new, answer = aiconnector.new_chat(
CAImodel, me.id
)
aimsg = aiconnector.send_message(CAImodel, new.chat_id, chatquery)
ai_storage[channel] = new.chat_id
randomname = str(uuid.uuid4())
responses_ai[randomname] = aimsg.text
mtline = ""
lastquery = f"<p>Channel: {channel}</p><p>Request:</p><br><br><textarea class=code width=100% spellcheck=\"false\" autocapitalize=\"off\" autocomplete=\"off\" autocorrect=\"off\" readonly=\"true\">{chatquery}</textarea><hr><p>Response</p><br><br><textarea class=code width=100% spellcheck=\"false\" autocapitalize=\"off\" autocomplete=\"off\" autocorrect=\"off\" readonly=\"true\">{aimsg.text}</textarea>"
broke = False
for num, i in enumerate(aimsg.text.split("\n")):
if num == 5:
broke = True
break
elif len(i) > 256:
mtline += "\n" + i[:256] + "..."
broke = True
else:
mtline += "\n" + i
if broke:
mtline += f"\nView full response: https://irc-bot.swee.codes/response/{randomname}"
multiline(mtline, channel)
except:
multiline("Something went wrong while connecting to Character.AI.", channel)
print(traceback.format_exc())
elif command[0] == "$ai-clear":
if channel in ai_storage:
del ai_storage[channel]
multiline("Done.", channel)
else:
multiline(f"There is no existing AI conversation in {channel}", channel)
elif command[0] == "$socket": elif command[0] == "$socket":
if perms == "full": if perms == "full":
if len(command) > 1: if len(command) > 1:
@ -596,24 +458,14 @@ while True:
elif command[0] == "$patpat" or command[0] == "$headpat": elif command[0] == "$patpat" or command[0] == "$headpat":
if len(command) == 2: if len(command) == 2:
if int(command[1]) < 50:
for i in range(0,int(command[1])): for i in range(0,int(command[1])):
happiness += (1 if happiness != 10 else 0) happiness += (1 if happiness != 10 else 0)
else:
happiness = 10
elif len(command) == 1: elif len(command) == 1:
happiness += (1 if happiness != 10 else 0) happiness += (1 if happiness != 10 else 0)
if len(command) != 2 or int(command[1]) < 50:
multiline(choice(pats) + " (Emotion: Upset " + multiline(choice(pats) + " (Emotion: Upset " +
("#" * int(happiness)) + ("#" * int(happiness)) +
("-" * int(10-happiness)) + " Happy)", ("-" * int(10-happiness)) + " Happy)",
channel) channel)
else:
multiline("Okay that's enough!!" + " (Emotion: Upset " +
("#" * int(happiness)) +
("-" * int(10-happiness)) + " Happy)",
channel)
elif command[0] == "$emotion": elif command[0] == "$emotion":
multiline("Emotion: Upset " + multiline("Emotion: Upset " +
("#" * int(happiness)) + ("#" * int(happiness)) +
@ -621,23 +473,14 @@ while True:
channel) channel)
elif command[0] == "$bap": elif command[0] == "$bap":
if len(command) == 2: if len(command) == 2:
if int(command[1]) < 50:
for i in range(0,int(command[1])): for i in range(0,int(command[1])):
happiness -= (1 if happiness != 0 else 0) happiness -= (1 if happiness != 0 else 0)
else:
happiness = 0
elif len(command) == 1: elif len(command) == 1:
happiness -= (1 if happiness != 0 else 0) happiness -= (1 if happiness != 0 else 0)
if len(command) != 2 or int(command[1]) < 50:
multiline(choice(baps) + " (Emotion: Upset " + multiline(choice(baps) + " (Emotion: Upset " +
("#" * int(happiness)) + ("#" * int(happiness)) +
("-" * int(10-happiness)) + " Happy)", ("-" * int(10-happiness)) + " Happy)",
channel) channel)
else:
multiline("Okay that's enough!!" + " (Emotion: Upset " +
("#" * int(happiness)) +
("-" * int(10-happiness)) + " Happy)",
channel)
elif command[0] == "$meow": elif command[0] == "$meow":
if random(1,100) > (happiness*10): if random(1,100) > (happiness*10):
multiline(choice(meows_upset), channel) multiline(choice(meows_upset), channel)
@ -662,7 +505,7 @@ while True:
elif command[0] == "$version": elif command[0] == "$version":
irc.send_irc(channel, "This is MeowNexUS IRC " + __version__) irc.send_irc(channel, "This is SweeBot " + __version__)
elif command[0] == "$figlet": elif command[0] == "$figlet":
if not sbconfig.cflagexist(channel, "-multiline"): if not sbconfig.cflagexist(channel, "-multiline"):
@ -720,10 +563,14 @@ while True:
elif command[0] == "$sed": elif command[0] == "$sed":
if len(command) == 2: if len(command) > 1:
replased(" ".join(command[1:])) try:
#if True:
raise Exception("WorkInProgress!!!")
except:
print(traceback.format_exc())
else: else:
irc.send_irc(channel, nick + ": [???] This command takes only one argument.") irc.send_irc(channel, nick + ": What to correct?")
elif command[0] == "$config": elif command[0] == "$config":
@ -779,7 +626,7 @@ while True:
comm = command comm = command
com.append("cc/" + comm[0][1:]) com.append("cc/" + comm[0][1:])
com.append(nick) com.append(nick)
com.append(perms) com.append(username)
comm.pop(0) comm.pop(0)
for i in comm: for i in comm:
com.append(i) com.append(i)
@ -795,38 +642,15 @@ while True:
elif command[0] == ":3": elif command[0] == ":3":
if not sbconfig.cflagexist(channel, "-colonthree"): if not sbconfig.cflagexist(channel, "-colonthree"):
irc.send_irc(channel, ":3") irc.send_irc(channel, ":3")
elif command[0] in emoticons:
if not sbconfig.cflagexist(channel, "-colonthree"):
irc.send_irc(channel, emoticons[command[0]])
elif ":3c" in command: elif ":3c" in command:
if sbconfig.cflagexist(channel, "+:3c") or not sbconfig.cflagexist(channel, "-colonthree"): if not sbconfig.cflagexist(channel, "-colonthree"):
multiline(choice(threes), channel) multiline(channel, choice(threes))
elif command[0][:2].lower() == "s/":
logs[channel] = logs[channel][:-1]
if sbconfig.cflagexist(channel, "+sed"):
replased(" ".join(command))
# try to parse and find a link # try to parse and find a link
if sbconfig.cflagexist(channel, "+links"): if sbconfig.cflagexist(channel, "+links"):
try: try:
for i in command: for i in command:
parse = urlparse(i) if i[:8] == "https://":
if parse.scheme in ["http", "https"]:
try: try:
if parse.hostname in ["youtube.com", "youtu.be", "www.youtube.com", "m.youtube.com", "youtube-nocookie.com"] and get_yt_id(i) != None:
try:
video_id = get_yt_id(i)
youtube = build('youtube', 'v3', developerKey=DEVELOPER_KEY)
request = youtube.videos().list(part='snippet,statistics', id=video_id)
details = request.execute()
title = details['items'][0]['snippet']['title']
channel_yt = details['items'][0]['snippet']['channelTitle']
views = details['items'][0]['statistics']['viewCount']
multiline(f"({nick}) [▶️ YouTube] {title} | Author: {channel_yt} | {views} Views", channel)
except Exception as ex:
multiline("(" + nick + ") [YouTube Error, is it a valid YouTube URL?]", channel)
print(traceback.format_exc())
else:
e = get(i, headers=headers, timeout=10) e = get(i, headers=headers, timeout=10)
header = e.headers header = e.headers
content_type = header.get('content-type').split(";")[0] content_type = header.get('content-type').split(";")[0]
@ -844,6 +668,20 @@ while True:
multiline("(" + nick + ") [SSL Error: " + str(ex.message) + "]", channel) multiline("(" + nick + ") [SSL Error: " + str(ex.message) + "]", channel)
except Exception as ex: except Exception as ex:
multiline("(" + nick + ") [Request error: " + str(ex.message) + "]", channel) multiline("(" + nick + ") [Request error: " + str(ex.message) + "]", channel)
elif i[:7] == "http://":
e = get(i, headers=headers, timeout=10)
header = e.headers
content_type = header.get('content-type').split(";")[0]
content_len = header.get('Content-length')
if content_type in allowedparse:
if e.ok:
soup = BeautifulSoup(e.text, 'html.parser')
multiline("(" + nick + ") " + (" ".join(soup.title.string.splitlines())[:100] if soup.title != None else "[No title provided]"), channel)
else:
multiline("(" + nick + ") [HTTP " + str(e.status_code) + "]", channel)
else:
multiline("(" + nick + ") [" + humanbytes(content_len) + " " + str(content_type) + "]", channel)
parsed += 1
except: except:
print(traceback.format_exc()) print(traceback.format_exc())
elif "JOIN" in text and "#nixsanctuary" in text: elif "JOIN" in text and "#nixsanctuary" in text: