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
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 1 addition & 3 deletions src/OSBC.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 ============
Expand Down
60 changes: 44 additions & 16 deletions src/model/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand All @@ -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.")

Expand Down Expand Up @@ -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):
Expand All @@ -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):
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand All @@ -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:
"""
Expand All @@ -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
Expand All @@ -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:
"""
Expand All @@ -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):
Expand Down Expand Up @@ -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()

Expand Down Expand Up @@ -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)
Expand All @@ -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:
Expand Down
14 changes: 14 additions & 0 deletions src/model/near_reality/combat.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 14 additions & 0 deletions src/model/near_reality/fishing.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 14 additions & 0 deletions src/model/near_reality/mining.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 14 additions & 0 deletions src/model/near_reality/pickpocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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():
Expand Down Expand Up @@ -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
Expand Down
14 changes: 14 additions & 0 deletions src/model/near_reality/woodcutting.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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.")
Expand All @@ -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
Expand Down
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