def check_investments(): if (debug == 1): return while True: if (len(awaiting) > 0): investment = awaiting[0] investor_id = investment.get_name() investor = users[investor_id] post = investment.get_ID() upvotes = reddit.submission(post).ups commentID = investment.get_comment() comment = reddit.comment(id=commentID) donep = investment.check() if (donep): win = investor.calculate(investment, upvotes) if (win > 0): comment.edit(message.modify_invest_return(comment.body, win)) else: comment.edit(message.modify_invest_lose(comment.body)) done.append(awaiting.pop(0)) print("Investment returned!")
def check_investments(): print("Starting checking investments...") while True: time.sleep(60) done_ids = database.investment_find_done() for id_number in done_ids: # I know that everything can be compacted in a tuple # This way it is more understandable name = database.investment_get_name(id_number) postID = database.investment_get_post(id_number) upvotes_old = database.investment_get_upvotes(id_number) amount = database.investment_get_amount(id_number) responseID = database.investment_get_response(id_number) response = reddit.comment(id=responseID) # If comment is deleted, skip it try: commentID = database.investment_get_comment(id_number) comment = reddit.comment(id=commentID) except: response.edit(message.deleted_comment_org) continue post = reddit.submission(postID) upvotes_now = post.ups # Updating the investor's balance factor = calculate(upvotes_now, upvotes_old) balance = database.investor_get_balance(name) new_balance = int(balance + (amount * factor)) database.investor_update_balance(name, new_balance) change = new_balance - balance # Updating the investor's variables active = database.investor_get_active(name) active -= 1 database.investor_update_active(name, active) completed = database.investor_get_completed(name) completed += 1 database.investor_update_completed(name, completed) # Marking the investment as done database.investment_update_done(id_number) # Editing the comment as a confirmation text = response.body if (factor > 1): response.edit(message.modify_invest_return(text, change)) database.investment_update_success(id_number) else: lost_memes = int(amount - (amount * factor)) response.edit(message.modify_invest_lose(text, lost_memes)) print(f"Investment returned! {change}")
def main(): logging.info("Starting calculator...") killhandler = KillHandler() engine = create_engine() session_maker = sessionmaker(bind=engine) reddit = praw.Reddit( client_id=config.CLIENT_ID, client_secret=config.CLIENT_SECRET, username=config.USERNAME, password=config.PASSWORD, user_agent=config.USER_AGENT, ) # We will test our reddit connection here if not utils.test_reddit_connection(reddit): return () praw.models.Comment.edit_wrap = edit_wrap stopwatch = Stopwatch() logging.info("Retrieving top ...") # query sess = session_maker() try: top_networth = (sess.query( Investor.name, func.coalesce(Investor.balance + func.sum(Investment.amount), Investor.balance).label("networth"), ).outerjoin( Investment, and_(Investor.name == Investment.name, Investment.done == 0)).group_by(Investor.name).order_by( desc("networth")).limit(1).one())[1] except NoResultFound: top_networth = 0 top_networth = max(top_networth, config.STARTING_BALANCE * 10) # al last starting * 10 sess.close() logging.info("Top networth: %d", top_networth) logging.info("Monitoring active investments...") while not killhandler.killed: sess = session_maker() then = int(time.time()) - config.INVESTMENT_DURATION investment = (sess.query(Investment).filter( Investment.done == 0).filter(Investment.time < then).order_by( Investment.time.asc()).first()) if not investment: # Nothing matured yet; wait a bit before trying again time.sleep(50) continue duration = stopwatch.measure() investor = sess.query(Investor).filter( Investor.name == investment.name).one() net_worth = investor.networth(sess) logging.info("New mature investment: %s", investment.comment) logging.info(" -- by %s", investor.name) # Retrieve the post the user invested in (lazily, no API call) post = reddit.submission(investment.post) # Retrieve the post's current upvote count (triggers an API call) upvotes_now = post.ups investment.final_upvotes = upvotes_now investment.op = (post.author and investor.name == post.author.name) investment.net_worth = net_worth investment.top_networth = top_networth # Updating the investor's balance factor = formula.calculate(upvotes_now, investment.upvotes, net_worth, top_networth) if factor > 1 and post.author and investor.name == post.author.name: # bonus per OP factor *= formula.OP_BONUS amount = investment.amount balance = investor.balance new_balance = int(balance + (amount * factor)) change = new_balance - balance profit = change - amount # Updating the investor's variables investor.completed += 1 # Retrieve the bot's original response (lazily, no API call) if investment.response != "0": response = reddit.comment(id=investment.response) else: response = EmptyResponse() if new_balance < BALANCE_CAP: # If investor is in a firm and he profits, # 15% goes to the firm investor.balance = new_balance # Edit the bot's response (triggers an API call) if profit > 0: logging.info(" -- profited %s", profit) elif profit == 0: logging.info(" -- broke even") else: logging.info(" -- lost %s", profit) edited_response = message.modify_invest_return( investment.amount, investment.upvotes, upvotes_now, change, profit, investor.balance, ) response.edit_wrap(edited_response) else: # This investment pushed the investor's balance over the cap investor.balance = BALANCE_CAP # Edit the bot's response (triggers an API call) logging.info(" -- profited %s but got capped", profit) response.edit_wrap( message.modify_invest_capped( investment.amount, investment.upvotes, upvotes_now, change, profit, investor.balance, )) investment.success = profit > 0 investment.profit = profit investment.done = True sess.commit() if top_networth < investor.balance: top_networth = investor.balance logging.info("New Top networth: %d", top_networth) # Measure how long processing took duration = stopwatch.measure() logging.info(" -- processed in %.2fs", duration) # Report the Reddit API call stats rem = int(reddit.auth.limits["remaining"]) res = int(reddit.auth.limits["reset_timestamp"] - time.time()) logging.info(" -- API calls remaining: %s, resetting in %.2fs", rem, res) sess.close()
def main(): engine = create_engine(config.db) sm = sessionmaker(bind=engine) reddit = praw.Reddit(client_id=config.client_id, client_secret=config.client_secret, username=config.username, password=config.password, user_agent=config.user_agent) logging.info("Starting checking investments...") praw.models.Comment.edit_wrap = edit_wrap while True: sess = sm() then = int(time.time()) - 14400 q = sess.query(Investment).filter(Investment.done == 0).filter( Investment.time < then) for investment in q.limit(10).all(): investor_q = sess.query(Investor).filter( Investor.name == investment.name) investor = investor_q.first() if not investor: continue if investment.response != "0": response = reddit.comment(id=investment.response) else: response = EmptyResponse() # If comment is deleted, skip it try: reddit.comment(id=investment.comment) except: response.edit(message.deleted_comment_org) continue post = reddit.submission(investment.post) upvotes_now = post.ups # Updating the investor's balance factor = calculate(upvotes_now, investment.upvotes) amount = investment.amount balance = investor.balance new_balance = int(balance + (amount * factor)) change = new_balance - balance # Updating the investor's variables update = { Investor.completed: investor.completed + 1, Investor.balance: new_balance, } investor_q.update(update, synchronize_session=False) # Editing the comment as a confirmation text = response.body if change > 0: logging.info("%s won %d" % (investor.name, change)) response.edit_wrap(message.modify_invest_return(text, change)) elif change == 0: logging.info("%s broke even and got back %d" % (investor.name, change)) response.edit_wrap( message.modify_invest_break_even(text, change)) else: lost_memes = int(amount - change) logging.info("%s lost %d" % (investor.name, lost_memes)) response.edit_wrap(message.modify_invest_lose( text, lost_memes)) sess.query(Investment).\ filter(Investment.id == investment.id).\ update({ Investment.success: change > 0, Investment.done: True }, synchronize_session=False) sess.commit() sess.close()
def main(): logging.info("Starting calculator...") logging.info( "Sleeping for 8 seconds. Waiting for the database to turn on...") time.sleep(8) killhandler = KillHandler() engine = create_engine(config.DB, pool_recycle=60, pool_pre_ping=True) session_maker = sessionmaker(bind=engine) reddit = praw.Reddit(client_id=config.CLIENT_ID, client_secret=config.CLIENT_SECRET, username=config.USERNAME, password=config.PASSWORD, user_agent=config.USER_AGENT) # We will test our reddit connection here if not utils.test_reddit_connection(reddit): exit() praw.models.Comment.edit_wrap = edit_wrap stopwatch = Stopwatch() logging.info("Monitoring active investments...") while not killhandler.killed: sess = session_maker() then = int(time.time()) - config.INVESTMENT_DURATION investment = sess.query(Investment).\ filter(Investment.done == 0).\ filter(Investment.time < then).\ order_by(Investment.time.asc()).\ first() if not investment: # Nothing matured yet; wait a bit before trying again time.sleep(5) continue duration = stopwatch.measure() investor = sess.query(Investor).filter( Investor.name == investment.name).one() net_worth = sess.\ query(func.sum(Investment.amount)).\ filter(and_(Investment.name == investor.name, Investment.done == 0)).\ scalar()\ + investor.balance logging.info("New mature investment: %s", investment.comment) logging.info(" -- by %s", investor.name) # Retrieve the post the user invested in (lazily, no API call) post = reddit.submission(investment.post) # Retrieve the post's current upvote count (triggers an API call) upvotes_now = post.ups investment.final_upvotes = upvotes_now # Updating the investor's balance factor = formula.calculate(upvotes_now, investment.upvotes, net_worth) amount = investment.amount balance = investor.balance new_balance = int(balance + (amount * factor)) change = new_balance - balance profit = change - amount percent_str = f"{int((profit/amount)*100)}%" # Updating the investor's variables investor.completed += 1 # Retrieve the bot's original response (lazily, no API call) if investment.response != "0": response = reddit.comment(id=investment.response) else: response = EmptyResponse() firm_profit = 0 if new_balance < BALANCE_CAP: # If investor is in a firm and he profits, # 15% goes to the firm firm_name = '' if investor.firm != 0 and profit >= 0: firm = sess.query(Firm).\ filter(Firm.id == investor.firm).\ first() firm_name = firm.name user_profit = int(profit * ((100 - firm.tax) / 100)) investor.balance += user_profit + amount firm_profit = int(profit * (firm.tax / 100)) firm.balance += firm_profit else: investor.balance = new_balance # Edit the bot's response (triggers an API call) if profit > 0: logging.info(" -- profited %s", profit) elif profit == 0: logging.info(" -- broke even") else: logging.info(" -- lost %s", profit) edited_response = message.modify_invest_return( investment.amount, investment.upvotes, upvotes_now, change, profit, percent_str, investor.balance) if investor.firm != 0: edited_response += message.modify_firm_tax( firm_profit, firm_name) response.edit_wrap(edited_response) else: # This investment pushed the investor's balance over the cap investor.balance = BALANCE_CAP # Edit the bot's response (triggers an API call) logging.info(" -- profited %s but got capped", profit) response.edit_wrap( message.modify_invest_capped(investment.amount, investment.upvotes, upvotes_now, change, profit, percent_str, investor.balance)) investment.success = (profit > 0) investment.profit = profit investment.done = True sess.commit() # Measure how long processing took duration = stopwatch.measure() logging.info(" -- processed in %.2fs", duration) # Report the Reddit API call stats rem = int(reddit.auth.limits['remaining']) res = int(reddit.auth.limits['reset_timestamp'] - time.time()) logging.info(" -- API calls remaining: %s, resetting in %.2fs", rem, res) sess.close()
def main(): logging.info("Starting calculator") killhandler = KillHandler() engine = create_engine(config.db, pool_recycle=60) sm = sessionmaker(bind=engine) reddit = praw.Reddit(client_id=config.client_id, client_secret=config.client_secret, username=config.username, password=config.password, user_agent=config.user_agent) praw.models.Comment.edit_wrap = edit_wrap stopwatch = Stopwatch() logging.info("Monitoring active investments...") while not killhandler.killed: try: sess = sm() then = int(time.time()) - config.investment_duration investment = sess.query(Investment).\ filter(Investment.done == 0).\ filter(Investment.time < then).\ order_by(Investment.time.asc()).\ first() if not investment: # Nothing matured yet; wait a bit before trying again time.sleep(5) continue duration = stopwatch.measure() investor = sess.query(Investor).filter(Investor.name == investment.name).one() logging.info(f"New mature investment: {investment.comment}") logging.info(f" -- by {investor.name}") # Retrieve the post the user invested in (lazily, no API call) post = reddit.submission(investment.post) # Retrieve the post's current upvote count (triggers an API call) upvotes_now = post.ups investment.final_upvotes = upvotes_now # Updating the investor's balance factor = formula.calculate(upvotes_now, investment.upvotes) amount = investment.amount balance = investor.balance new_balance = int(balance + (amount * factor)) change = new_balance - balance profit = change - amount percent_str = f"{int((profit/amount)*100)}%" # Updating the investor's variables investor.completed += 1 # Retrieve the bot's original response (lazily, no API call) if investment.response != "0": response = reddit.comment(id=investment.response) else: response = EmptyResponse() if new_balance < BalanceCap: investor.balance = new_balance # Edit the bot's response (triggers an API call) if profit > 0: logging.info(f" -- profited {profit}") elif profit == 0: logging.info(f" -- broke even") else: logging.info(f" -- lost {profit}") response.edit_wrap(message.modify_invest_return(investment.amount, investment.upvotes, upvotes_now, change, profit, percent_str, investor.balance)) else: # This investment pushed the investor's balance over the cap investor.balance = BalanceCap # Edit the bot's response (triggers an API call) logging.info(f" -- profited {profit} but got capped") response.edit_wrap(message.modify_invest_capped(investment.amount, investment.upvotes, upvotes_now, change, profit, percent_str, investor.balance)) investment.success = (profit > 0) investment.profit = profit investment.done = True sess.commit() # Measure how long processing took duration = stopwatch.measure() logging.info(f" -- processed in {duration:5.2f}s") # Report the Reddit API call stats rem = int(reddit.auth.limits['remaining']) res = int(reddit.auth.limits['reset_timestamp'] - time.time()) logging.info(f" -- API calls remaining: {rem:3d}, resetting in {res:3d}s") except prawcore.exceptions.OAuthException as e_creds: traceback.print_exc() logging.error(e_creds) logging.critical("Invalid login credentials. Check your .env!") logging.critical("Fatal error. Cannot continue or fix the problem. Bailing out...") exit() except Exception as e: logging.error(e) traceback.print_exc() time.sleep(10) finally: sess.close()
def main(): logging.info("Starting calculator") killhandler = KillHandler() engine = create_engine(config.db, pool_recycle=60) sm = sessionmaker(bind=engine) reddit = praw.Reddit(client_id=config.client_id, client_secret=config.client_secret, username=config.username, password=config.password, user_agent=config.user_agent) praw.models.Comment.edit_wrap = edit_wrap stopwatch = Stopwatch() logging.info("Monitoring active investments...") while not killhandler.killed: try: sess = sm() then = int(time.time()) - config.investment_duration investment = sess.query(Investment).\ filter(Investment.done == 0).\ filter(Investment.time < then).\ order_by(Investment.time.asc()).\ first() if not investment: # Nothing matured yet; wait a bit before trying again time.sleep(5) continue duration = stopwatch.measure() investor = sess.query(Investor).filter(Investor.name == investment.name).one() logging.info(f"New mature investment: {investment.comment}") logging.info(f" -- by {investor.name}") if investment.response != "0": response = reddit.comment(id=investment.response) else: response = EmptyResponse() post = reddit.submission(investment.post) upvotes_now = post.ups # <--- triggers a Reddit API call # Updating the investor's balance factor = formula.calculate(upvotes_now, investment.upvotes) amount = investment.amount balance = investor.balance new_balance = int(balance + (amount * factor)) change = new_balance - balance profit = change - amount profit_str = f"{int((profit/amount)*100)}%" # Updating the investor's variables investor.completed += 1 investor.balance = new_balance # Editing the comment as a confirmation text = response.body # <--- triggers a Reddit API call if profit > 0: logging.info(f" -- profited {profit}") response.edit_wrap(message.modify_invest_return(text, upvotes_now, change, profit_str, new_balance)) elif profit == 0: logging.info(f" -- broke even") response.edit_wrap(message.modify_invest_break_even(text, upvotes_now, change, profit_str, new_balance)) else: lost_memes = int( amount - change ) logging.info(f" -- lost {profit}") response.edit_wrap(message.modify_invest_lose(text, upvotes_now, lost_memes, profit_str, new_balance)) investment.success = (profit > 0) investment.profit = profit investment.done = True sess.commit() # Measure how long processing took duration = stopwatch.measure() logging.info(f" -- processed in {duration:5.2f}s") # Report the Reddit API call stats rem = int(reddit.auth.limits['remaining']) res = int(reddit.auth.limits['reset_timestamp'] - time.time()) logging.info(f" -- API calls remaining: {rem:3d}, resetting in {res:3d}s") except Exception as e: logging.error(e) traceback.print_exc() time.sleep(10) finally: sess.close()