Мануал Corsair - Auto Market Purchase

orohimaru2

Выдающийся
Местный
Сообщения
57
Розыгрыши
0
Репутация
114
Реакции
199
Баллы
1 388
Автор не я взял с Англ сайта
Приветствую. Я играл в одиночку, поэтому мне хотелось более реалистичной атмосферы Центрального рынка.
Я решил написать небольшую программу, которая будет покупать все мои товары на рынке за определённый процент, а затем отправлять мне вырученные средства по почте.


1. Установите Python. Я использую версию 3.9.5, которая устанавливается вместе с установкой Corsair.
2. Используйте планировщик заданий, чтобы вызывать этот скрипт так часто, как вам нужно.
3. Игрокам не нужно выходить из системы. Открыв рынок, они увидят, что было продано, но не смогут с этим взаимодействовать. Когда выставят что-либо на продажу, список обновится, отображая только то, что выставили.
4. Отредактируйте код, чтобы изменить процент, который будет отправлен игроку.
5. Для этого требуется sendMail, который можно найти в моем посте здесь о Центральном/Черном рынке, который я создал (примерно в середине страницы находятся инструкции по отправке почты.

ПРИМЕЧАНИЯ:
1. TAX_RATE можно изменить. Это то, что вычитается из покупки.
2. Ключ серебряного предмета используется для указания того, что отправляется игроку.
3. Sender_User_No = 1 (Это учетная запись администратора, которую я использую для заполнения рынка. Я не хочу покупать все предметы по умолчанию. Я напишу, как заполнить рынок далее).
Код:
import pandas as pd
import pyodbc
import subprocess
import os

# --- Configuration ---
SERVER_TRADE = 'localhost'
DATABASE_TRADE = 'SA_BETA_TRADEDB_0002'

SERVER_WORLD = 'localhost'
DATABASE_WORLD = 'SA_BETA_WORLDDB_0002'

TAX_RATE = 0.15
SILVER_ITEM_KEY = 1
SENDER_USER_NO = 1

def get_users_with_market_items():
    conn_str = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={SERVER_TRADE};DATABASE={DATABASE_TRADE};Trusted_Connection=yes'
    with pyodbc.connect(conn_str) as conn:
        cursor = conn.cursor()
        cursor.execute("""
            SELECT DISTINCT _userNo
            FROM [PaGamePrivate].[TblWorldMarketBiddingSell]
            WHERE _userNo != 1
        """)
        return [row[0] for row in cursor.fetchall()]

def purchase_and_mail_items(target_user_no):
    cnxn_trade = None
    cnxn_world = None
   
    try:
        # --- Connect to Trade DB ---
        conn_str_trade = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={SERVER_TRADE};DATABASE={DATABASE_TRADE};Trusted_Connection=yes'
        cnxn_trade = pyodbc.connect(conn_str_trade)
        cursor_trade = cnxn_trade.cursor()
        cnxn_trade.autocommit = False
        print(f"\n--- Processing _userNo={target_user_no} ---")
        print(f"Connected to Trade DB '{DATABASE_TRADE}'.")

        select_query = """
        SELECT _sellNo, _mainKey, _subKey, _leftCount, _pricePerOne
        FROM [PaGamePrivate].[TblWorldMarketBiddingSell]
        WHERE _userNo = ?;
        """
        cursor_trade.execute(select_query, target_user_no)
        items_to_process = cursor_trade.fetchall()

        if not items_to_process:
            print("No market items. Skipping.")
            cnxn_trade.rollback()
            return False

        total_sale_value = 0
        deleted_sell_nos = []
        for item in items_to_process:
            sell_no, main_key, sub_key, left_count, price_per_one = item
            item_total = left_count * price_per_one
            total_sale_value += item_total
            deleted_sell_nos.append(sell_no)
            print(f"  - Item: {main_key}, Qty: {left_count}, Price: {price_per_one}, Total: {item_total}")

        tax_amount = int(total_sale_value * TAX_RATE)
        net_silver_to_send = total_sale_value - tax_amount
        print(f"  Total: {total_sale_value}, Tax: {tax_amount}, Net: {net_silver_to_send}")

        delete_placeholders = ', '.join(['?'] * len(deleted_sell_nos))
        delete_query = f"DELETE FROM [PaGamePrivate].[TblWorldMarketBiddingSell] WHERE _sellNo IN ({delete_placeholders});"
        cursor_trade.execute(delete_query, *deleted_sell_nos)
        cnxn_trade.commit()
        print("Items deleted.")

        if net_silver_to_send <= 0:
            print("No silver to send. Skipping mail.")
            return True

        # --- Get user nickname ---
        conn_str_world = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={SERVER_WORLD};DATABASE={DATABASE_WORLD};Trusted_Connection=yes'
        cnxn_world = pyodbc.connect(conn_str_world)
        cursor_world = cnxn_world.cursor()
        cursor_world.execute("SELECT _userNickname FROM [PaGamePrivate].[TblUserInformation] WHERE _userNo = ?;", target_user_no)
        row = cursor_world.fetchone()

        if not row:
            print("Nickname not found. Skipping mail.")
            return False

        nickname = row[0]
        print(f"Sending {net_silver_to_send} silver to '{nickname}'...")
        result = subprocess.call(["python", "Send_Mail.py", nickname, str(net_silver_to_send)])
        if result != 0:
            print(f"Send_Mail.py failed with code {result}")
            return False

        print("Mail sent.")
        return True

    except Exception as ex:
        print("ERROR:", ex)
        if cnxn_trade and not cnxn_trade.autocommit:
            cnxn_trade.rollback()
        return False
    finally:
        if cnxn_trade:
            cnxn_trade.close()
        if cnxn_world:
            cnxn_world.close()

if __name__ == "__main__":
    users = get_users_with_market_items()
    print(f"Found {len(users)} users with items listed.\n")

    for user_no in users:
        purchase_and_mail_items(user_no)
 
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше…