Sign in to follow this  
Followers 0
Snook

some ideas please

22 posts in this topic

Ok i run a game server on a remote computer and play the game on another what i would like to do is like i say "next" autoit would see it in the servers gui chat and then click the next button but on the other hand i dont just want anyone being able to do this.I'm still new to autoit did a few very basic scripts so far but need pointed in the right direction for this..

Share this post


Link to post
Share on other sites



Does the server log the GUI Chat to a file? maybe AI could parse that file and then react.

You would probably have to keep a unique userid so that it could be sure it was coming from you and not someone else.

What Game is it?

Or if the server has an rcon, AI could interact with that via tcpip...

Share this post


Link to post
Share on other sites

Welcome to the forums!

Your first task is to write a script that clicks the Next button. Once you have completed that, you have one of two options:

  • Take a look at PsExec. This would allow you from your computer to instruct the server computer to run the AutoIt script. This would be the simplest solution because you don't need to implement AutoIt logic to watch a chat window, determine what text has been added and parse that text for commands.
  • Do the whole lot via AutoIt. This will require much more effort. You will need to write code that monitors the chat window for changes, most likely using ControlGetText() and a loop. You could do this by determining how many characters already sit in the chat window and waiting until this number changes, at which point you know that you must check the text. You could determine what text is new (and then act on just that) by comparing the lengths of the old text and the new text. This of course requires that AutoIt can in fact see the text (it cannot do so for windows that don't use standard Microsoft controls). Try opening AutoIt Window Info on the server computer and inspecting the chat window for chat text.

Share this post


Link to post
Share on other sites

Ok now as everyone can tell im new but here is what im wanting to do here is the server gui with the command im wanting

Posted Image

so when that is said i want this to happen

MouseClick("left", 545, 755)

so I have read around in the helpfile and think I have it pin ponited to ControlGetText but I need help in writing it now the chatbox there is Control ID 1034 ClassNameNN ListBox2 now here is what I have started

;Waits for Server Window

WinWaitActive("NASCAR SimRacing Dedicated Server")

;Welcome Message Repeated

While 1

ControlSend("NASCAR SimRacing Dedicated Server", "", "Edit1", "YOUR TEXT HERE")

Sleep(3000)

ControlSend("NASCAR SimRacing Dedicated Server", "", "Edit1", "YOUR TEXT HERE")

Sleep(75000)

WEnd

Now is that even right I dont know but seems to work B)

Share this post


Link to post
Share on other sites

From your screenshot it looks like you want a script that does this:

  • Wait for the server window to exist.
  • Send out a welcome message via chat every 75 seconds or so.
  • Monitor the chat window for certain incoming data.
  • Perform actions when that data is received.
Based on that information I would start by having the following information handy:

; Server window identifier
Global Const $SERVER_WINDOW = 'NASCAR SimRacing Dedicated Server'

; Control IDs of window controls to manipulate
Global Const $CHAT_INPUT = 'ListBox2'
Global Const $CHAT_OUTPUT = '(enter control ID of chat entry line here)'
Global Const $CHAT_SEND = '(enter control ID of Send Chat Button here)'
Global Const $NEXT_SESSION = '(enter control ID of Next Session button here)'
Global Const $NEXT_EVENT = '(enter control ID of Next Event button here)'

I have defined $NEXT_SESSION and $NEXT_EVENT above because it looks like you'll want to click them via the script, and using ControlClick() is a better way to achieve this than MouseClick().

Instead of immediately posting a code loop that will monitor the chat window for changes, I'll come back later with a user-defined function that you can use because watching a text control for updates is a (sort of) popular request and such a UDF wouldn't hurt.

In the meantime though, here's how I would do what you have written above (if you're interested):

; Server window identifier
Global Const $SERVER_WINDOW = 'NASCAR SimRacing Dedicated Server'

; Control IDs of window controls to manipulate
Global Const $CHAT_OUTPUT = '(enter control ID of chat entry line here)'
Global Const $CHAT_SEND = '(enter control ID of Send Chat Button here)'

; Not using WinWaitActive() because the window doesn't have to be active for the script to work
WinWait($SERVER_WINDOW)

While 1
    Chat('YOUR TEXT HERE')
    Chat('YOUR TEXT HERE')
    Sleep(75000)
WEnd

Func Chat($Msg)
    ControlSetText($SERVER_WINDOW, '', $CHAT_OUTPUT, $Msg)
    ControlClick($SERVER_WINDOW, '', $CHAT_SEND)
EndFunc

Share this post


Link to post
Share on other sites

Uh oh. I just noticed from your code that the chat display is a list box and not a standard multi-line text field. Grabbing text from list boxes is trickier than grabbing text from text fields (and I don't have any experience with this as yet). I think I might go to bed first.

Share this post


Link to post
Share on other sites

#8 ·  Posted (edited)

Based on that information I would start by having the following information handy:

; Control IDs of window controls to manipulate

Global Const $CHAT_INPUT = 'ListBox2'

Global Const $CHAT_OUTPUT = 'Edit1'

Global Const $CHAT_SEND = 'Button9'

Global Const $NEXT_SESSION = 'Button1'

Global Const $NEXT_EVENT = 'Button2'

and the Sleep(75000) was wrong think I wanted it for like every 15 mins so maybe this would be better Sleep(900000)

Edited by Snook

Share this post


Link to post
Share on other sites

omg don't do such a long sleep

it will slow down your whole prog

if you need such a long sleep do it by counting

Care explaining this (wrong) logic?

Share this post


Link to post
Share on other sites

#11 ·  Posted (edited)

Well, I just spent an hour or more trying to work out how to read the information I needed from ListBoxes...

Here's my code. Give it a run and let me know how it goes. I obviously can't test it here.

Note: I programmed this for use with the beta version.

Edit: Code now terminates when the server window disappears.

; Removed (it was long outdated)
Edited by LxP

Share this post


Link to post
Share on other sites

#12 ·  Posted (edited)

        Line80

$Counter +=1

$Counter^Error

Error:Expected a "=" operator in assignment statement

Now i have no idea about this I got lost but im trying to understand alittle of this and I and many fellow racers appreciate all the help

Edited by Snook

Share this post


Link to post
Share on other sites

#13 ·  Posted (edited)

As LxP said must use Autoit Beta

Works like a champ so far now just how did he do it lol

Edited by Snook

Share this post


Link to post
Share on other sites

$Counter += 1 is beta-accepted shorthand for $Counter = $Counter + 1. You may have been able to change that and run the script under v3.1.1 with no problems, but in my opinion the beta is superior in every single way anyway.

To help you better understand how the script works, here is its logic:

  • Define all IDs in appropriately named constants. This ensures that you'll know exactly which controls are being manipulated later and it means that you would only ever have to correct one location if you misspell a control ID.
  • Define some settings and declare some variables that will be used.
  • Do the following until the server window disappears (I have since modified the code to do it like this):
    • Send two chat messages if it's been 75 seconds since the last time (or if the messages have not been sent at all yet).
    • While there are unread lines in the chat window:
    • Grab the next one.
    • Ignore it if it doesn't start with some special string (which means it may be a command).
    • Otherwise, trim off the bit at the start and read the rest, doing certain actions depending on the content.
  • Briefly pause. There's no need to constantly check the window as fast as possible -- that would steal resources from the server itself which is a Bad Thing.

Share this post


Link to post
Share on other sites

Ok Now the Next thing in the screenshot under clients shows name and there ping now i want that to be public so anyone can type !ping and it will return there ping kinda like

!ping

then it will say

Your ping is <10ms>

Also on the other hand i would think there would be a need to restrict how many times in such amount of time they can doit you know some people like to take things overboard kinda like me and this B)

and that client box is ListBox1 control id 1033

ok so i think i need to start here and add something like this

Global Const $Client_INPUT = 'ListBox1' at the top

now where to go from here

Share this post


Link to post
Share on other sites

The script logic will need to be modified slightly because you wouldn't be able to rely on the username as part of the command signal.

StringRegExp() would be a very handy and efficient way to determine if a chat line is a command, and then return both the username and the command if so.

Restricting the number of times that a user can send commands within a timeframe is possible but it would require a decent amount of code. You'd need multi-dimensional arrays to keep track of usernames and command tallies. I'll leave that to you. B)

Share this post


Link to post
Share on other sites

ok now let me see im try to allow other ppl to use the commands so I thought I would setup a ini with the allowed users now where am I going wrong here this is the line it looking for when i type the command right

Global Const $CMD_PREFIX = 'Snook: !'

Correct no?

so if i replace that with

$CMD_PREFIX = IniRead("C:\Temp\myfile.ini", "section2", "key", "NotFound")

not work or do i need to just give up on this stuff am i even on the right track

ini

[sectionName]

Key=Value

was taken from helpfile

Share this post


Link to post
Share on other sites

I think Valik means that the following two pieces of code are exactly identical in terms of function:

$a = 0
do
$a = $a + 1
sleep (5000)
if $a = 180 then
;send your message
$a = 0
endif
until 1 = 2

While 1
    Sleep(15 * 60 * 1000)
    ; Send your message
WEnd

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0