Initial local commit

This commit is contained in:
Firepup Sixfifty 2023-10-23 17:10:07 -05:00
commit 61f81f1fe7
12 changed files with 7852 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.env

108
.replit Normal file
View file

@ -0,0 +1,108 @@
# The command that runs the program.
run = ["python3", "execute.py"]
# The primary language of the repl. There can be others, though!
language = "python3"
# The main file, which will be shown by default in the editor.
entrypoint = "ircbot.py"
# A list of globs that specify which files and directories should
# be hidden in the workspace.
hidden = ["*hide*",".config","venv","execute.py","keep_alive.py"]
# Specifies which nix channel to use when building the environment.
[nix]
channel = "stable-21_11"
# Per-language configuration: python3
[languages.python3]
# Treats all files that end with `.py` as Python.
pattern = "**/*.py"
# Tells the workspace editor to syntax-highlight these files as
# Python.
syntax = "python"
# The command needed to start the Language Server Protocol. For
# linting and formatting.
[languages.python3.languageServer]
start = ["pyls"]
# The command to start the interpreter.
[interpreter]
[interpreter.command]
args = [
"stderred",
"--",
"prybar-python3",
"-q",
"--ps1",
"\u0001\u001b[33m\u0002\u0001\u001b[00m\u0002 ",
"-i",
]
env = { LD_LIBRARY_PATH = "$PYTHON_LD_LIBRARY_PATH" }
# The environment variables needed to correctly start Python and use the
# package proxy.
[env]
VIRTUAL_ENV = "/home/runner/${REPL_SLUG}/venv"
PATH = "${VIRTUAL_ENV}/bin"
PYTHONPATH="${VIRTUAL_ENV}/lib/python3.8/site-packages"
REPLIT_POETRY_PYPI_REPOSITORY="https://package-proxy.replit.com/pypi/"
MPLBACKEND="TkAgg"
# Enable unit tests. This is only supported for a few languages.
[unitTest]
language = "python3"
# Add a debugger!
[debugger]
support = true
# How to start the debugger.
[debugger.interactive]
transport = "localhost:0"
startCommand = ["dap-python", "ircbot.py"]
# How to communicate with the debugger.
[debugger.interactive.integratedAdapter]
dapTcpAddress = "localhost:0"
# How to tell the debugger to start a debugging session.
[debugger.interactive.initializeMessage]
command = "initialize"
type = "request"
[debugger.interactive.initializeMessage.arguments]
adapterID = "debugpy"
clientID = "replit"
clientName = "replit.com"
columnsStartAt1 = true
linesStartAt1 = true
locale = "en-us"
pathFormat = "path"
supportsInvalidatedEvent = true
supportsProgressReporting = true
supportsRunInTerminalRequest = true
supportsVariablePaging = true
supportsVariableType = true
# How to tell the debugger to start the debuggee application.
[debugger.interactive.launchMessage]
command = "attach"
type = "request"
[debugger.interactive.launchMessage.arguments]
logging = {}
# Configures the packager.
[packager]
# Search packages in PyPI.
language = "python3"
# Never attempt to install `unit_tests`. If there are packages that are being
# guessed wrongly, add them here.
ignoredPackages = ["unit_tests"]
[packager.features]
enabledForHosting = false
# Enable searching packages from the sidebar.
packageSearch = true
# Enable guessing what packages are needed from the code.
guessImports = true

40
core.py Normal file
View file

@ -0,0 +1,40 @@
#!/usr/bin/python3
from os import system
from time import sleep
from sys import argv as args
from threading import Thread
call = "python3 -u ircbot.py"
def launch(server: str) -> None:
system(f"{call} {server}")
threads = {}
servers = [
"ircnow",
"replirc",
#"efnet",
]
def is_dead(thr):
thr.join(timeout=0)
return not thr.is_alive()
if __name__ == "__main__":
print("[LOG][CORE] Begin initialization")
for server in servers:
t = Thread(target=launch, args=(server,))
t.daemon = True
threads[server] = t
t.start()
print("[LOG][CORE] Started all instances. Idling...")
while 1:
sleep(10)
for server in threads:
t = threads[server]
if is_dead(t):
exit(f"[EXIT][CORE] The thread for {server} died")

20
eightball.txt Normal file
View file

@ -0,0 +1,20 @@
It is certain.
It is decidedly so.
Without a doubt.
Yes definitely.
You may rely on it.
As I see it, yes.
Most likely.
Outlook good.
Yes.
Signs point to yes.
Reply hazy, try again.
Ask again later.
Better not tell you now.
Cannot predict now.
Concentrate and ask again.
Don't count on it.
My reply is no.
My sources say no.
Outlook not so good.
Very doubtful.

367
ircbot.py Normal file
View file

@ -0,0 +1,367 @@
#!/usr/bin/python3
from time import sleep
from builtins import bytes as bbytes
import re, random as r, codecs
from sys import argv as args
from socket import socket, AF_INET, SOCK_STREAM
from os import environ as env
class bytes(bbytes):
"""Local override of builtin bytes class to add "lazy_decode\" """
def lazy_decode(e):
return str(e)[2:-1]
__version__ = "v1.0.2"
ircsock = socket(AF_INET, SOCK_STREAM)
botnick = "FireBot"
servers = {
"ircnow": {
"address": "localhost",
"port": 6601,
"channels": {"#random": 0, "#dice": 0, "#offtopic": 0, botnick: 0},
"admins": ["firepup", "firepup650", "h|thelounge"],
},
"efnet": {
"address": "irc.servercentral.net",
"channels": {"#random": 0, "#dice": 0, botnick: 0},
"admins": ["firepup", "h|tl"],
},
"replirc": {
"address": "localhost",
"pass": env["replirc_pass"],
"channels": {"#random": 0, "#dice": 0, "#main": 0, "#bots": 0, botnick: 0},
"admins": ["firepup", "firepup|lounge", "h|tl"],
},
}
gmode = False
server = args[1]
nicklen = 30
address = servers[server]["address"]
port = servers[server]["port"] if "port" in servers[server] else 6667
channels = servers[server]["channels"]
encoding = "UTF-8"
prefix = "."
rebt = "fire"
gblrebt = "all"
lrebt = 7 + len(rebt)
lgblrebt = 7 + len(gblrebt)
e = encoding
adminnames = servers[server]["admins"]
exitcode = f"bye {botnick.lower()}"
ircmsg = ""
np = re.compile(
"\[\x0303last\.fm\x03\] [A-Za-z0-9_]+ is listening to: \x02.+ - .+\x02 \([0-9]+ plays\)"
)
ESCAPE_SEQUENCE_RE = re.compile(
r"""
( \\U........ # 8-digit hex escapes
| \\u.... # 4-digit hex escapes
| \\x.. # 2-digit hex escapes
| \\[0-7]{1,3} # Octal escapes
| \\N\{[^}]+\} # Unicode characters by name
| \\[\\'"abfnrtv] # Single-character escapes
)""",
re.UNICODE | re.VERBOSE,
)
def decode_escapes(s):
def decode_match(match):
return codecs.decode(match.group(0), "unicode-escape")
return ESCAPE_SEQUENCE_RE.sub(decode_match, s)
def sucheck(message):
return re.search("^(su|sudo).*", message)
def joinserver():
global e, nicklen
ircsock.connect((address, port))
ircsock.send(bytes(f"USER {botnick} {botnick} {botnick} {botnick}\n", e))
ircsock.send(bytes(f"NICK {botnick}\n", e))
ircmsg = ""
while (
ircmsg.find("MODE " + botnick) == -1 and ircmsg.find("PRIVMSG " + botnick) == -1
):
ircmsg = ircsock.recv(2048).strip(b"\r\n").decode()
if ircmsg != "":
print(bytes(ircmsg.encode()).lazy_decode())
if ircmsg.find("NICKLEN=") != -1:
global nicklen
nicklen = int(ircmsg.split("NICKLEN=")[1].split(" ")[0])
print(f"[LOG][{server}] NICKLEN set to {nicklen}")
if ircmsg.find("Nickname is already in use") != -1:
print(f"[LOG][{server}] My nickname's in use? lemme try that again...")
ircsock.send(
bytes(f"USER {botnick} {botnick} {botnick} {botnick}\n", e)
)
ircsock.send(bytes(f"NICK {botnick}\n", e))
if ircmsg.find("PING :") != -1:
# pong = "PONG :" + input("Ping?:") + "\n"
# pong = pong.replace("\\\\", "\\")
pong = f"PONG :{ircmsg.split(':')[1]}\n"
print(pong, end="")
ircsock.send(bytes(pong, e))
if ircmsg.find("Closing Link") != -1:
print(f"[LOG][{server}] I tried.")
exit(f"[EXIT][{server}] Closing Link")
print(f"[LOG][{server}] Joined {server} successfully!")
def mfind(message: str, find: list, usePrefix: bool = True):
if usePrefix:
return any(message[: len(match) + 1] == prefix + match for match in find)
else:
return any(message[: len(match)] == match for match in find)
def ping(ircmsg):
pong = f"PONG :{ircmsg.split(':')[1]}\n"
ircsock.send(bytes(pong, e))
print(pong, end="")
def sendmsg(msg, target):
print(f"[LOG][{server}] Sending {bytes(msg.encode()).lazy_decode()} to {target}")
ircsock.send(bytes(f"PRIVMSG {target} :{msg}\n", e))
def notice(msg, target):
print(f"[LOG][{server}] Sending {bytes(msg.encode()).lazy_decode()} to {target} (NOTICE)")
ircsock.send(bytes(f"NOTICE {target} :{msg}\n", e))
def joinchan(chan: str, origin: str, chanList: dict, lock: bool = True):
chan = chan.replace(" ", "")
if "," in chan:
chans = chan.split(",")
for subchan in chans:
chanList = joinchan(subchan, origin, chanList)
return chanList
if chan.startswith("0"):
if origin != "null":
sendmsg("Refusing to join channel 0", origin)
return chanList
if chan in channels and lock:
if origin != "null":
sendmsg(f"I'm already in {chan}.", origin)
return chanList
ircsock.send(bytes(f"JOIN {chan}\n", e))
ircmsg = ""
while True:
ircmsg = ircsock.recv(2048).strip(b"\r\n").decode()
if ircmsg != "":
print(bytes(ircmsg.encode()).lazy_decode())
if ircmsg.find("PING :") != -1:
ping()
if ircmsg.find("No such channel") != -1:
print(f"[LOG][{server}] Joining {chan} failed (DM)")
if origin != "null":
sendmsg(f"{chan} is an invalid channel", origin)
break
elif ircmsg.find("Cannot join channel (+i)") != -1:
print(f"[LOG][{server}] Joining {chan} failed (Private)")
if origin != "null":
sendmsg(f"Permission denied to channel {chan}", origin)
break
elif ircmsg.find("End of") != -1:
print(f"[LOG][{server}] Joining {chan} succeeded")
if origin != "null":
sendmsg(f"Joined {chan}", origin)
chanList[chan] = 0
break
return chanList
def op(name, chan):
if name != "":
print(f"[LOG][{server}] Attempting op of {name}...")
ircsock.send(bytes(f"MODE {chan} +o {name}\n", e))
def main():
try:
global ircmsg, channels, e, gmode, prefix, rebt, gblrebt, lrebt, lgblrebt
joinserver()
if "pass" in servers[server]:
sendmsg(f"IDENTIFY {servers[server]['pass']}", "NickServ")
sleep(0.5)
for chan in channels:
joinchan(chan, "null", channels, False)
while 1:
global ircmsg, gmode
raw = bytes(ircsock.recv(2048).strip(b"\r\n"))
ircmsg = raw.decode()
if ircmsg != "":
print(raw.lazy_decode(), sep="\n")
if ircmsg.find("PRIVMSG") != -1:
# Format of ":[Nick]!~[hostname]@[IP Address] PRIVMSG [channel] :[message]”
name = ircmsg.split("!", 1)[0][1:]
helpErr = False
if (name.startswith("saxjax") and server == "efnet") or (
name == "ReplIRC" and server == "replirc"
):
if ircmsg.find("<") != -1 and ircmsg.find(">") != -1:
Nname = ircmsg.split("<", 1)[1].split(">", 1)[0].strip()
if name == "ReplIRC":
name = Nname[4:]
else:
name = Nname
message = ircmsg.split(">", 1)[1].strip()
helpErr = True
else:
message = ircmsg.split("PRIVMSG", 1)[1].split(":", 1)[1].strip()
else:
message = ircmsg.split("PRIVMSG", 1)[1].split(":", 1)[1].strip()
if name.endswith("dsc"):
helpErr = True
chan = ircmsg.split("PRIVMSG", 1)[1].split(":", 1)[0].strip()
print(
f'[LOG][{server}] Got "{bytes(message.encode()).lazy_decode()}" from "{name}" in "{chan}"'
)
if "goat" in name.lower() and gmode == True:
print(f"[LOG][{server}] GOAT DETECTED")
sendmsg("Hello Goat", chan)
gmode = False
if len(name) < nicklen and chan in channels:
channels[chan] += 1
elif len(name) > nicklen:
print(f"[LOG][{server}] Name too long ({len(name)} > {nicklen})")
continue
elif chan not in channels:
print(
f"[LOG][{server}] Channel not in channels ({chan} not in {channels})"
)
continue
if mfind(
message.lower(),
[f"hi {botnick.lower()}", f"hello {botnick.lower()}"],
False,
):
sendmsg(f"Hello {name}!", chan)
elif mfind(message, ["op me"], False) and name.lower() in adminnames:
op(name, chan)
elif mfind(message, ["amIAdmin"]):
sendmsg(
f"{name.lower()} in {adminnames} == {name.lower() in adminnames}",
chan,
)
elif mfind(message, ["help"]):
if not helpErr:
sendmsg("List of commands:", name)
sendmsg(f'Current prefix is "{prefix}"', name)
sendmsg(f"{prefix}help - Sends this help list", name)
sendmsg(f"{prefix}quote - Sends a random firepup quote", name)
sendmsg(
f"{prefix}(eightball,8ball,8b) [question]? - Asks the magic eightball a question",
name,
)
sendmsg(f"(hi,hello) {botnick} - The bot says hi to you", name)
if name.lower() in adminnames:
sendmsg(f"reboot {rebt} - Restarts the bot", name)
sendmsg(exitcode + " - Shuts down the bot", name)
sendmsg("op me - Makes the bot try to op you", name)
sendmsg(
f"{prefix}join [channel(s)] - Joins the bot to the specified channel(s)",
name,
)
else:
sendmsg("Sorry, I can't send help to bridged users.", chan)
elif name.lower() in adminnames and mfind(
message, ["goat.mode.activate"]
):
print(f"[LOG][{server}] GOAT DETECTION ACTIVATED")
gmode = True
elif name.lower() in adminnames and mfind(
message, ["goat.mode.deactivate"]
):
print(f"[LOG][{server}] GOAT DETECTION DEACTIVATED")
gmode = False
elif mfind(message, ["quote"]):
r.seed()
log = open("mastermessages.txt", "r")
q = log.readlines()
sel = decode_escapes(
str(r.sample(q, 1)).strip("[]'").replace("\\n", "").strip('"')
)
sendmsg(sel, chan)
log.close()
elif mfind(message, ["join "]) and name.lower() in adminnames:
newchan = message.split(" ")[1].strip()
channels = joinchan(newchan, chan, channels)
elif mfind(message, ["eightball", "8ball", "8b"]):
if message.endswith("?"):
log = open("eightball.txt", "r")
q = log.readlines()
sel = (
str(r.sample(q, 1))
.strip("[]'")
.replace("\\n", "")
.strip('"')
)
sendmsg(f"The magic eightball says: {sel}", chan)
log.close()
else:
sendmsg("Please pose a Yes or No question.", chan)
elif mfind(message, ["debug", "dbg"]) and name.lower() in adminnames:
sendmsg(f"[DEBUG] NICKLEN={nicklen}", chan)
sendmsg(f"[DEBUG] ADMINS={adminnames}", chan)
sendmsg(f"[DEBUG] CHANNELS={channels}", chan)
elif (
mfind(message, [f"reboot {rebt}", f"reboot {gblrebt}"], False)
and name.lower() in adminnames
):
for i in channels:
sendmsg("Rebooting...", i)
ircsock.send(bytes("QUIT\n", e))
__import__("os").system("python3 -u ircbot.py")
exit(f"[EXIT][{server}] Inner layer exited or crashed")
elif (
name.lower() in adminnames and message.rstrip().lower() == exitcode
):
sendmsg("oh...okay. :'(", chan)
for i in channels:
# print(f'[LOG][{server}] i="{i}" vs chan="{chan}"')
if i != chan.strip():
sendmsg("goodbye... :'(", i)
ircsock.send(bytes("QUIT \n", "UTF-8"))
print(f"[LOG][{server}] QUIT")
exit(f"[EXIT][{server}] goodbye ;'(")
# raise EOFError
elif sucheck(message):
if name.lower() in adminnames:
sendmsg("Error - system failure, contact system operator", chan)
elif "bot" in name.lower():
print(f"[LOG][{server}] lol, no.")
else:
sendmsg("Access Denied", chan)
elif np.search(message):
sendmsg(
f"f.sp {message.split(':')[1].split('(')[0].strip(' ')}", chan
)
elif message == "\x01VERSION\x01":
notice(f"\x01VERSION FireBot {__version__}\x01", name)
if chan in channels and channels[chan] >= 50:
r.seed()
channels[chan] = 0
log = open("mastermessages.txt", "r")
q = log.readlines()
sel = decode_escapes(
str(r.sample(q, 1)).strip("[]'").replace("\\n", "").strip('"')
)
sendmsg(sel, chan)
log.close()
else:
if ircmsg.find("PING") != -1:
ping(ircmsg)
if ircmsg.find("Closing Link") != -1:
exit(f"[EXIT][{server}] I got killed :'(")
except KeyboardInterrupt:
pass
if __name__ == "__main__":
main()

1
lastmsg.txt Normal file
View file

@ -0,0 +1 @@
:firepup!Firepup@owner.firepi PRIVMSG #main :pnp just auto fills my name in to np

2952
mastermessages.txt Normal file

File diff suppressed because it is too large Load diff

7
modres.sh Normal file
View file

@ -0,0 +1,7 @@
if [[ "${1}." = "." ]]; then
echo ERROR
else
rm -rf ~/${REPL_SLUG}/venv/${1}*
echo removed ${1}
fi

48
poetry.lock generated Normal file
View file

@ -0,0 +1,48 @@
# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand.
[[package]]
name = "apiclient"
version = "1.0.4"
description = "Framework for making good API client libraries using urllib3."
optional = false
python-versions = "*"
files = [
{file = "apiclient-1.0.4.tar.gz", hash = "sha256:2569c998191cd1a042beffa3cf7c1119277237b4ba1fa021d20c81fa98fa95e9"},
]
[package.dependencies]
certifi = "*"
urllib3 = "*"
[[package]]
name = "certifi"
version = "2023.7.22"
description = "Python package for providing Mozilla's CA Bundle."
optional = false
python-versions = ">=3.6"
files = [
{file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"},
{file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"},
]
[[package]]
name = "urllib3"
version = "2.0.6"
description = "HTTP library with thread-safe connection pooling, file post, and more."
optional = false
python-versions = ">=3.7"
files = [
{file = "urllib3-2.0.6-py3-none-any.whl", hash = "sha256:7a7c7003b000adf9e7ca2a377c9688bbc54ed41b985789ed576570342a375cd2"},
{file = "urllib3-2.0.6.tar.gz", hash = "sha256:b19e1a85d206b56d7df1d5e683df4a7725252a964e3993648dd0fb5a1c157564"},
]
[package.extras]
brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"]
socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
zstd = ["zstandard (>=0.18.0)"]
[metadata]
lock-version = "2.0"
python-versions = "^3.8"
content-hash = "d898d42f2b96c8196a511265cc86c26766a6a4b8ac7d5a2799f129c5a74bd870"

15
pyproject.toml Normal file
View file

@ -0,0 +1,15 @@
[tool.poetry]
name = "Repl_IRC_Bot"
version = "0.1.0"
description = "A bot I made for irc chats"
authors = ["Firepup Sixfifty <firepup650@gmail.com>"]
[tool.poetry.dependencies]
python = "^3.8"
apiclient = "^1.0.4"
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

18
replit.nix Normal file
View file

@ -0,0 +1,18 @@
{ pkgs }: {
deps = [
pkgs.python38Full
];
env = {
PYTHON_LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [
# Neded for pandas / numpy
pkgs.stdenv.cc.cc.lib
pkgs.zlib
# Needed for pygame
pkgs.glib
# Needed for matplotlib
pkgs.xorg.libX11
];
PYTHONBIN = "${pkgs.python38Full}/bin/python3.8";
LANG = "en_US.UTF-8";
};
}

4275
replit_zip_error_log.txt Normal file

File diff suppressed because it is too large Load diff