Untitled

 avatar
unknown
plain_text
a year ago
21 kB
8
Indexable
from highrise import BaseBot, CurrencyItem, Item, Position, Reaction, SessionMetadata, User
from typing import Optional, Dict, Union

from highrise import *
from highrise.models import *
import asyncio
from asyncio import Task
import os
import importlib.util
import time
import random
from websockets.exceptions import ConnectionClosed
import re
import socket
user_task_map = {}

usernames = [
    "JimmyBey",
    "YusufSinns",
    "Forzo404",
    "chinarro",
    "izHirry",
    "syndicatexe",
    "TheSanji",
    "Suriyelicarsafi",
    "uzivice",
    "TBO28",
    "ITraxy",
    "B4TUESCOB4R",
    "pengumen",
    "avenger08",
    "M4ST1",
    "Jerey",
    "Batukekocu",
    "ELXAANN",
    "EFUL1M01",
    "iKousei",
    "u.c.a.r.20",
    "1CcRuuaz",
    "MehmetHKT",
    "aroeye",
    "awelll1",
    "Oguzhainzz"
]

dance_emotes = [
    "dance-dontstartnow",
    "dance-russian",
    "dance-macarena",
    "dance-hype",
    "dance-jinglebell",
    "dance-tiktok9",
    "dance-weird",
    "dance-tiktok10",
    "dance-anime",
    "dance-icecream",
    "dance-wrong",
    "dance-employee",
    "dance-touch",
    "dance-pinguin",
    "dance-creepypuppet",
    "dance-shoppingcart",
    "dance-blackpink",
]

timed_free_emotes_list = [
    {'value': 'none','text': 'none', 'time': 0},
    {'value': 'sit-relaxed', 'text': 'relaxed', 'time': 29.889858},
    {'value': 'emote-kissing-bound', 'text': 'Sweet Smooch', 'time': 5},
    {'value': 'idle-loop-sitfloor', 'text': 'Sit', 'time': 22.321055},
    {'value': 'idle-enthusiastic', 'text': 'Enthused', 'time': 15.941537},
    {'value': 'emote-yes', 'text': 'Yes', 'time': 2.565001},
    {'value': 'emote-wave', 'text': 'The Wave', 'time': 2.690873},
    {'value': 'emote-tired', 'text': 'Tired', 'time': 4.61063},
    {'value': "emote-zombierun", 'text': "Zombie Run", 'time': 10 },
    {'value': 'emote-snowball', 'text': 'Snowball Fight!', 'time': 5.230467},
    {'value': 'emote-snowangel', 'text': 'Snow Angel', 'time': 6.218627},
    {'value': 'emote-shy', 'text': 'Shy', 'time': 4.477567},
    {'value': 'emote-sad', 'text': 'Sad', 'time': 5.411073},
    {'value': 'emote-no', 'text': 'No', 'time': 2.703034},
    {'value': 'emote-model', 'text': 'Model', 'time': 6.490173},
    {'value': 'emote-lust', 'text': 'Flirty Wave', 'time': 4.655965},
    {'value': 'emote-laughing', 'text': 'Laugh', 'time': 2.69161},
    {'value': 'emote-kiss', 'text': 'Kiss', 'time': 2.387175},
    {'value': 'emote-hot', 'text': 'Sweating', 'time': 4.353037},
    {'value': 'emote-hello', 'text': 'Hello', 'time': 2.734844},
    {'value': 'emote-greedy', 'text': 'Greedy', 'time': 4.639828},
    {'value': 'emote-curtsy', 'text': 'Curtsy', 'time': 2.425714},
    {'value': 'emote-confused', 'text': 'Confusion', 'time': 8.578827},
    {'value': 'emote-charging', 'text': 'Charging', 'time': 8.025079},
    {'value': 'emote-bow', 'text': 'Bow', 'time': 3.344036},
    {'value': 'emoji-thumbsup', 'text': 'Thumbs Up', 'time': 2.702369},
    {'value': 'emoji-gagging', 'text': 'Tummy Ache', 'time': 5.500202},
    {'value': 'emoji-flex', 'text': 'Flex', 'time': 2.099351},
    {'value': 'emoji-cursing', 'text': 'Cursing Emote', 'time': 2.382069},
    {'value': 'emoji-celebrate', 'text': 'Raise The Roof', 'time': 3.412258},
    {'value': 'emoji-angry', 'text': 'Angry', 'time': 5.760023},
    {'value': 'dance-tiktok8', 'text': 'Savage Dance', 'time': 10.938702},
    {'value': 'dance-tiktok2', 'text': "Don't Start Now", 'time': 10.392353},
    {'value': 'dance-shoppingcart', 'text': "Let's Go Shopping", 'time': 4.316035},
    {'value': 'dance-russian', 'text': 'Russian Dance', 'time': 10.252905},
    {'value': 'dance-pennywise', 'text': "Penny's Dance", 'time': 1.214349},
    {'value': 'dance-macarena', 'text': 'Macarena', 'time': 12.214141},
    {'value': 'dance-blackpink', 'text': 'K-Pop Dance', 'time': 7.150958},
    {'value': 'emote-hyped', 'text': 'Hyped', 'time': 7.492423},
    {'value': 'dance-jinglebell', 'text': 'JingleHop', 'time': 10.958832},
    {'value': 'idle-nervous', 'text': 'Nervous', 'time': 21.714221},
    {'value': 'idle-toilet', 'text': 'Toilet', 'time': 32.174447},
    {'value': 'emote-astronaut', 'text': '#Zero', 'time': 13.791175},
    {'value': 'emote-hearteyes', 'text': 'Heart Eyes', 'time': 4.034386},
    {'value': 'emote-swordfight', 'text': 'Swordfight', 'time': 5.914365},
    {'value': 'emote-timejump', 'text': 'TimeJump', 'time': 4.007305},
    {'value': 'emote-snake', 'text': 'Snake', 'time': 5.262578},
    {'value': 'emote-float', 'text': 'Float', 'time': 8.995302},
    {'value': 'emote-telekinesis', 'text': 'Telekinesis', 'time': 10.492032},
    {'value': 'dance-pinguin', 'text': 'Penguin dance', 'time': 11.58291},
    {'value': 'dance-creepypuppet', 'text': 'Creepy puppet', 'time': 6.416121},
    {'value': 'emote-sleigh', 'text': 'Sleigh', 'time': 11.333165},
    {'value': 'emote-maniac', 'text': 'Maniac', 'time': 4.906886},
    {'value': 'emote-energyball', 'text': 'Energy Ball', 'time': 7.575354},
    {'value': 'idle_singing', 'text': 'Singing', 'time': 10.260182},
    {'value': 'emote-frog', 'text': 'Frog', 'time': 14.55257},
    {'value': 'emote-superpose', 'text': 'Superpose', 'time': 4.530791},
    {'value': 'emote-cute', 'text': 'Cute', 'time': 6.170464},
    {'value': 'dance-tiktok9', 'text': 'TikTok Dance 9', 'time': 11.892918},
    {'value': 'dance-weird', 'text': 'Weird Dance', 'time': 21.556237},
    {'value': 'dance-tiktok10', 'text': 'TikTok Dance 10', 'time': 8.225648},
    {'value': 'emote-pose7', 'text': 'Pose 7', 'time': 4.655283},
    {'value': 'emote-pose8', 'text': 'Pose 8', 'time': 4.808806},
    {'value': 'idle-dance-casual', 'text': 'Casual Dance', 'time': 9.079756},
    {'value': 'emote-pose1', 'text': 'Pose 1', 'time': 2.825795},
    {'value': 'emote-pose3', 'text': 'Pose 3', 'time': 5.10562},
    {'value': 'emote-pose5', 'text': 'Pose 5', 'time': 4.621532},
    {'value': 'emote-cutey', 'text': 'Cutey', 'time': 3.26032},
    {'value': 'emote-punkguitar', 'text': 'Punk Guitar', 'time': 9.365807},
    {'value': 'emote-fashionista', 'text': 'Fashionista', 'time': 5.606485},
    {'value': 'emote-gravity', 'text': 'Gravity', 'time': 8.955966},
    {'value': 'dance-icecream', 'text': 'Ice Cream Dance', 'time': 14.769573},
    {'value': 'dance-wrong', 'text': 'Wrong Dance', 'time': 12.422389},
    {'value': 'idle-uwu', 'text': 'UwU', 'time': 24.761968},
    {'value': 'idle-dance-tiktok4', 'text': 'TikTok Dance 4', 'time': 15.500708},
    {'value': 'dance-pinguin', 'text': 'Penguin dance', 'time': 15.500708},
    {'value': 'dance-russian', 'text': 'Dance Russian', 'time': 10.252905},
    {'value': 'emote-shy2', 'text': 'Advanced Shy', 'time': 4.989278},
    {'value': 'dance-anime', 'text': 'Anime Dance', 'time': 8.46671},
    {'value': 'dance-kawai', 'text': 'Kawaii', 'time': 10.290789},
    {'value': 'idle-wild', 'text': 'Scritchy', 'time': 26.422824},
    {'value': 'emote-iceskating', 'text': 'Ice Skating', 'time': 7.299156},
    {'value': 'emote-pose6', 'text': 'SurpriseBig', 'time': 5.375124},
    {'value': 'emote-celebrationstep', 'text': 'Celebration Step', 'time': 3.353703},
    {'value': 'emote-creepycute', 'text': 'Creepycute', 'time': 7.902453},
    {'value': 'emote-pose10', 'text': 'Pose 10', 'time': 3.989871},
    {'value': 'emote-boxer', 'text': 'Boxer', 'time': 5.555702},
    {'value': 'emote-headblowup', 'text': 'Head Blowup', 'time': 11.667537},
    {'value': 'emote-pose9', 'text': 'Ditzy Pose', 'time': 4.583117},
    {'value': 'emote-teleporting', 'text': 'Teleporting', 'time': 11.7676},
    {"value": "dance-touch", "text": "Touch", "time": 11.7},
    {"value": "idle-guitar", "text": "Air Guitar", "time": 13.229398},
    {"value": "emote-gift", "text": "This Is For You", "time": 5.8},
    {"value": "dance-employee", "text": "Push it", "time": 8},
    {"value": "emote-cutesalute", "text": "Cute Salute", "time": 8},
    {"value": "emote-salute", "text": "Salute", "time": 8},
]

class TaskGroup:
    def __init__(self):
        self.tasks = {}

    async def create_task(self, coro, name):
        task = asyncio.create_task(coro)
        self.tasks[name] = task

    async def cancel_task(self, name):
        if name in self.tasks:
            self.tasks[name].cancel()
            del self.tasks[name]

class Bot(BaseBot):
    def __init__(self):
        self.taskgroup = TaskGroup()
        self.user_follow_tasks_map = {}
    
    async def command_handler(self, user: User, message: str, number: int):
        command = message
                
        functions_folder = "functions"
        # Check if the function exists in the module
        for file_name in os.listdir(functions_folder):
            if file_name.endswith(".py"):
                module_name = file_name[:-3]  # Remove the '.py' extension
                module_path = os.path.join(functions_folder, file_name)
                
                # Load the module
                spec = importlib.util.spec_from_file_location(module_name, module_path)
                module = importlib.util.module_from_spec(spec)
                spec.loader.exec_module(module)
                
                # Check if the function exists in the module
                if hasattr(module, command) and callable(getattr(module, command)):
                    function = getattr(module, command)
                    await function(self, user, number)
        return

    async def on_start(self, session_metadata: SessionMetadata) -> None:
        await self.highrise.chat(f"vip")
        await self.highrise.teleport(user_id="663e07a881544f2ccb7d962b", dest=Position(float(10.5), float(13.25), float(7.5)))  


        
           

    async def send_continuous_random_emotes_in_dance_floor(self):
        emote_duration_mapping = {
            "dance-russian": 3,
            "dance-macarena": 3,
            "dance-jinglebell": 3,
            "dance-tiktok9": 3,
            "dance-weird": 3,
            "dance-tiktok10": 3,
            "dance-anime": 3,
            "dance-icecream": 3,
            "dance-wrong": 3,
            "dance-employee": 3,
            "dance-touch": 3,
            "dance-pinguin": 3,
            "dance-creepypuppet": 3,
            "dance-shoppingcart": 3,
            "dance-blackpink": 3,
        }
        min_x = 3.5
        max_x = 8.5
        min_y = 0.25
        max_y = 0.6  # Since it's a flat plane, the Y-coordinate range remains constant
        min_z = 5.5
        max_z = 10.5

        last_emote_times = {}  # Dictionary to store the last emote time for each user
        user_triggers = {}  # Tracks if a user has been teleported already
        while True:
            try:
                room_users = await self.highrise.get_room_users()
                current_time = time.time()
                for user, position in room_users.content:
                    if isinstance(position, Position):
                        x, y, z = position.x, position.y, position.z
                    else:
                        continue  # Skip non-Position data types
                
                    user_in_region = (min_x <= x <= max_x and min_y <= y <= max_y and min_z <= z <= max_z)
                    if user_in_region:
                        if user_triggers.get(user.id, 0) == 0:
                            # Teleport user slightly and update the trigger to prevent re-teleportation
                            target_position = Position(x + 1, y, z)
                            await self.highrise.teleport(user_id=user.id, dest=target_position)
                            user_triggers[user.id] = 1
                            

                        last_emote_time = last_emote_times.get(user.id, 0)
                        if current_time >= last_emote_time:
                            emote_name = random.choice(list(emote_duration_mapping.keys()))
                            await self.highrise.send_emote(emote_name, user.id)
                            last_emote_times[user.id] = current_time + emote_duration_mapping[emote_name]
                    else:
                        # Reset trigger if user is outside the region
                        if user_triggers.get(user.id, 0) == 1:
                            user_triggers[user.id] = 0
                           
        
            except Exception as e:
                print(f"An error occurred: {str(e)}")

            await asyncio.sleep(2)  # Control the frequency of checks

    async def on_user_join(self, user: User, position: Position | AnchorPosition) -> None:
        """On a user moving in the room."""
        # await self.highrise.chat(f"Nirvanaya hoş geldin 😎 {user.username} ❤️❤️Seni burada görmek güzel😎.")
        await self.highrise.chat(f"OYUN VE VİTRİN ODASINA hoş geldin 😎 {user.username} ❤️❤️Seni burada görmek güzel😎")
        return
    
    async def on_user_leave(self, user: User) -> None:
         await self.highrise.chat(f"{user.username} Hoşçakal yine bekleriz 😎 ")
    async def loop_emote(self: BaseBot, user: User, number_or_name: Union[int, str]) -> None:
        emote_id = ""
        emote_name = ""

        # Use the provided timed_free_emotes_list
        if isinstance(number_or_name, int):
            if 0 <= number_or_name < len(timed_free_emotes_list):
                emote_data = timed_free_emotes_list[number_or_name]
                emote_name = emote_data["text"]
                emote_id = emote_data["value"]
        else:
            for emote_data in timed_free_emotes_list:
                if emote_data["text"].lower() == number_or_name.lower():
                    emote_name = emote_data["text"]
                    emote_id = emote_data["value"]
                    break

        if not emote_id:
            return

        # Check if there is an existing task for the user and cancel it if there is
        if user.username in user_task_map:
            existing_task = user_task_map[user.username]
            existing_task.cancel()



        # Register and start a new task for the user
        user_task_map[user.username] = asyncio.create_task(self.run_emote_loop(user, emote_id, emote_name))
 

    async def run_emote_loop(self, user: User, emote_id: str, emote_name: str):
        user_position = None
        user_in_room = False
        room_users = (await self.highrise.get_room_users()).content
        for room_user, position in room_users:
            if room_user.id == user.id:
                user_position = position
                start_position = position
                user_in_room = True
                break
        if user_position is None:
            await self.highrise.chat("User not found")
            return

        # await self.highrise.chat(f"@{user.username} is looping {emote_name}")

        while start_position == user_position:
            try:
                await self.highrise.send_emote(emote_id, user.id)
            except Exception as e:
                print(f"Error sending emote: {e}")
                return
            emote_duration = next(item["time"] for item in timed_free_emotes_list if item["value"] == emote_id)
            await asyncio.sleep(emote_duration)
    
            # Check if user has moved or left
            room_users = (await self.highrise.get_room_users()).content
            user_in_room = False
            for room_user, position in room_users:
                if room_user.id == user.id:
                    user_position = position
                    user_in_room = True
                    break
            if not user_in_room:
                break

    async def get_user_position(self, message: str):
        # Get the list of room users
        room_users = (await self.highrise.get_room_users()).content
        for room_user, position in room_users:
            if room_user.username.lower() == message.lower():
                try:
                    return {"x": position.x, "y": position.y, "z": position.z}
                except AttributeError:
                    return None
        return None

    async def follow_user(self, user, target_user):
        if target_user is None:
            return
        while True:
            try:
                target_position = await self.get_user_position(target_user)
                if target_position is not None:
                    await self.highrise.teleport(user_id=user.id, dest=Position(target_position['x'] + 1, target_position['y'], target_position['z']))
            except Exception as e:
                print(f"Error in follow_user: {e}")
                return

    async def on_chat(self, user: User, message: str) -> None:
          
        if message.strip().isnumeric():  # Check if the message is a numeric string
            number = int(message.strip())
            if 0 <= number <= len(timed_free_emotes_list):  # Check if the number is within the range of emotes
                await self.loop_emote(user, number)  # Call loop_emote with user and the emote number
            
        elif message.lower() == "stop":
            if user.username in user_task_map:
                existing_task = user_task_map[user.username]
                existing_task.cancel()
                del user_task_map[user.username]
        else:
            # If the message is not a number or "stop", assume it's an emote name
            await self.loop_emote(user, message)  # Call loop_emote with user and the message (emote name)


        
        if message.lower() == "position":
            user_position = await self.get_user_position(user.username)    
            await self.highrise.chat(f"{user_position}")
            
        if message.lower() == "katıl":
            user_position = await self.get_user_position(user.username)
            if user_position is not None:
                await self.highrise.teleport(user_id=user.id, dest=Position(float(7), float(0.25), float(19.5))) 

        if message.lower() == "kelime":
            user_position = await self.get_user_position(user.username)
            if user_position is not None:
                await self.highrise.teleport(user_id=user.id, dest=Position(float(7), float(0.25), float(19.5)))    
        
        if message.lower() == "renk":
            user_position = await self.get_user_position(user.username)
            if user_position is not None:
                await self.highrise.teleport(user_id=user.id, dest=Position(float(7.5), float(0.5), float(12.5)))
            

    

        if message.lower().startswith("take trip"):
            target_user = user.username
            if target_user not in self.user_follow_tasks_map:
                task_name = f"follow_task_{len(self.user_follow_tasks_map)}"
                self.user_follow_tasks_map[target_user] = task_name
                await self.taskgroup.create_task(coro=self.follow_user(user, target_user), name=task_name)
                await self.highrise.chat(f"trip started {target_user}")
        elif message.lower() == "stop":
            if user.username in self.user_follow_tasks_map:
                task_name = self.user_follow_tasks_map[user.username]
                if task_name in self.taskgroup.tasks:
                    task = self.taskgroup.tasks[task_name]
                    try:
                        task.cancel()
                        print(f"Cancelled task for user: {user.username}")
                    except Exception as e:
                        print(f"Error cancelling task for user: {user.username}: {e}")
                    del self.user_follow_tasks_map[user.username]
                    await self.highrise.chat("trip stopped.")
                    
        if message.lower().startswith("tp @".lower()):
            parts = message.split("@")
            if len(parts) > 1 and parts[1].strip():
                target_user = parts[1].strip()
                if user.username not in self.user_follow_tasks_map:
                    target_position = await self.get_user_position(target_user)
                    if target_position is not None:
                        await self.highrise.teleport(user_id=user.id, dest=Position(target_position['x'] + 500, target_position['y']+500, target_position['z']+500))
                        await self.highrise.chat(f"take trip")
            else:
                await self.highrise.chat(" ")
                
# Run the bot
if __name__ == "__main__":
    bot = Bot()
    bot.run()
Editor is loading...
Leave a Comment