Автор не я взял с Англ сайта
Приветствую. Я играл в одиночку, поэтому мне хотелось более реалистичной атмосферы Центрального рынка.
Я решил написать небольшую программу, которая будет покупать все мои товары на рынке за определённый процент, а затем отправлять мне вырученные средства по почте.
1. Установите Python. Я использую версию 3.9.5, которая устанавливается вместе с установкой Corsair.
2. Используйте планировщик заданий, чтобы вызывать этот скрипт так часто, как вам нужно.
3. Игрокам не нужно выходить из системы. Открыв рынок, они увидят, что было продано, но не смогут с этим взаимодействовать. Когда выставят что-либо на продажу, список обновится, отображая только то, что выставили.
4. Отредактируйте код, чтобы изменить процент, который будет отправлен игроку.
5. Для этого требуется sendMail, который можно найти в моем посте здесь о Центральном/Черном рынке, который я создал (примерно в середине страницы находятся инструкции по отправке почты.
ПРИМЕЧАНИЯ:
1. TAX_RATE можно изменить. Это то, что вычитается из покупки.
2. Ключ серебряного предмета используется для указания того, что отправляется игроку.
3. Sender_User_No = 1 (Это учетная запись администратора, которую я использую для заполнения рынка. Я не хочу покупать все предметы по умолчанию. Я напишу, как заполнить рынок далее).
Приветствую. Я играл в одиночку, поэтому мне хотелось более реалистичной атмосферы Центрального рынка.
Я решил написать небольшую программу, которая будет покупать все мои товары на рынке за определённый процент, а затем отправлять мне вырученные средства по почте.
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)