Skip to content
This repository was archived by the owner on Jun 3, 2024. It is now read-only.

Changes client detection / bot initialization. #150

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
1 change: 0 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -8,7 +8,6 @@ mss==7.0.1
numpy==1.23.1
opencv_python_headless==4.5.4.60
opencv-python==4.5.4.60
pandas==1.5.0
Pillow==9.3.0
pre-commit==2.20.0
psutil==5.9.4
4 changes: 1 addition & 3 deletions src/OSBC.py
Original file line number Diff line number Diff line change
@@ -2,11 +2,9 @@
import pathlib
import tkinter
from typing import List

import customtkinter
from PIL import Image, ImageTk
from pynput import keyboard

import utilities.settings as settings
from controller.bot_controller import BotController, MockBotController
from model import Bot, RuneLiteBot
@@ -69,7 +67,7 @@ def build_ui(self): # sourcery skip: merge-list-append, move-assign-in-block
self.frame_left.grid_rowconfigure(19, minsize=20) # empty row with minsize as spacing (adds a top padding to settings btn)
self.frame_left.grid_rowconfigure(21, minsize=10) # empty row with minsize as spacing (bottom padding below settings btn)

self.label_1 = customtkinter.CTkLabel(master=self.frame_left, text="Scripts", text_font=("Roboto Medium", 14))
self.label_1 = customtkinter.CTkLabel(master=self.frame_left, text="Scripts", font=("Roboto Medium", 14))
self.label_1.grid(row=1, column=0, pady=10, padx=10)

# ============ View/Controller Configuration ============
60 changes: 44 additions & 16 deletions src/model/bot.py
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@
A Bot is a base class for bot script models. It is abstract and cannot be instantiated. Many of the methods in this base class are
pre-implemented and can be used by subclasses, or called by the controller. Code in this class should not be modified.
"""

import ctypes
import platform
import re
@@ -11,20 +12,18 @@
from abc import ABC, abstractmethod
from enum import Enum
from typing import List, Union

import customtkinter
import numpy as np
import pyautogui as pag
import numpy as np
import pytweening
from deprecated import deprecated

import utilities.color as clr
import utilities.debug as debug
import utilities.imagesearch as imsearch
import utilities.ocr as ocr
import utilities.random_util as rd
from utilities.geometry import Point, Rectangle
from utilities.mouse import Mouse
from utilities.RIOmouse import Mouse
from utilities.options_builder import OptionsBuilder
from utilities.window import Window, WindowInitializationError

@@ -38,8 +37,10 @@ def __init__(self, target: callable):

def run(self):
try:
print("Thread started.")
print("Thread started.here")
#maybe try running mouse here
self.target()

finally:
print("Thread stopped successfully.")

@@ -79,11 +80,13 @@ class BotStatus(Enum):


class Bot(ABC):
mouse = Mouse()


options_set: bool = False
progress: float = 0
status = BotStatus.STOPPED
thread: BotThread = None


@abstractmethod
def __init__(self, game_title, bot_title, description, window: Window):
@@ -101,6 +104,7 @@ def __init__(self, game_title, bot_title, description, window: Window):
self.description = description
self.options_builder = OptionsBuilder(bot_title)
self.win = window


@abstractmethod
def main_loop(self):
@@ -152,6 +156,11 @@ def play(self):
except WindowInitializationError as e:
self.log_msg(str(e))
return
#from utilities.mouse import Mouse
self.clientpid = Mouse.clientpidSet
self.RemoteInputEnabled = Mouse.RemoteInputEnabledSet
print(self.RemoteInputEnabled)
self.mouse = Mouse(self.clientpid,RemoteInputEnabled=self.RemoteInputEnabled)
self.reset_progress()
self.set_status(BotStatus.RUNNING)
self.thread = BotThread(target=self.main_loop)
@@ -248,7 +257,11 @@ def drop_all(self, skip_rows: int = 0, skip_slots: List[int] = None) -> None:
row_skip = list(range(skip_rows * 4))
skip_slots = np.unique(row_skip + skip_slots)
# Start dropping
pag.keyDown("shift")
if self.RemoteInputEnabled == True:
self.mouse.send_modifer_key(401,"shift")
else:
pag.keyDown("shift")

for i, slot in enumerate(self.win.inventory_slots):
if i in skip_slots:
continue
@@ -262,7 +275,10 @@ def drop_all(self, skip_rows: int = 0, skip_slots: List[int] = None) -> None:
tween=pytweening.easeInOutQuad,
)
self.mouse.click()
pag.keyUp("shift")
if self.RemoteInputEnabled == True:
self.mouse.send_modifer_key(402,"shift")
else:
pag.keyUp("shift")

def drop(self, slots: List[int]) -> None:
"""
@@ -271,7 +287,10 @@ def drop(self, slots: List[int]) -> None:
slots: The indices of slots to drop.
"""
self.log_msg("Dropping items...")
pag.keyDown("shift")
if self.RemoteInputEnabled == True:
self.mouse.send_modifer_key(401,"shift")
else:
pag.keyDown("shift")
for i, slot in enumerate(self.win.inventory_slots):
if i not in slots:
continue
@@ -284,8 +303,11 @@ def drop(self, slots: List[int]) -> None:
offsetBoundaryX=40,
tween=pytweening.easeInOutQuad,
)
pag.click()
pag.keyUp("shift")
self.mouse.click()
if self.RemoteInputEnabled == True:
self.mouse.send_modifer_key(402,"shift")
else:
pag.keyUp("shift")

def friends_nearby(self) -> bool:
"""
@@ -309,6 +331,7 @@ def logout(self): # sourcery skip: class-extract-method
self.mouse.click()
time.sleep(1)
self.mouse.move_rel(0, -53, 5, 5)
time.sleep(1)
self.mouse.click()

def take_break(self, min_seconds: int = 1, max_seconds: int = 30, fancy: bool = False):
@@ -456,7 +479,7 @@ def set_compass_south(self):
def __compass_right_click(self, msg, rel_y):
self.log_msg(msg)
self.mouse.move_to(self.win.compass_orb.random_point())
pag.rightClick()
self.mouse.right_click()
self.mouse.move_rel(0, rel_y, 5, 2)
self.mouse.click()

@@ -485,9 +508,14 @@ def move_camera(self, horizontal: int = 0, vertical: int = 0):
direction_v = "down" if vertical < 0 else "up"

def keypress(direction, duration):
pag.keyDown(direction)
time.sleep(duration)
pag.keyUp(direction)
if self.RemoteInputEnabled == True:
self.mouse.send_arrow_key(401,direction)
time.sleep(duration)
self.mouse.send_arrow_key(402,direction)
else:
pag.keyDown(direction)
time.sleep(duration)
pag.keyUp(direction)

thread_h = threading.Thread(target=keypress, args=(direction_h, sleep_h), daemon=True)
thread_v = threading.Thread(target=keypress, args=(direction_v, sleep_v), daemon=True)
@@ -513,7 +541,7 @@ def toggle_auto_retaliate(self, toggle_on: bool):
self.log_msg(f"Toggling auto retaliate {state}...")
# click the combat tab
self.mouse.move_to(self.win.cp_tabs[0].random_point())
pag.click()
self.mouse.click()
time.sleep(0.5)

if toggle_on:
14 changes: 14 additions & 0 deletions src/model/near_reality/combat.py
Original file line number Diff line number Diff line change
@@ -17,21 +17,35 @@ def __init__(self):
self.running_time = 15
self.should_loot = False
self.should_bank = False
self.Client_Info = None
self.win_name = None
self.pid_number = None

def create_options(self):
self.options_builder.add_slider_option("running_time", "How long to run (minutes)?", 1, 500)
self.options_builder.add_process_selector("Client_Info")

def save_options(self, options: dict):
for option in options:
if option == "running_time":
self.running_time = options[option]
self.log_msg(f"Running time: {self.running_time} minutes.")
elif option == "Client_Info":
self.Client_Info = options[option]
client_info = str(self.Client_Info)
win_name, pid_number = client_info.split(" : ")
self.win_name = win_name
self.pid_number = int(pid_number)
self.win.window_title = self.win_name
self.win.window_pid = self.pid_number
else:
self.log_msg(f"Unknown option: {option}")
print("Developer: ensure that the option keys are correct, and that options are being unpacked correctly.")
self.options_set = False
return
self.log_msg(f"Bot will run for {self.running_time} minutes.")
self.log_msg(f"{self.win_name}")
self.log_msg(f"{self.pid_number}")
self.options_set = True

def main_loop(self): # sourcery skip: low-code-quality
14 changes: 14 additions & 0 deletions src/model/near_reality/fishing.py
Original file line number Diff line number Diff line change
@@ -16,21 +16,35 @@ def __init__(self):
description = "This bot fishes... fish. Position your character near a tagged fishing spot, and press play."
super().__init__(bot_title=title, description=description)
self.running_time = 2
self.Client_Info = None
self.win_name = None
self.pid_number = None

def create_options(self):
self.options_builder.add_slider_option("running_time", "How long to run (minutes)?", 1, 500)
self.options_builder.add_process_selector("Client_Info")

def save_options(self, options: dict):
for option in options:
if option == "running_time":
self.running_time = options[option]
elif option == "Client_Info":
self.Client_Info = options[option]
client_info = str(self.Client_Info)
win_name, pid_number = client_info.split(" : ")
self.win_name = win_name
self.pid_number = int(pid_number)
self.win.window_title = self.win_name
self.win.window_pid = self.pid_number
else:
self.log_msg(f"Unknown option: {option}")
print("Developer: ensure that the option keys are correct, and that options are being unpacked correctly.")
self.options_set = False
return
self.log_msg(f"Bot will run for {self.running_time} minutes.")
self.log_msg("Options set successfully.")
self.log_msg(f"{self.win_name}")
self.log_msg(f"{self.pid_number}")
self.options_set = True

def main_loop(self): # sourcery skip: low-code-quality, use-named-expression
14 changes: 14 additions & 0 deletions src/model/near_reality/mining.py
Original file line number Diff line number Diff line change
@@ -18,24 +18,38 @@ def __init__(self):
super().__init__(bot_title=title, description=description)
self.running_time = 2
self.logout_on_friends = False
self.Client_Info = None
self.win_name = None
self.pid_number = None

def create_options(self):
self.options_builder.add_slider_option("running_time", "How long to run (minutes)?", 1, 360)
self.options_builder.add_dropdown_option("logout_on_friends", "Logout when friends are nearby?", ["Yes", "No"])
self.options_builder.add_process_selector("Client_Info")

def save_options(self, options: dict):
for option in options:
if option == "running_time":
self.running_time = options[option]
elif option == "logout_on_friends":
self.logout_on_friends = options[option] == "Yes"
elif option == "Client_Info":
self.Client_Info = options[option]
client_info = str(self.Client_Info)
win_name, pid_number = client_info.split(" : ")
self.win_name = win_name
self.pid_number = int(pid_number)
self.win.window_title = self.win_name
self.win.window_pid = self.pid_number
else:
self.log_msg(f"Unknown option: {option}")
print("Developer: ensure that the option keys are correct, and that options are being unpacked correctly.")
self.options_set = False
return
self.log_msg(f"Running time: {self.running_time} minutes.")
self.log_msg(f'Bot will {"" if self.logout_on_friends else "not"} logout when friends are nearby.')
self.log_msg(f"{self.win_name}")
self.log_msg(f"{self.pid_number}")
self.options_set = True

def main_loop(self): # sourcery skip: low-code-quality
14 changes: 14 additions & 0 deletions src/model/near_reality/pickpocket.py
Original file line number Diff line number Diff line change
@@ -27,6 +27,9 @@ def __init__(self):
self.should_click_coin_pouch = True
self.should_drop_inv = True
self.protect_rows = 5
self.Client_Info = None
self.win_name = None
self.pid_number = None

def create_options(self):
self.options_builder.add_slider_option("running_time", "How long to run (minutes)?", 1, 360)
@@ -39,6 +42,7 @@ def create_options(self):
self.options_builder.add_dropdown_option("should_click_coin_pouch", "Does this NPC drop coin pouches?", ["Yes", "No"])
self.options_builder.add_dropdown_option("should_drop_inv", "Drop inventory?", ["Yes", "No"])
self.options_builder.add_slider_option("protect_rows", "If dropping, protect rows?", 0, 6)
self.options_builder.add_process_selector("Client_Info")

def save_options(self, options: dict): # sourcery skip: low-code-quality
for option, res in options.items():
@@ -79,11 +83,21 @@ def save_options(self, options: dict): # sourcery skip: low-code-quality
elif option == "protect_rows":
self.protect_rows = options[option]
self.log_msg(f"Protecting first {self.protect_rows} row(s) when dropping inventory.")
elif option == "Client_Info":
self.Client_Info = options[option]
client_info = str(self.Client_Info)
win_name, pid_number = client_info.split(" : ")
self.win_name = win_name
self.pid_number = int(pid_number)
self.win.window_title = self.win_name
self.win.window_pid = self.pid_number
else:
self.log_msg(f"Unknown option: {option}")
print("Developer: ensure that the option keys are correct, and that options are being unpacked correctly.")
self.options_set = False
return
self.log_msg(f"{self.win_name}")
self.log_msg(f"{self.pid_number}")
self.options_set = True

def main_loop(self): # sourcery skip: low-code-quality, use-named-expression
14 changes: 14 additions & 0 deletions src/model/near_reality/woodcutting.py
Original file line number Diff line number Diff line change
@@ -14,11 +14,15 @@ def __init__(self):
self.running_time = 1
self.protect_slots = 0
self.logout_on_friends = True
self.Client_Info = None
self.win_name = None
self.pid_number = None

def create_options(self):
self.options_builder.add_slider_option("running_time", "How long to run (minutes)?", 1, 500)
self.options_builder.add_slider_option("protect_slots", "When dropping, protect first x slots:", 0, 4)
self.options_builder.add_dropdown_option("logout_on_friends", "Logout when friends are nearby?", ["Yes", "No"])
self.options_builder.add_process_selector("Client_Info")

def save_options(self, options: dict):
for option in options:
@@ -28,6 +32,14 @@ def save_options(self, options: dict):
self.protect_slots = options[option]
elif option == "logout_on_friends":
self.logout_on_friends = options[option] == "Yes"
elif option == "Client_Info":
self.Client_Info = options[option]
client_info = str(self.Client_Info)
win_name, pid_number = client_info.split(" : ")
self.win_name = win_name
self.pid_number = int(pid_number)
self.win.window_title = self.win_name
self.win.window_pid = self.pid_number
else:
self.log_msg(f"Unknown option: {option}")
print("Developer: ensure that the option keys are correct, and that options are being unpacked correctly.")
@@ -36,6 +48,8 @@ def save_options(self, options: dict):
self.log_msg(f"Running time: {self.running_time} minutes.")
self.log_msg(f"Protect slots: {self.protect_slots}.")
self.log_msg("Bot will not logout when friends are nearby.")
self.log_msg(f"{self.win_name}")
self.log_msg(f"{self.pid_number}")
self.options_set = True

def main_loop(self): # sourcery skip: low-code-quality
1 change: 1 addition & 0 deletions src/model/osrs/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
from .combat.combat import OSRSCombat
from .woodcutter import OSRSWoodcutter
from .mining import OSRS_Mining
Loading