modulated

This commit is contained in:
therealvorteckz 2023-10-12 10:15:55 -07:00
parent d12e7106a7
commit d60395c76f
4 changed files with 1118 additions and 0 deletions

22
config.py Normal file
View File

@ -0,0 +1,22 @@
class config:
class irc:
server = 'irc.supernets.org'
port = 6697
username = 'vortex'
realname = 'FightBot by vorteckz'
nickname = 'FightBot'
channel = '#vorteckz'
channelkey = 'test'
password = None
ssl = True
v6 = 2
vhost = None
admins = {'vortex', 'vorteckz','acidvegas','peanuter'}
class throttle:
cmd = 0.5
msg = 0.5
reconnect = 10
rejoin = 3
last = 0
slow = False
lastnick = None

742
functions.py Normal file
View File

@ -0,0 +1,742 @@
import sqlite3
import logging
import logging.handlers
import random
from time import sleep
from config import config
import irc
bold = '\x02'
italic = '\x1D'
underline = '\x1F'
reverse = '\x16'
reset = '\x0f'
white = '00'
black = '01'
blue = '02'
green = '03'
red = '04'
brown = '05'
purple = '06'
orange = '07'
yellow = '08'
light_green = '09'
cyan = '10'
light_cyan = '11'
light_blue = '12'
pink = '13'
grey = '14'
light_grey = '15'
def createtable():
c.execute('''CREATE TABLE if not exists users (
name text unique,
level integer,
experience integer,
health integer,
attack integer,
defense integer,
money integer,
healthmax integer
)''')
c.execute('''CREATE TABLE if not exists weapons (
name text unique,
weaponheld integer,
clip integer,
ammunition integer,
expire integer
)''')
c.execute('''CREATE TABLE if not exists items (
name text unique,
bandages integer
)''')
c.execute('''CREATE TABLE if not exists stats (
name text unique,
kills integer,
deaths integer
)''')
def color(msg: str, foreground: str, background: str='') -> str:
'''
Color a string with the specified foreground and background colors.
:param msg: The string to color.
:param foreground: The foreground color to use.
:param background: The background color to use.
'''
return f'\x03{foreground},{background}{msg}{reset}' if background else f'\x03{foreground}{msg}{reset}'
class Users:
def __init__(self, name, level, experience, health, attack, defense, money, healthmax):
self.name = name
self.level = level
self.experience = experience
self.health = health
self.attack = attack
self.defense = defense
self.money = money
self.healthmax = healthmax
class Weapons:
def __init__(self, name, weaponheld, clip, ammunition):
self.name = name
self.weaponheld = weaponheld
self.clip = clip
self.ammunition = ammunition
self.expire = 0
class Items:
def __init__(self, name, bandages):
self.name = name
self.bandages = bandages
conn = sqlite3.connect('data.db')
c = conn.cursor()
async def checkexist(player):
c.execute(f"SELECT rowid FROM users WHERE name=(:name)", {'name': player})
data=c.fetchone()
if data is None:
return f'Invalid Player: %s'%player
else:
return True
async def addkillstat(name):
c.execute(f'SELECT rowid FROM stats WHERE name=(:name)', {'name': name})
checkrow=c.fetchone()
if checkrow == None:
kills = 1
deaths = 0
c.execute(f'INSERT OR REPLACE INTO stats VALUES (:name, :kills, :deaths)', {'name': name, 'kills': kills, 'deaths': deaths})
conn.commit()
await irc.bot.sendmsg(config.irc.channel, f'[Player {color(name, light_green)} has a total of {color(kills, red)} kills!]')
else:
c.execute(f'SELECT * FROM stats WHERE name=(:name)', {'name': name})
getkills=c.fetchall()
for retrieve in getkills:
kills = retrieve[1] + 1
c.execute(f'UPDATE stats SET KILLS = (:kills) WHERE name=(:name)', {'kills': kills, 'name': name})
conn.commit()
await irc.bot.sendmsg(config.irc.channel, f'[Player {color(name, light_green)} has a total of {color(kills, red)} kills!]')
async def adddeathstat(name):
c.execute(f'SELECT rowid FROM stats WHERE name=(:name)', {'name': name})
checkrow=c.fetchone()
if checkrow == None:
kills = 0
deaths = 1
c.execute(f'INSERT OR REPLACE INTO stats VALUES (:name, :kills, :deaths)', {'name': name, 'kills': kills, 'deaths': deaths})
conn.commit()
await irc.bot.sendmsg(config.irc.channel, f'[Opponent Player {color(name, red)} has died {color(deaths, red)} times!]')
else:
c.execute(f'SELECT * FROM stats WHERE name=(:name)', {'name': name})
getkills=c.fetchall()
for retrieve in getkills:
kills = retrieve[1]
deaths = retrieve[2] + 1
c.execute(f'UPDATE stats SET DEATHS = (:deaths) WHERE name=(:name)', {'deaths': deaths, 'name': name})
conn.commit()
sleep(3)
await irc.bot.sendmsg(config.irc.channel, f'[Player {color(name, red)} has died {color(deaths, red)} times!]')
async def buybandages(name, amount):
if amount == 0 or amount == None:
return f'[Must specify how many bandages you want... !buy bandages <amount>]'
c.execute(f'SELECT rowid FROM items WHERE name=(:name)', {'name': name})
checkrow=c.fetchone()
if checkrow == None:
bandages = 0
c.execute(f'INSERT OR REPLACE INTO items VALUES (:name, :bandages)', {'name': name, 'bandages': bandages})
conn.commit()
shopamount = amount * 50
c.execute(f'SELECT * FROM items WHERE name=(:name)', {'name': name})
look = c.fetchall()
for band in look:
bandages = band[1]
c.execute(f'SELECT * FROM users WHERE name=(:name)', {'name': name})
usermoney = c.fetchall()
for grabmoney in usermoney:
money = grabmoney[6]
if money >= shopamount:
bandages = band[1]
bandagestotal = bandages + amount
c.execute(f'UPDATE ITEMS set BANDAGES = (:bandages) WHERE NAME = (:name)', {'bandages': bandagestotal, 'name': name})
conn.commit()
money = money - shopamount
c.execute(f'UPDATE users set MONEY = (:money) WHERE NAME = (:name)', {'money': money, 'name': name})
conn.commit()
return f'[You have enough money [${money:,}] to purchase [{amount}] bandages! Cost is ${shopamount:,}]'
else:
return f'[You do {color("NOT", red)} have enough funds!]'
return
async def heal(name):
c.execute(f'SELECT * from USERS WHERE name= (:name)', {'name': name})
newtest=c.fetchall()
for userinfo in newtest:
health = userinfo[3]
if health <= 0:
return f'[You are dead... !revive to bring yourself back]'
c.execute(f'SELECT rowid FROM items WHERE name = (:name)', {'name': name})
havebandages=c.fetchone()
if havebandages == None:
return f'[You do not have any bandages... !buy bandages <amount number>]'
c.execute(f'SELECT * FROM items WHERE name = (:name)', {'name': name})
bandaids = c.fetchall()
for bandages in bandaids:
if bandages[1] <= 0:
return f'[You do not have any bandages... !buy bandages <amount number>]'
maxhealth = userinfo[7]
if health == maxhealth:
return f'[You already at FULL HEALTH]'
newhealth = health + 25
if newhealth >= maxhealth:
health = maxhealth
c.execute(f'UPDATE USERS set HEALTH = (:health) where NAME = (:name)', {'health': health, 'name': name})
conn.commit()
return f'[Player healed {color("+25", light_green)} to MAX health {color(health, light_green)}]'
else:
c.execute(f'UPDATE USERS set HEALTH = (:health) where NAME = (:name)', {'health': newhealth, 'name': name})
conn.commit()
return f'[Player healed {color("+25", light_green)} to health {color(newhealth, light_green)}]'
c.execute(f'SELECT * FROM items WHERE name=(:name)', {'name': name})
bandaids=c.fetchall()
for checkitems in bandaids:
bandages = checkitems[1]
bandages = bandages - 1
c.execute(f'UPDATE ITEMS set BANDAGES = (:bandages) WHERE name = (:name)', {'bandages': bandages, 'name': name})
conn.commit()
async def testfunction(name):
c.execute(f'SELECT * FROM items WHERE name=(:name)', {'name': name})
bandaids=c.fetchall()
for checkitems in bandaids:
bandages = checkitems[1]
bandages = bandages - 1
return f'[Player {color(bandages, light_green)} has a total of {color("0", red)} kills!]'
async def reload(nick):
c.execute(f"SELECT rowid FROM users WHERE name=(:name)", {'name': nick})
data=c.fetchone()
if data == None:
logging.debug('User is trying to reload without having an account')
await irc.bot.sendmsg(config.irc.channel, f'[User {nick} does not have an account]')
return
c.execute(f"SELECT * FROM weapons WHERE name=(:name)", {'name': nick})
data=c.fetchall()
name = nick
for check in data:
hasweapon = check[1]
if hasweapon == False:
logging.debug('User does not have weapon')
await irc.bot.sendmsg(config.irc.channel, f'[You do not currently have a weapon.. !buy weapon]')
return
maxclip = 30
clip = check[2]
ammunition = check[3]
if ammunition <= 0:
return f'!buy ammo'
clipadd = 30 - clip
if ammunition >= clipadd:
ammunition = ammunition - clipadd
clip = clip + clipadd
else:
clip = clip + ammunition
ammunition = 0
logging.debug(f'[Current clip ammunition is at {clip} rounds and backup ammunition is at {ammunition} magazine rouunds!]')
await irc.bot.sendmsg(config.irc.channel, f'[Current clip has {clip} rounds out of {maxclip} mag ammo size and {ammunition} in the arsenal!]')
c.execute(f"UPDATE WEAPONS set CLIP = (:clip) WHERE NAME = (:name)", {'clip': clip, 'name': nick})
conn.commit()
c.execute(f"UPDATE WEAPONS set AMMUNITION = (:ammunition) WHERE NAME = (:name)", {'ammunition': ammunition, 'name': name})
conn.commit()
async def shoot(player, nick):
check = await checkexist(player)
if check != True:
return
else:
if player == nick:
logging.debug('Player cannot attack oneself')
await irc.bot.sendmsg(config.irc.channel, f'[Error: {1}]'.format(0,color('Cannot Attack Yourself', red)))
c.execute(f'SELECT rowid FROM weapons WHERE name=(:name)', {'name': nick})
checkrow=c.fetchone()
if checkrow == None:
await irc.bot.sendmsg(config.irc.channel, f'[Error: {color("No Weapons", red)}] - !buy weapon')
c.execute(f"SELECT * FROM users WHERE name=(:name)", {'name': nick})
healthcheck = c.fetchall()
for checkalive in healthcheck:
alive = checkalive[3]
if alive <= 0:
await irc.bot.sendmsg(config.irc.channel, f'[Error: {color("You Are Dead... !revive", red)}]')
c.execute(f"SELECT * FROM users WHERE name=(:name)", {'name': player})
playerhealthcheck = c.fetchall()
for checkalive in playerhealthcheck:
health = checkalive[3]
if health <= 0:
logging.debug('Player targeted is DEAD')
await irc.bot.sendmsg(config.irc.channel, f'[Player targeted is {color("DEAD", light_blue)}]')
c.execute(f"SELECT * FROM weapons WHERE name=(:name)", {'name': nick})
weapons = c.fetchall()
for reg in weapons:
name = nick
weaponheld = reg[1]
expire = reg[4]
c.execute(f"SELECT rowid FROM weapons WHERE name=(:name)", {'name': name})
if weaponheld == 0:
await irc.bot.sendmsg(config.irc.channel, f'You do not own a weapon!')
return
clip = reg[2]
ammunition = reg[3]
if clip == 0:
logging.debug('Weapon out of ammo! !buy ammo and !reload')
c.execute("INSERT OR REPLACE INTO weapons VALUES (:name, :weaponheld, :clip, :ammunition, :expire)", {'name': nick, 'weaponheld': weaponheld, 'clip': clip, 'ammunition': ammunition, 'expire': expire})
conn.commit()
await irc.bot.sendmsg(config.irc.channel, f'{color("OUT OF AMMO - !reload", red)}')
return
else:
c.execute("SELECT * FROM weapons WHERE name=(:name)", {'name': name})
checkexpire=c.fetchall()
for expiring in checkexpire:
expires = expiring[4]
if expires == 300:
logging.debug('User weapon has expired Weapon and Ammo Purged. !buy weapon')
c.execute('''UPDATE WEAPONS set WEAPONHELD = False,
CLIP = 0,
AMMUNITION = 0,
EXPIRE = 0
WHERE name = (:name)''', {'name': name})
conn.commit()
await irc.bot.sendmsg(config.irc.channel, f'[Player weapon has expired... purging weapon! <!buy weapon> for a new one]')
clip = clip - 3
c.execute("INSERT OR REPLACE INTO weapons VALUES (:name, :weaponheld, :clip, :ammunition, :expire)", {'name': nick, 'weaponheld': weaponheld, 'clip': clip, 'ammunition': ammunition, 'expire': expire})
conn.commit()
shooter = c.execute("SELECT * FROM users WHERE name=(:name)", {'name': player})
for reg in shooter:
playerhealth = reg[3]
damage = random.randint(80, 120)
damage = min(damage, int(playerhealth))
playerhealth = int(playerhealth) - int(damage)
expire = expire + 1
c.execute("UPDATE WEAPONS set EXPIRE = (:expire) where NAME = (:name)", {'expire': expire, 'name': name})
conn.commit()
if playerhealth <= 0:
await addmoney(nick)
playerhealth = 0
c.execute('UPDATE USERS set HEALTH = (:health) where NAME = (:name)', {'health': playerhealth, 'name': player})
conn.commit()
await irc.bot.sendmsg(config.irc.channel, '[Player {1} killed {2} and did {3} damage]'.format(0, color(nick, light_green), color(player, red), color(int(damage), light_green)))
await addkillstat(nick)
await adddeathstat(player)
return
c.execute('UPDATE USERS set HEALTH = (:health) where NAME = (:name)', {'health': playerhealth, 'name': player})
conn.commit()
#return f'[{player} health is now {playerhealth} and took {damage} damage!]')
await irc.bot.sendmsg(config.irc.channel, '[Character: {1}] shot at [{2}] with an M16 and did [{3}] damage!'.format(0, color(nick, light_green), color(player, red), color(int(damage), green)))
await irc.bot.sendmsg(config.irc.channel, f'[Remaining clip magazine rounds: {clip}]')
return
async def shop():
logging.debug('Printing shop items!')
return f'[Shop Accessories]\r\n[!buy weapon - purchase a 3-round burst gun (note: weapon has a quality of 300 trigger limit)]\r\n[!buy ammo - buy ammunition (+60 rounds) for your weapon]\r\n[!buy bandages <amount>]\r\n'
# return f'[!buy bandages - buys bandages for health] {color("* not done yet", red)}')
async def buyammo(nick):
c.execute(f"SELECT * FROM weapons WHERE name=:name", {'name': nick})
weapons = c.fetchall()
c.execute(f"SELECT * FROM users WHERE name=:name", {'name': nick})
user = c.fetchall()
for reg in user:
name = nick
money = reg[6]
newmoney = money - 50
c.execute("UPDATE USERS set MONEY = (:money) where NAME = (:name)", {'money': newmoney, 'name': name})
conn.commit()
await irc.bot.sendmsg(config.irc.channel, f'[Player {name} purchased 60 rounds of ammunition!]')
for weps in weapons:
ammunition = weps[3]
weaponheld = weps[1]
clip = weps[2]
ammunition += 60
expire = weps[4]
c.execute("INSERT OR REPLACE INTO weapons VALUES (:name, :weaponheld, :clip, :ammunition, :expire)", {'name': nick, 'weaponheld': weaponheld, 'clip': clip, 'ammunition': ammunition, 'expire': expire})
conn.commit()
await irc.bot.sendmsg(config.irc.channel, f'[Player {nick} weapon ammunition is now {ammunition}]')
async def removeweapon(nick):
remweapon = Weapons(nick, 0, 0, 0)
c.execute("UPDATE WEAPONS set WEAPONHELD = (:weaponheld) where NAME = (:name)", {'weaponheld': 0, 'name': nick})
conn.commit()
logging.debug('Removed weapon')
return f'[Player {nick} has been revoked of his/her weapon!]'
async def buyweapon(nick):
c.execute(f"SELECT * FROM weapons WHERE name=:name", {'name': nick})
weapons = c.fetchall()
c.execute(f"SELECT * FROM users WHERE name=:name", {'name': nick})
user = c.fetchall()
for regs in user:
name = nick
money = regs[6]
for weapon in weapons:
weaponheld = weapon[1]
if weaponheld == 1:
logging.debug('Weapon is already held, returning')
return f'[Weapon is already held, !buy ammo for more ammunition]'
clip = 30
ammunition = 60
money = money - 500
c.execute("UPDATE USERS set MONEY = (:money) where NAME = (:name)", {'money': money, 'name': nick})
conn.commit()
logging.debug(f'Attempting to buy Weapon for {nick}')
weaponheld = True
logging.debug('Buying weapon')
expire = 0
c.execute("INSERT OR REPLACE INTO weapons VALUES (:name, :weaponheld, :clip, :ammunition, :expire)", {'name': nick, 'weaponheld': weaponheld, 'clip': clip, 'ammunition': ammunition, 'expire': expire})
conn.commit()
return f'[Player: {nick} has purchased a gun for $500! Loaded clip of {clip} rounds!]'
async def removeuser(nick):
logging.debug(f'Removing user {nick}')
name = nick
c.execute('''DELETE FROM users WHERE name=?''',(name,))
conn.commit()
c.execute('''DELETE FROM items WHERE name=?''',(name,))
conn.commit()
c.execute('''DELETE FROM weapons WHERE name=?''',(name,))
conn.commit()
c.execute('''DELETE FROM stats WHERE name=?''',(name,))
conn.commit()
logging.debug(f'Removed user {nick}')
async def createuser(nick):
logging.debug(f'Attemping to create user {nick}')
reguser = Users(nick, 1, 500, 500, 100, 100, 5000, 500)
logging.debug(f'User {nick} added to database')
c.execute("INSERT OR REPLACE INTO users VALUES (:name, :level, :experience, :health, :attack, :defense, :money, :healthmax)", {'name': nick, 'level': reguser.level, 'experience': reguser.experience, 'health': reguser.health, 'attack': reguser.attack, 'defense': reguser.defense, 'money': reguser.money, 'healthmax': reguser.healthmax})
conn.commit()
c.execute(f'SELECT rowid FROM stats WHERE name=(:name)', {'name': nick})
checkrow=c.fetchone()
if checkrow == None:
kills = 0
deaths = 0
c.execute(f'INSERT OR REPLACE INTO stats VALUES (:name, :kills, :deaths)', {'name': nick, 'kills': kills, 'deaths': deaths})
conn.commit()
#return f'[Player {color(name, light_green)} has a total of {color(kills, red)} kills!]')
async def setlevel(nick, level):
if level == '1':
experience = '500'
health = '500'
attack = '100'
defense = '100'
healthmax = '500'
c.execute(f'''UPDATE USERS set LEVEL = (:level),
EXPERIENCE = (:experience),
HEALTH = (:health),
ATTACK = (:attack),
DEFENSE = (:defense),
HEALTHMAX = (:healthmax)
where NAME = (:name)''', {'level': level, 'experience': experience, 'health': health, 'attack': attack, 'defense': defense, 'name': nick, 'healthmax': healthmax})
conn.commit()
return f"[Player: {nick} is now level {color(level, red)}]"
elif level == '2':
experience = '1000'
health = '1000'
attack = '150'
defense = '150'
healthmax = '1000'
c.execute(f'''UPDATE USERS set LEVEL = (:level),
EXPERIENCE = (:experience),
HEALTH = (:health),
ATTACK = (:attack),
DEFENSE = (:defense),
HEALTHMAX = (:healthmax)
where NAME = (:name)''', {'level': level, 'experience': experience, 'health': health, 'attack': attack, 'defense': defense, 'name': nick, 'healthmax': healthmax})
conn.commit()
return f"[Player: {nick} is now level {color(level, red)}]"
elif level == '3':
experience = '2000'
health = '1500'
attack = '175'
defense = '175'
healthmax = '1500'
c.execute(f'''UPDATE USERS set LEVEL = (:level),
EXPERIENCE = (:experience),
HEALTH = (:health),
ATTACK = (:attack),
DEFENSE = (:defense),
HEALTHMAX = (:healthmax)
where NAME = (:name)''', {'level': level, 'experience': experience, 'health': health, 'attack': attack, 'defense': defense, 'name': nick, 'healthmax': healthmax})
conn.commit()
return f"[Player: {nick} is now level {color(level, red)}]"
elif level == '4':
experience = '3000'
health = '2000'
attack = '200'
defense = '200'
healthmax = '2000'
c.execute(f'''UPDATE USERS set LEVEL = (:level),
EXPERIENCE = (:experience),
HEALTH = (:health),
ATTACK = (:attack),
DEFENSE = (:defense),
HEALTHMAX = (:healthmax)
where NAME = (:name)''', {'level': level, 'experience': experience, 'health': health, 'attack': attack, 'defense': defense, 'name': nick, 'healthmax': healthmax})
conn.commit()
return f"[Player: {nick} is now level {color(level, red)}]"
elif level == '5':
experience = '5000'
health = '3000'
attack = '225'
defense = '225'
healthmax = '3000'
c.execute(f'''UPDATE USERS set LEVEL = (:level),
EXPERIENCE = (:experience),
HEALTH = (:health),
ATTACK = (:attack),
DEFENSE = (:defense),
HEALTHMAX = (:healthmax)
where NAME = (:name)''', {'level': level, 'experience': experience, 'health': health, 'attack': attack, 'defense': defense, 'name': nick, 'healthmax': healthmax})
conn.commit()
return f"[Player: {nick} is now level {color(level, red)}]"
elif int(level) > 5:
return "[Error: Invalid Level]"
async def closesql():
conn.close()
class combat:
class attacker:
name = ''
attack = ''
class defender:
name = ''
defense = ''
health = ''
async def punch(player, nick):
check = await checkexist(player)
if check is False:
return
else:
for name in (nick):
c.execute(f"SELECT * FROM users WHERE name=:name", {'name': nick})
attacker = c.fetchall()
c.execute(f"SELECT * FROM users WHERE name=:name", {'name': player})
defender = c.fetchall()
if nick == player:
await irc.bot.sendmsg(config.irc.channel, '[Error: {1}]'.format(0,color('Cannot Attack Yourself', red)))
return
for att in attacker:
combat.attacker.name = att[0]
combat.attacker.attack = att[4]
combat.attacker.health = att[3]
if combat.attacker.health == 0:
await irc.bot.sendmsg(config.irc.channel, '[Error: You Are {1}!]'.format(0, color('Dead', red)))
return
for defend in defender:
combat.defender.name = defend[0]
combat.defender.defense = defend[5]
combat.defender.health = defend[3]
playerhealth = combat.defender.health
if combat.defender.health <= 0:
await irc.bot.sendmsg(config.irc.channel, f'[Player targeted is {color("DEAD", light_blue)}]')
return
playerdef = combat.defender.defense
playerattack = combat.attacker.attack
critical_multiplier = 1.1 if random.random() < 0.10 else 1.0
effective_defense = int(playerdef) * random.uniform(0.9, 1.1)
effective_attack = int(playerattack) * random.uniform(1.0, 1.1)
damage = effective_attack * (50 / (50 + effective_defense)) * critical_multiplier
damage = min(damage, int(playerhealth))
combat.defender.health = int(playerhealth) - int(damage)
c.execute(f'''UPDATE USERS set HEALTH = (:health) where NAME = (:name)''', {'health': combat.defender.health, 'name': combat.defender.name})
conn.commit()
if combat.defender.health <= 0:
await irc.bot.sendmsg(config.irc.channel, '[Player {1} killed {2} and did {3} damage]'.format(0, color(nick, light_green), color(player, red), color(int(damage), light_green)))
await addmoney(nick)
await addkillstat(nick)
await adddeathstat(player)
combat.defender.health = 0
return
await irc.bot.sendmsg(config.irc.channel, '[Character: {1}] Punched [{2}] and did [{3}] damage!'.format(0, color(nick, light_green), color(player, red), color(int(damage), green)))
c.execute(f'''UPDATE USERS set HEALTH = (:health) where NAME = (:name)''', {'health': combat.defender.health, 'name': combat.defender.name})
conn.commit()
async def profile(nick):
name = nick
check = await checkexist(nick)
if check != True:
return
try:
c.execute(f"SELECT * FROM users WHERE name=(:name)", {'name': nick})
reg = c.fetchall()
for regs in reg:
name = regs[0]
level = regs[1]
experience = regs[2]
health = regs[3]
attack = regs[4]
defense = regs[5]
money = regs[6]
healthmax = regs[7]
c.execute(f'SELECT * FROM stats WHERE name=(:name)', {'name': name})
grabstats=c.fetchall()
for stats in grabstats:
kills = stats[1]
deaths = stats[2]
return f'[Player: {color(name, light_green)}] [Level: {color(level, red)}] [Experience: {color(experience, blue)}] [Health: {color(health, light_green)}/{color(healthmax, green)}] [Att/Def: {color(attack, light_green)}/{color(defense, red)}] [Money: {color(money, light_blue)}] [Kills: {color(kills, light_blue)}] [Deaths: {color(deaths, red)}]'
except Exception as ex:
print('Error {0}'.format(0, ex))
#bot.sendmsg(config.irc.channel, '[Error: No Such User]')
async def revive(nick):
check = await checkexist(nick)
if check != True:
return
c.execute("SELECT * FROM users WHERE name=(:name)", {'name': nick})
checkhealth=c.fetchall()
for amount in checkhealth:
health = amount[3]
max = amount[7]
if health <= 0:
c.execute("UPDATE USERS set HEALTH = (:health) WHERE NAME = (:name)", {'health': max, 'name': nick})
logging.debug('test')
conn.commit()
return f'[Player {color(nick,light_green)} has been revived!]'
else:
return f'[You are not DEAD! No reviving the living!]'
async def getmoney(nick):
c.execute(f"SELECT * FROM users WHERE name=(:name)", {'name': nick})
moneygrab = c.fetchall()
for money in moneygrab:
moneyamount = money[6]
writemoney = f'{moneyamount:,}'
return f'[Bank Balance: ${color(writemoney, light_blue)}]'
async def getbandages(nick):
name = nick
c.execute(f'SELECT rowid FROM items WHERE name=(:name)', {'name': nick})
data=c.fetchone()
if data is None:
bandages = 0
c.execute(f'INSERT OR REPLACE INTO items VALUES (:name, :bandages)', {'name': name, 'bandages': bandages})
conn.commit()
c.execute(f"SELECT * FROM items WHERE name=(:name)", {'name': nick})
bandages = c.fetchall()
for bandage in bandages:
bandageamount = bandage[1]
if bandageamount == None:
logging.debug('test')
bandageamount = 0
writebandageamount = f'{bandageamount:,}'
return f'[Bandages: {color(writebandageamount, red)}]'
async def ammo(nick):
c.execute(f'SELECT rowid FROM users WHERE name=(:name)', {'name': nick})
exist = c.fetchone()
if exist is None:
return f'[User {nick} does not have an account!]'
c.execute(f"SELECT * FROM weapons WHERE name=(:name)", {'name': nick})
checkammo = c.fetchall()
for ammo in checkammo:
hasweapon = ammo[1]
if hasweapon == False:
return f'[You do not currently have a weapon.. !buy weapon]'
ammoclipcount = ammo[2]
ammomagcount = ammo[3]
return f"[Ammo Count] [Current Clip Holding: {ammoclipcount}] [Arsenal Magazine Rounds: {ammomagcount}]"
async def addmoney(nick):
c.execute(f"SELECT * FROM users WHERE name=:name", {'name': nick})
moneygrab = c.fetchall()
for money in moneygrab:
moneyamount = money[6]
profit = 500
moneyamount += profit
moneyamountformat = f'{moneyamount:,}'
c.execute(f'''UPDATE USERS set MONEY = (:money) where NAME = (:name)''', {'money': moneyamount, 'name': nick})
conn.commit()
return f'[You gained ${color(profit, blue)}!] [Bank Balance: ${color(moneyamountformat, light_blue)}]'

331
irc.py Normal file
View File

@ -0,0 +1,331 @@
from config import config
import time
import ssl
import argparse
import logging
import logging.handlers
import asyncio
import importlib
import time
import sys
import functions
from functions import shop, buyweapon, buyammo, buybandages, shoot, reload, ammo, heal, revive, getmoney, getbandages, removeweapon, createuser, profile, removeuser, setlevel, createuser, punch, checkexist
import sqlite3
# Formatting Control Characters / Color Codes
bold = '\x02'
italic = '\x1D'
underline = '\x1F'
reverse = '\x16'
reset = '\x0f'
white = '00'
black = '01'
blue = '02'
green = '03'
red = '04'
brown = '05'
purple = '06'
orange = '07'
yellow = '08'
light_green = '09'
cyan = '10'
light_cyan = '11'
light_blue = '12'
pink = '13'
grey = '14'
light_grey = '15'
conn = sqlite3.connect('data.db')
c = conn.cursor()
def color(msg: str, foreground: str, background: str='') -> str:
'''
Color a string with the specified foreground and background colors.
:param msg: The string to color.
:param foreground: The foreground color to use.
:param background: The background color to use.
'''
return f'\x03{foreground},{background}{msg}{reset}' if background else f'\x03{foreground}{msg}{reset}'
def ssl_ctx() -> ssl.SSLContext:
'''Create a SSL context for the connection.'''
ctx = ssl.create_default_context()
#ctx.verify_mode = ssl.CERT_NONE # Comment out this line to verify hosts
#ctx.load_cert_chain('/path/to/cert', password='loldongs')
return ctx
class Bot(object):
def __init__(self):
self.nickname = config.irc.nickname
self.username = config.irc.username
self.realname = config.irc.realname
self.channel = config.irc.channel
self.channelkey = config.irc.channelkey
self.reader = None
self.writer = None
#createtable()
async def action(self, chan: str, msg: str):
'''
Send an ACTION to the IRC server.
:param chan: The channel to send the ACTION to.
:param msg: The message to send to the channel.
'''
await self.sendmsg(chan, f'\x01ACTION {msg}\x01')
async def raw(self, data: str):
'''
Send raw data to the IRC server.
:param data: The raw data to send to the IRC server. (512 bytes max including crlf)
'''
self.writer.write(data[:510].encode('utf-8') + b'\r\n')
async def sendmsg(self, target: str, msg: str):
'''
Send a PRIVMSG to the IRC server.
:param target: The target to send the PRIVMSG to. (channel or user)
:param msg: The message to send to the target.
'''
try:
await self.raw(f'PRIVMSG {target} :{msg}')
time.sleep(config.throttle.msg)
except:
await bot.sendmsg(config.irc.channel, "Slow down homie!!")
async def connect(self):
'''Connect to the IRC server.'''
while True:
try:
options = {
'host' : config.irc.server,
'port' : config.irc.port if config.irc.port else 6697 if config.irc.ssl else 6667,
'limit' : 1024, # Buffer size in bytes (don't change this unless you know what you're doing)
'ssl' : ssl_ctx() if config.irc.ssl else None,
'family' : 2, # 10 = AF_INET6 (IPv6), 2 = AF_INET (IPv4)
'local_addr' : None # Can we just leave this as args.vhost?
}
self.reader, self.writer = await asyncio.wait_for(asyncio.open_connection(**options), 15) # 15 second timeout
if config.irc.password:
await self.raw('PASS ' + config.irc.password) # Rarely used, but IRCds may require this
await self.raw(f'USER {self.username} 0 * :{self.realname}') # These lines must be sent upon connection
await self.raw('NICK ' + self.nickname) # They are to identify the bot to the server
while not self.reader.at_eof():
data = await asyncio.wait_for(self.reader.readuntil(b'\r\n'), 300) # 5 minute ping timeout
await self.handle(data.decode('utf-8').strip()) # Handle the data received from the IRC server
except Exception as ex:
logging.error(f'failed to connect to {config.irc.server} ({str(ex)})')
finally:
await asyncio.sleep(30) # Wait 30 seconds before reconnecting
async def handle(self, data: str):
'''
Handle the data received from the IRC server.
:param data: The data received from the IRC server.
'''
try:
logging.info(data)
args = data.split()
if data.startswith('ERROR :Closing Link:'):
raise Exception('Cannot Connect')
if args[0] == 'PING':
await self.raw('PONG ' + args[1]) # Respond to the server's PING request with a PONG to prevent ping timeout
elif args[1] == '001': # RPL_WELCOME
await self.raw(f'MODE {self.nickname} +B') # Set user mode +B (Bot)
await asyncio.sleep(10) # Wait 10 seconds before joining the channel (required by some IRCds to wait before JOIN)
await self.raw(f'JOIN {self.channel} {self.channelkey}')
elif args[1] == '433': # ERR_NICKNAMEINUSE
self.nickname += '_' # If the nickname is already in use, append an underscore to the end of it
await self.raw('NICK ' + self.nickname) # Send the new nickname to the server
elif args[1] == 'KICK':
chan = args[2]
kicked = args[3]
if kicked == self.nickname:
await asyncio.sleep(3)
await self.raw(f'JOIN {chan}')
elif args[1] == 'PRIVMSG':
ident = args[0][1:]
nick = args[0].split('!')[0][1:].lower()
target = args[2]
msg = ' '.join(args[3:])[1:]
arguments = msg.split()
bandageamount = '0'
if target == self.nickname:
pass # Handle private messages here
if target.startswith('#'): # Channel message
if msg.startswith('!'):
try:
if time.time() - config.throttle.last < config.throttle.cmd and config.throttle.lastnick == nick:
if not config.throttle.slow:
config.throttle.slow = True
await bot.sendmsg(config.irc.channel, color("Slow down homie!!", red))
else:
config.throttle.slow = False
config.throttle.lastnick = nick
if arguments[0] == '!hug':
await bot.sendmsg(target, f'[XOXO Hugger9000... {nick} hugs {arguments[1]}]')
if arguments[0] == '!admins':
for i in config.irc.admins:
await bot.sendmsg(target, f'[Admins: ' + color(i, red) + ']')
if arguments[0] == '!shop':
await bot.sendmsg(config.irc.channel, f'[Shop Accessories]')
await bot.sendmsg(config.irc.channel, f'[!buy weapon - purchase a 3-round burst gun (note: weapon has a quality of 300 trigger limit)]')
await bot.sendmsg(config.irc.channel, f'[!buy ammo - buy ammunition (+60 rounds) for your weapon]')
await bot.sendmsg(config.irc.channel, f'[!buy bandages <amount>]')
if arguments[0] == '!buy' and arguments[1] != None:
if arguments[1] == 'weapon':
value = await functions.buyweapon(nick)
await bot.sendmsg(config.irc.channel, f'{value}')
elif arguments[1] == 'ammo':
value = await functions.buyammo(nick)
await bot.sendmsg(config.irc.channel, f'{value}')
elif arguments[1] == 'bandages':
if len(arguments) <= 2 or int(arguments[2]) == 0:
await bot.sendmsg(config.irc.channel, '[You must specify amount of bandages (greater than 0) to purchase]')
else:
value = await buybandages(nick, int(arguments[2]))
await bot.sendmsg(config.irc.channel, f'{value}')
if arguments[0] == '!test':
value = await functions.testfunction(nick)
await bot.sendmsg(config.irc.channel, f'{value}')
if arguments[0] == '!shoot':
await functions.shoot(arguments[1].lower(), nick)
#await bot.sendmsg(config.irc.channel, f'{value}')
if arguments[0] == '!reload':
value = await functions.reload(nick)
if value != None:
await bot.sendmsg(config.irc.channel, f'{value}')
if arguments[0] == '!ammo':
ammovalue = await ammo(nick)
await bot.sendmsg(config.irc.channel, f'{ammovalue}')
if arguments[0] == '!heal':
value = await functions.heal(nick)
await bot.sendmsg(config.irc.channel, f'{value}')
if arguments[0] == '!revive':
value = await functions.revive(nick)
await bot.sendmsg(config.irc.channel, f'{value}')
if arguments[0] == '!help':
await bot.sendmsg(config.irc.channel, '[Command List]')
await bot.sendmsg(config.irc.channel, '[!help - shows commands]')
await bot.sendmsg(config.irc.channel, '[!register - Register your player]')
await bot.sendmsg(config.irc.channel, '[!profile - Shows Profile Stats [!profile username]')
await bot.sendmsg(config.irc.channel, '[!punch <enemy> - Fight [!punch username]')
await bot.sendmsg(config.irc.channel, '[!shoot <enemy> - Shoot if you own a weapon]')
await bot.sendmsg(config.irc.channel, '[!bank - Returns Bank Balance]')
await bot.sendmsg(config.irc.channel, '[!buy <item> [weapon, ammo, bandages <amount>]')
await bot.sendmsg(config.irc.channel, '[!reload - Reloads Weapon]')
await bot.sendmsg(config.irc.channel, '[!ammo - Show Ammunition Amounts]')
await bot.sendmsg(config.irc.channel, '[!bandages - Shows Bandage Amounts]')
await bot.sendmsg(config.irc.channel, '[!revive - Brings you back to health if dead]')
await bot.sendmsg(config.irc.channel, '[!heal - Use bandages to regain health]')
await bot.sendmsg(config.irc.channel, ' ')
await bot.sendmsg(config.irc.channel, '[Admin Command List]')
await bot.sendmsg(config.irc.channel, '[!setlevel - !setlevel username Level (1 to 5)]')
await bot.sendmsg(config.irc.channel, '[!adduser <user> - Force create a user]')
await bot.sendmsg(config.irc.channel, '[!remove <user> - Removes a player]')
await bot.sendmsg(config.irc.channel, '[!removeweapon <user> - Remove user weapon]')
if arguments[0] == '!bank':
value = await functions.getmoney(nick)
await bot.sendmsg(config.irc.channel, f'{value}')
if arguments[0] == '!bandages':
value = await functions.getbandages(nick)
await bot.sendmsg(config.irc.channel, f'{value}')
if nick in config.irc.admins:
#await self.sendmsg(target, f'{nick} is an ' + color('Admin!', red))
if arguments[0] == '!removeweapon':
value = await functions.removeweapon(nick)
await bot.sendmsg(config.irc.channel, f'{value}')
if arguments[0] == '!adduser':
name = arguments[1].lower()
c.execute(f"SELECT rowid FROM users WHERE name = (:name)", {'name': name})
data=c.fetchone()
if data is None:
await bot.sendmsg(config.irc.channel, '[Registering Player: %s]'%name)
await createuser(name)
await profile(name)
else:
await bot.sendmsg(config.irc.channel, f'{color("[Player already exists!]", red)}')
if arguments[0] == '!remove':
logging.debug('remove user')
name = arguments[1].lower()
c.execute(f"SELECT rowid FROM users WHERE name= (:name)", {'name': name})
data=c.fetchone()
if data != None:
await bot.sendmsg(config.irc.channel, f'[Removing {color(name, red)} from database]')
await functions.removeuser(name)
else:
await bot.sendmsg(config.irc.channel, f'[User does not exist]')
if arguments[0] == '!setlevel':
value = await functions.setlevel(arguments[1].lower(), arguments[2])
await bot.sendmsg(config.irc.channel, f'{value}')
if arguments[0] == '!register':
c.execute(f"SELECT rowid FROM users WHERE name = (:name)", {'name': nick})
data=c.fetchone()
if data is None:
await bot.sendmsg(config.irc.channel, f'[Registering Player: %s]'%nick)
await createuser(nick)
await profile(nick)
else:
await bot.sendmsg(config.irc.channel, f'{color("[Player already exists!]", red)}')
if arguments[0] == '!profile':
try:
value = await profile(arguments[1].lower())
await bot.sendmsg(config.irc.channel, f'{value}')
except:
value = await profile(nick)
await bot.sendmsg(config.irc.channel, f'{value}')
if arguments[0] == '!punch':
await functions.punch(arguments[1].lower(), nick)
config.throttle.last = time.time()
except Exception as ex:
if time.time() - config.throttle.last < config.throttle.cmd:
if not config.throttle.slow:
await bot.sendmsg(config.irc.channel, color('Slow down homie!', red))
config.throttle.slow = True
config.throttle.last = time.time()
#except (UnicodeDecodeError, UnicodeEncodeError):
except (UnicodeDecodeError, UnicodeEncodeError):
pass # Some IRCds allow invalid UTF-8 characters, this is a very important exception to catch
except Exception as ex:
logging.exception(f'Unknown error has occured! ({ex})')
def setup_logger(log_filename: str, to_file: bool = False):
'''
Set up logging to console & optionally to file.
:param log_filename: The filename of the log file
'''
sh = logging.StreamHandler()
sh.setFormatter(logging.Formatter('%(asctime)s | %(levelname)9s | %(message)s', '%I:%M %p'))
if to_file:
fh = logging.handlers.RotatingFileHandler(log_filename+'.log', maxBytes=250000, backupCount=3, encoding='utf-8') # Max size of 250KB, 3 backups
fh.setFormatter(logging.Formatter('%(asctime)s | %(levelname)9s | %(filename)s.%(funcName)s.%(lineno)d | %(message)s', '%Y-%m-%d %I:%M %p')) # We can be more verbose in the log file
logging.basicConfig(level=logging.NOTSET, handlers=(sh,fh))
else:
logging.basicConfig(level=logging.NOTSET, handlers=(sh,))
bot = Bot()
def run():
functions.createtable()
setup_logger('skeleton', to_file=True) # Optionally, you can log to a file, change to_file to False to disable this.
asyncio.run(bot.connect())

23
main.py Normal file
View File

@ -0,0 +1,23 @@
#!/usr/bin/env python
# IRC Cryptocurrency Exchange (IRCCEX) - Developed by acidvegas in Python (https://acid.vegas/irccex)
# irccex.py
import os
import sys
import importlib
#import functions
from time import sleep
import asyncio
import logging
print('#'*56)
print('#{0}#'.format(''.center(54)))
print('#{0}#'.format('IRC Cryptocurrency Exchange (IRCCEX)'.center(54)))
print('#{0}#'.format('Developed by acidvegas in Python'.center(54)))
print('#{0}#'.format('https://acid.vegas/irccex'.center(54)))
print('#{0}#'.format(''.center(54)))
print('#'*56)
import irc
irc.run()