Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Kорзина _ Скачивание Странички Из Интернета И Вывод Информации В Чате

Автор: IIPu3PAK 26.2.2009, 17:29

вот пример странички которая есть

Код
Сервер 0
айпи адрес --->172.25.188.23:27015
карта сервера--->l4d_smalltown03_ranchhouse
тип игры----->left4dead
Игроков на сервере--->0/8  
сервер сейчас---->Online    
Сервер 1
айпи адрес --->172.25.35.54:27015
карта сервера--->l4d_hospital05_rooftop
тип игры----->left4dead
Игроков на сервере--->2/4  
сервер сейчас---->Online

Вся страничка без хтмл тегов(исправлено)

надо чтоб в чате по комманде !комманда выводилось:
1 сервер
айпи адрес --->172.25.188.23:27015
карта ----->l4d_smalltown03_ranchhouse
игра ----->left4dead
сейчас на сервере ----->1/8

2 сервер
айпи адрес --->172.25.35.54:27015
карта ----->l4d_smalltown03_ranchhouse
игра ----->left4dead
сейчас на сервере ----->2/4

n сервер
айпи адрес --->
карта ----->
игра ----->
сейчас на сервере ----->



спасибо всем за внимание exciting.gif

Автор: alex82 26.2.2009, 17:33

Весьма извращённый способ мониторинга игровых серверов...

Автор: IIPu3PAK 26.2.2009, 17:37

ну а что в нем извращенного? хочу чтоб люди зашли на хаб и могли посмотреть статистику по серверу...
З.Ы. ну или дайте скрипт который делает что-то похожее
З.Ы.Ы. Просто большая сеть и очень много людей сидит в ДЦ++ и такой мониторинг будит оптимальным

Автор: mariner 26.2.2009, 17:42

http://mydc.ru/topic748.html

есть вот такой вариант. Под AMX. если попросишь - код предоставим. Думаю можно и под мани-админа перегнать big_smile.gif

Автор: IIPu3PAK 26.2.2009, 17:44

Цитата(mariner @ 26.2.2009, 18:42) *
http://mydc.ru/topic748.html

есть вот такой вариант. Под AMX. если попросишь - код предоставим. Думаю можно и под мани-админа перегнать big_smile.gif

хм... а Амх вроде не расчитан для Л4д или я ошибаюсь?

Автор: mariner 26.2.2009, 17:46

я об этом уже написал. просто вроде устпройство одинаковое у протокола что у хл1, что у хл2. Да и у плагирнов тоже самое.

Автор: IIPu3PAK 26.2.2009, 17:50

Цитата(mariner @ 26.2.2009, 18:46) *
я об этом уже написал. просто вроде устпройство одинаковое у протокола что у хл1, что у хл2. Да и у плагирнов тоже самое.

хм...да я просто читал где соурсмод плагины...что Амх даже на КСС неидет...хотя может я что-то путаю big_smile.gif

а все... такс у меня Мани-админ стоит... значит можно под него перегнать?
можно ваш код получить?big_smile.gif
З.Ы. а то я несразу догадался что за мани-админ

Автор: PomanoB 26.2.2009, 19:43

AmxModX под Source не пойдет
Код придется ОЧЕНЬ значительно переделывать
http://mydc.ru/r/?http://amxmodx.ucoz.ru/load/4-1-0-78 AmxDCBot для amxmodx, может чем-то поможет
Но можно сделать мониторинг с использование luasockets, правда функционал будет гораздо меньше
Описание протокола запросов к серверу можно найти http://mydc.ru/r/?http://developer.valvesoftware.com/wiki/Server_Queries

Если что могу выложить код на PHP для запросов к серверу, тогда можно будет использовать существующие скрипты которые новости собирают

Автор: IIPu3PAK 27.2.2009, 1:30

Цитата(PomanoB @ 26.2.2009, 20:43) *
AmxModX под Source не пойдет
Код придется ОЧЕНЬ значительно переделывать
http://mydc.ru/r/?http://amxmodx.ucoz.ru/load/4-1-0-78 AmxDCBot для amxmodx, может чем-то поможет
Но можно сделать мониторинг с использование luasockets, правда функционал будет гораздо меньше
Описание протокола запросов к серверу можно найти http://mydc.ru/r/?http://developer.valvesoftware.com/wiki/Server_Queries

Если что могу выложить код на PHP для запросов к серверу, тогда можно будет использовать существующие скрипты которые новости собирают

по 2 ссылке слабо что понятно...есть что-нибудь подобное на русском?(я первый раз в жизни Луа вижу,сразу вот так быстро с англицкого сайта я ничего не пойму)

З.Ы. А скриптик на пхп у меня есть в 1 посте описано какую страничку он выдает
З.Ы.Ы Где взять функции которые можно использовать в луасокетс?(хотябы вон страничку полностью скопировать)
З.Ы.Ы.Ы PomanoB а вы можете окоментировать строчки кода AmxDCBot русским языком?(если там будут комментарии может я и сам переделаю под мани-админа)

Автор: MEXAHuK 27.2.2009, 7:07

если твой игро сервер поддерживает rss то просто поставь на хаб rssfeed bot и настрой на тот серв. и всё

Автор: IIPu3PAK 27.2.2009, 13:03

Цитата(MEXAHuK @ 27.2.2009, 8:07) *
если твой игро сервер поддерживает rss то просто поставь на хаб rssfeed bot и настрой на тот серв. и всё

неподдерживает
З.Ы. ап ап ап
З.Ы.Ы люди ну скажите пожалуста какие функции можно юзать с помощью библиотеки Луа-сокетс и их описание

Цитата
Вот AmxDCBot для amxmodx, может чем-то поможет

Это вроде под луа 4.... а мне надо под луа 5

Автор: Nickolya 27.2.2009, 13:29

Подгружаем нужный нам модуль, где-нить в начале скрипта:

Код
-- loads the HTTP module and any libraries it requires
local http = require("socket.http")

А вот код получения странички, всего пара строк big_smile.gif
Код
local b, c, h = http.request("http://heresomesiteweneed.orIPadress.ru/somepath/blabla/pageweneed.html?#34;)
if b then
-- получили мы страницу, b здесь сама страница, c - статус запроса, h - таблица с заголовками
else
-- здесь b - nil, c - ошибка
end

Осталось сделать обработку команды и вывод данных по ней, и все дела...

Автор: mariner 27.2.2009, 13:30

это не луа, это плагин для серва. Вся луачасть на хабе заключается в менюшке! все. А обрабатывает все бот, он висит на хабе как клиент-оператор, чтоб за флуд не банило.

Автор: PomanoB 27.2.2009, 16:16

2 ссылка к луа вообще не имеет отношения, там описан протокол взаимодействия серверов на движках Source и GoldSrc
AmxDcBot с комментариями попозже выложу

Автор: MEXAHuK 27.2.2009, 16:21

тогда кури XLST трансформацию.

Автор: PomanoB 27.2.2009, 16:47

XSLT )

Автор: MEXAHuK 27.2.2009, 17:15

ой))

Автор: IIPu3PAK 27.2.2009, 17:29

Цитата(Nickolya @ 27.2.2009, 14:29) *
Подгружаем нужный нам модуль, где-нить в начале скрипта:
Код
-- loads the HTTP module and any libraries it requires
local http = require("socket.http")

А у меня апи1 и библиотека pxwsa_l51.dll , она подойдет? или надо какуюто особенною брать?
З.Ы. с моей библеотекой неработает :(
З.Ы.Ы все разобрался что-куда.... БОЛЬШОЕ СПАСИБО surrender.gif
Цитата
2 ссылка к луа вообще не имеет отношения, там описан протокол взаимодействия серверов на движках Source и GoldSrc

Да Это я понял...всеравно страничка на английском...а я с ним плохо дружу

Автор: PomanoB 27.2.2009, 19:25

На русском я такого не видел)
У самого с английским плохо тоже долго разбирался)

Автор: IIPu3PAK 28.2.2009, 10:45

можноли какнибудь серверу послать Ркон комманду вида Rcon "say блаблабла"
или любую другую Луа скриптом? surrender.gif

нашел страничку

Цитата
http://mydc.ru/r/?http://fremnet.net/article/199/source-rcon-class

с полностью рабочим скриптом для пхп может кто-нибудь переделает его под луа 5 апи 1 ?

Автор: PomanoB 28.2.2009, 10:56

Пока писал ты уже сам нашёл)
На GoldSrc движке всё значительно проще ...

Автор: IIPu3PAK 11.3.2009, 11:02

а можно-ли в луа послать Удп запрос и как это сделать?

Автор: Setuper 12.3.2009, 0:44

Можно

Цитата
UDPDbg.
-------------------
Reg(sIp, nPort, bAllData) - Register to receiving data to PtokaX UDP Debug receiver, bAllData false means to receive only data from this script. Return nil when failed or true when success.
Unreg() - Remove from receiving data.
Send(sData) - Send data to udp debug. If script is registered then only to this reg, else to all. Return nil when failed or true when success.

Автор: IIPu3PAK 12.3.2009, 3:50

Цитата
UDPDbg.
-------------------
Reg(sIp, nPort, bAllData) - Register to receiving data to PtokaX UDP Debug receiver, bAllData false means to receive only data from this script. Return nil when failed or true when success.
Unreg() - Remove from receiving data.
Send(sData) - Send data to udp debug. If script is registered then only to this reg, else to all. Return nil when failed or true when success.


непонял что с этим делать...надо какую-нибудь библиотеку подключить?

вот что птоха сказала на комманду рег
[10:50] Синтакс ...J_\PtokaX.0.3.5.2.LUA.5.1.1.RUS.by.NRJ\scripts\1.lua:6: attempt to call global 'Reg' (a nil value)

З.Ы. нашел в модуле луа-сокетс doc/udp.html Может кто переведет его на русский язык а то я ничего немогу там понять

Автор: Setuper 12.3.2009, 11:49

Код
UDPDbg.Reg(sIp, nPort, bAllData)

Автор: IIPu3PAK 12.3.2009, 12:21

[19:20] Синтакс ...J_\PtokaX.0.3.5.2.LUA.5.1.1.RUS.by.NRJ\scripts\1.lua:6: attempt to index global 'UDPDbg' (a nil value)
what.gif

Мне надо отправить серверу " FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69 6E 65 20 51 75 65 72 79 00 "
и получить ответ... может я нетак выразился?

Автор: Setuper 12.3.2009, 12:40

PtokaX.0.4.*.* нужно поставить. Эта функция работает только в новых версиях.

Автор: IIPu3PAK 12.3.2009, 13:07

:(

З.Ы. нашел в модуле луа-сокетс doc/udp.html Может кто переведет его на русский язык а то я ничего немогу там понять

Цитата
UDP

socket.udp()

Creates and returns an unconnected UDP object. Unconnected objects support the sendto, receive, receivefrom, getsockname, setoption, settimeout, setpeername, setsockname, and close. The setpeername is used to connect the object.

In case of success, a new unconnected UDP object returned. In case of error, nil is returned, followed by an error message.

connected:close()
unconnected:close()

Closes a UDP object. The internal socket used by the object is closed and the local address to which the object was bound is made available to other applications. No further operations (except for further calls to the close method) are allowed on a closed socket.

Note: It is important to close all used sockets once they are not needed, since, in many systems, each socket uses a file descriptor, which are limited system resources. Garbage-collected objects are automatically closed before destruction, though.

connected:getpeername()

Retrieves information about the peer associated with a connected UDP object.

Returns the IP address and port number of the peer.

Note: It makes no sense to call this method on unconnected objects.

connected:getsockname()
unconnected:getsockname()

Returns the local address information associated to the object.

The method returns a string with local IP address and a number with the port. In case of error, the method returns nil.

Note: UDP sockets are not bound to any address until the setsockname or the sendto method is called for the first time (in which case it is bound to an ephemeral port and the wild-card address).

connected:receive([size])
unconnected:receive([size])

Receives a datagram from the UDP object. If the UDP object is connected, only datagrams coming from the peer are accepted. Otherwise, the returned datagram can come from any host.

The optional size parameter specifies the maximum size of the datagram to be retrieved. If there are more than size bytes available in the datagram, the excess bytes are discarded. If there are less then size bytes available in the current datagram, the available bytes are returned. If size is omitted, the maximum datagram size is used (which is currently limited by the implementation to 8192 bytes).

In case of success, the method returns the received datagram. In case of timeout, the method returns nil followed by the string 'timeout'.

unconnected:receivefrom([size])

Works exactly as the receive method, except it returns the IP address and port as extra return values (and is therefore slightly less efficient).

connected:send(datagram)

Sends a datagram to the UDP peer of a connected object.

Datagram is a string with the datagram contents. The maximum datagram size for UDP is 64K minus IP layer overhead. However datagrams larger than the link layer packet size will be fragmented, which may deteriorate performance and/or reliability.

If successful, the method returns 1. In case of error, the method returns nil followed by an error message.

Note: In UDP, the send method never blocks and the only way it can fail is if the underlying transport layer refuses to send a message to the specified address (i.e. no interface accepts the address).

unconnected:sendto(datagram, ip, port)

Sends a datagram to the specified IP address and port number.

Datagram is a string with the datagram contents. The maximum datagram size for UDP is 64K minus IP layer overhead. However datagrams larger than the link layer packet size will be fragmented, which may deteriorate performance and/or reliability. Ip is the IP address of the recipient. Host names are not allowed for performance reasons. Port is the port number at the recipient.

If successful, the method returns 1. In case of error, the method returns nil followed by an error message.

Note: In UDP, the send method never blocks and the only way it can fail is if the underlying transport layer refuses to send a message to the specified address (i.e. no interface accepts the address).

connected:setpeername('*')
unconnected:setpeername(address, port)

Changes the peer of a UDP object. This method turns an unconnected UDP object into a connected UDP object or vice versa.

For connected objects, outgoing datagrams will be sent to the specified peer, and datagrams received from other peers will be discarded by the OS. Connected UDP objects must use the send and receive methods instead of sendto and receivefrom.

Address can be an IP address or a host name. Port is the port number. If address is '*' and the object is connected, the peer association is removed and the object becomes an unconnected object again. In that case, the port argument is ignored.

In case of error the method returns nil followed by an error message. In case of success, the method returns 1.

Note: Since the address of the peer does not have to be passed to and from the OS, the use of connected UDP objects is recommended when the same peer is used for several transmissions and can result in up to 30% performance gains.

unconnected:setsockname(address, port)

Binds the UDP object to a local address.

Address can be an IP address or a host name. If address is '*' the system binds to all local interfaces using the constant INADDR_ANY. If port is 0, the system chooses an ephemeral port.

If successful, the method returns 1. In case of error, the method returns nil followed by an error message.

Note: This method can only be called before any datagram is sent through the UDP object, and only once. Otherwise, the system automatically binds the object to all local interfaces and chooses an ephemeral port as soon as the first datagram is sent. After the local address is set, either automatically by the system or explicitly by setsockname, it cannot be changed.

connected:setoption(option [, value])
unconnected:setoption(option [, value])

Sets options for the UDP object. Options are only needed by low-level or time-critical applications. You should only modify an option if you are sure you need it.

Option is a string with the option name, and value depends on the option being set:

* 'dontroute': Setting this option to true indicates that outgoing messages should bypass the standard routing facilities;
* 'broadcast': Setting this option to true requests permission to send broadcast datagrams on the socket.

The method returns 1 in case of success, or nil followed by an error message otherwise.

Note: The descriptions above come from the man pages.

connected:settimeout(value)
unconnected:settimeout(value)

Changes the timeout values for the object. By default, the receive and receivefrom operations are blocking. That is, any call to the methods will block indefinitely, until data arrives. The settimeout function defines a limit on the amount of time the functions can block. When a timeout is set and the specified amount of time has elapsed, the affected methods give up and fail with an error code.

The amount of time to wait is specified as the value parameter, in seconds. The nil timeout value allows operations to block indefinitely. Negative timeout values have the same effect.

Note: In UDP, the send and sendto methods never block (the datagram is just passed to the OS and the call returns immediately). Therefore, the settimeout method has no effect on them.

Note: The old timeout method is deprecated. The name has been changed for sake of uniformity, since all other method names already contained verbs making their imperative nature obvious.

Автор: mariner 12.3.2009, 13:19

Цитата
думаю 95% информации
по любой области знания
находятся в интернете
на английском языке !
Это есть фаХт !
Учите английский язык !
Повышайте свою стоимость
на современном рынке труда !
Это очень просто научится читать
технические тексты на английском языке.
Тем более у вас есть конкретная мотивация !
Скоро напишу краткий курс и
по базовому английскому.
А пока...
Используйте он-лайновый переводчик
Translate.ru
Он поможет прочитать вам тексты на
английском, немецком, французском, испанском языках - любезно и бесплатно переведя их
на корявый русский.


отличная цитата с одного сайта

Автор: IIPu3PAK 12.3.2009, 13:24

Цитата(mariner @ 12.3.2009, 13:19) *
отличная цитата с одного сайта


техн тексты переводчики онлайновые так переводят что суть теряется уже на 2 строчке

Автор: Setuper 12.3.2009, 13:44

Так переводить же надо только отдельные слова, а потом, поняв суть о чём говориться, самому склеить из слов предложение!

Автор: Nickolya 12.3.2009, 13:55

Вот набросал код, спрашивай, если что непонятно, надеюсь немного в луа мы смыслим big_smile.gif

CODE
local sDatagram = " FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69 6E 65 20 51 75 65 72 79 00 " -- отсылаемые данные
local sServerIp = "127.0.0.1" -- айпи
local sServerPort = 1209 -- порт
local iTimeOut = 1/100 -- таймаут соединения на получение
local iBuferSize = nil -- размер буфера (nil - стандартный)
----------------------------------------------------------------------------

-- loads the socket module
local socket = require("socket")

local myudp = socket.udp()

myudp:settimeout(iTimeOut)
myudp:setpeername(sServerIp, sServerPort)

local _, sError = myudp:send(sDatagram, sServerIp, sServerPort)
if sError then
-- ошибка!
end

-- уже точно не помню какие функции в старом апи, так что поправьте если накосячил!
function Main()
SetTimer(1000)
StartTimer()
end

function OnStartup()
TmrMan.AddTimer(1000, "OnTimer")
end

function OnTimer()
local sData, sError = ReceiveData()
if not sError then
-- мы получили какие-то данные sData и тут уже их обрабатываем
end
end

function OnExit()
myudp:close()
end
OnError = OnExit

function ReceiveData()
local sData, sError = myudp:receive(iBuferSize)
if sError then
-- ошибка!
return nil, sError
end
return sData
end

Автор: IIPu3PAK 12.3.2009, 14:00

я немогу перевести текст потомучто незнаю некоторые термины даже на русском ...
что за зверь "unconnected UDP object" "The setpeername is used to connect the object." и так далее

Цитата(Nickolya @ 12.3.2009, 13:55) *
Вот набросал код, спрашивай, если что непонятно, надеюсь немного в луа мы смыслим big_smile.gif


а сообщение то что я написал это в hex-коде ,это учтено в скрипте или нет?

почему то скрипт посылает мне ошибку timeout what.gif

Автор: Setuper 12.3.2009, 14:20

Цитата(IIPu3PAK @ 12.3.2009, 14:00) *
а сообщение то что я написал это в hex-коде ,это учтено в скрипте или нет?

Так это наверное должна учитывать та прога, которая находится на другой стороне (которой посылаются эти данные)

Автор: Nickolya 12.3.2009, 14:21

Цитата(IIPu3PAK @ 12.3.2009, 14:00) *
а сообщение то что я написал это в hex-коде ,это учтено в скрипте или нет?

Нет, отправляется как есть эта строка, про взаимодействие программ через юдипи ничего не знаю, я попробовал ПРИМЕРНО показать тебе как пользоваться библиотекой, дальше - сам. bad_smile.gif

Таймаут - увеличь iTimeOut, это время в секундах, сделай 1 к примеру. А ошибка таймаут при получении данных будет всегда когда эти данных нет или они не пришли.

Автор: IIPu3PAK 12.3.2009, 15:04

Цитата(Nickolya @ 12.3.2009, 14:21) *
Нет, отправляется как есть эта строка, про взаимодействие программ через юдипи ничего не знаю, я попробовал ПРИМЕРНО показать тебе как пользоваться библиотекой, дальше - сам. bad_smile.gif

Таймаут - увеличь iTimeOut, это время в секундах, сделай 1 к примеру. А ошибка таймаут при получении данных будет всегда когда эти данных нет или они не пришли.


1)ну вот как нехоро что она будет всегда.... говорила бы например что данных нет
2)а вот в пхп у меня отправляется строка вида fwrite($fp,"\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00".chr(10));

а как в луа тоже самое написать? bad_smile.gif

поставил 1 ,лагает и посылает тайм аут,хотя если послать неправильный запрос сервер отвечает специальным сообщением...

Автор: Setuper 12.3.2009, 15:14

в lua языке шестнадцатеричные цифры представляются как и в с++: 0xff - означает 256

Автор: IIPu3PAK 12.3.2009, 15:22

Цитата(Setuper @ 12.3.2009, 15:14) *
в lua языке шестнадцатеричные цифры представляются как и в с++: 0xff - означает 256

т.е. вот так local sDatagram = "0xFF0xFF0xFF0xFF0x540x530x6F0x750x720x630x650x200x450x6E0x670x690x6E0x650x200x510x750x650x720x7
90x00"
или как правильно ?

Автор: Setuper 12.3.2009, 15:31

Эта структура чисел действует только внутри языка lua.
Ответь на вопрос: в каком формате по твоему передаётся сообщение в сокет?

Если программа на другом конце соединения обрабатывает поступающие данные, то надо писать сообщение в формате, который распознает та программа.

Автор: IIPu3PAK 12.3.2009, 15:37

Цитата(Setuper @ 12.3.2009, 15:31) *
Эта структура чисел действует только внутри языка lua.
Ответь на вопрос: в каком формате по твоему передаётся сообщение в сокет?

Если программа на другом конце соединения обрабатывает поступающие данные, то надо писать сообщение в формате, который распознает та программа.


в сокет помойму в любом случае идет хекс-код

вот прога на пхп которая получает данные с серва...может это поможет
Код
     $fp = @fsockopen("udp://".$server, $port);
     if (!$fp) return false;

     @fwrite($fp,"\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00".chr(10));
     $start=time();
     socket_set_timeout($fp,1);
     $st=fread($fp,1);
     $r=socket_get_status($fp);
     $r=$r["unread_bytes"];
     if ($r == 0) { @fclose($fp); return false;}
     $st.=fread($fp,$r);

     @fclose($fp);

Автор: Setuper 12.3.2009, 15:42

Если мне не изменяет память, то "\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00".chr(10) - это строка в php. Если это строка, то в сокет поступает строка, даже в тобою приведённом примере.

Нас не волнует в каком виде она передаётся сокетом, нас интересует в каком виде она поступает в сокет, и в каком виде извлекается из сокета!

Автор: IIPu3PAK 12.3.2009, 15:43

фактически серверу приходит сообщение (тут 4 символа FF)TSource Engine Query(Тут 1 символ 00)

что еще мне надо ответить ...я незнаю shame.gif

Код
Request format

Server info can be requested by sending the following byte values in a UDP packet to the server.

FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69   яяяяTSource Engi
6E 65 20 51 75 65 72 79 00                        ne Query

i.e. -1 (int), 'T' (byte), "Source Engine Query" (string)

Автор: Setuper 12.3.2009, 15:53

Ещё раз повторяю, что как высокоуровнего программиста тебя не интересует, что там происходит на низком уровне. Тебя интересует только то как данные отсылаются и получаются на высоком уровне. А на высоком уровне они отсылаются строкой, и извлекаются из сокета тоже в виде строки. А уже строку тебе самому решать в какой тип преобразовать.

Автор: IIPu3PAK 12.3.2009, 15:57

Цитата(Setuper @ 12.3.2009, 15:53) *
Ещё раз повторяю, что как высокоуровнего программиста тебя не интересует, что там происходит на низком уровне. Тебя интересует только то как данные отсылаются и получаются на высоком уровне. А на высоком уровне они отсылаются строкой, и извлекаются из сокета тоже в виде строки. А уже строку тебе самому решать в какой тип преобразовать.


У меня нет доступа к движку Соурс(никто мне никогда не даст его исходников)

так что мне надо через луа какимто макаром отправить такую строку

и если она отправится то я получу что-нибудь типа
Код
Example reply:

FF FF FF FF 49 02 67 61 6D 65 32 78 73 2E 63 6F    яяяяI.game2xs.co
6D 20 43 6F 75 6E 74 65 72 2D 53 74 72 69 6B 65    m Counter-Strike
20 53 6F 75 72 63 65 20 23 31 00 64 65 5F 64 75     Source #1.de_du
73 74 00 63 73 74 72 69 6B 65 00 43 6F 75 6E 74    st.cstrike.Count
65 72 2D 53 74 72 69 6B 65 3A 20 53 6F 75 72 63    er-Strike: Sourc
65 00 F0 00 05 10 04 64 6C 00 00 31 2E 30 2E 30    e......dl..1.0.0
2E 32 32 00                                        .22.



или вы мне хотите сказать что луа неподдерживает в строке вместо символа писать код символа?
даже в паскале в строку можно пихать коды символа...

Автор: Setuper 12.3.2009, 16:09

Преобазование шестнадцатеричных символов в строку

Код
local str = 0xFF..0xFF..0xFF..0xFF..0x54..0x53..0x6F..0x75..0x72..0x63..0x65..0x20..0x45..0x6E..0x67..0x69..0x6E
..0x65..0x20..0x51..0x75..0x65..0x72..0x79..0x00


Преобразование кодов символов в строку символов
Код
local c = string.char
local str = c(0xFF)..c(0xFF)..c(0xFF)..c(0xFF)..c(0x54)..c(0x53)..c(0x6F)..c(0x75)..
c(0x72)..c(0x63)..c(0x65)..c(0x20)..c(0x45)..c(0x6E)..c(0x67)..c(0x69)..c(0x6E)..
c(0x65)..c(0x20)..c(0x51)..c(0x75)..c(0x65)..c(0x72)..c(0x79)..c(0x00)

Автор: IIPu3PAK 12.3.2009, 16:28

Цитата
Преобразование кодов символов в строку символов
Код
local c = string.char
local str = c(0xFF)..c(0xFF)..c(0xFF)..c(0xFF)..c(0x54)..c(0x53)..c(0x6F)..c(0x75)..
c(0x72)..c(0x63)..c(0x65)..c(0x20)..c(0x45)..c(0x6E)..c(0x67)..c(0x69)..c(0x6E)..
c(0x65)..c(0x20)..c(0x51)..c(0x75)..c(0x65)..c(0x72)..c(0x79)..c(0x00)


такс вот это работает но,
1) после выполнения скрипт получает сообщение и публикует его не полностью или получает неполностью я так и непонял
2)какбы из полученной строки от сервера откинуть нечитабельные символы типа 00? (вернее преобразовать их во что-нибудь читабельное)

Цитата(Nickolya @ 12.3.2009, 13:55) *
Вот набросал код, спрашивай, если что непонятно, надеюсь немного в луа мы смыслим big_smile.gif

CODE
local sDatagram = " FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69 6E 65 20 51 75 65 72 79 00 " -- отсылаемые данные
local sServerIp = "127.0.0.1" -- айпи
local sServerPort = 1209 -- порт
local iTimeOut = 1/100 -- таймаут соединения на получение
local iBuferSize = nil -- размер буфера (nil - стандартный)
----------------------------------------------------------------------------

-- loads the socket module
local socket = require("socket")

local myudp = socket.udp()

myudp:settimeout(iTimeOut)
myudp:setpeername(sServerIp, sServerPort)

local _, sError = myudp:send(sDatagram, sServerIp, sServerPort)
if sError then
-- ошибка!
end

-- уже точно не помню какие функции в старом апи, так что поправьте если накосячил!
function Main()
SetTimer(1000)
StartTimer()
end

function OnStartup()
TmrMan.AddTimer(1000, "OnTimer")
end

function OnTimer()
local sData, sError = ReceiveData()
if not sError then
-- мы получили какие-то данные sData и тут уже их обрабатываем
end
end

function OnExit()
myudp:close()
end
OnError = OnExit

function ReceiveData()
local sData, sError = myudp:receive(iBuferSize)
if sError then
-- ошибка!
return nil, sError
end
return sData
end



вот ваш скрипт каждую iTimeOut стучится к серверу....а мне надо 1 раз чтоб ввел что-нибудь в чате и он постучал к серверу

Автор: Setuper 12.3.2009, 16:35

А руками нельзя что ли отбросить (просто не писать)?

Код
local c = string.char
local str = c(0xFF)..c(0xFF)..c(0xFF)..c(0xFF)..c(0x54)..c(0x53)..c(0x6F)..c(0x75)..
c(0x72)..c(0x63)..c(0x65)..c(0x20)..c(0x45)..c(0x6E)..c(0x67)..c(0x69)..c(0x6E)..
c(0x65)..c(0x20)..c(0x51)..c(0x75)..c(0x65)..c(0x72)..c(0x79)


Скрипт не стучится к серверу, он находится в состоянии готовности получить с сервера какие-либо данные.

Автор: IIPu3PAK 12.3.2009, 16:40

Цитата(Setuper @ 12.3.2009, 16:35) *
А руками нельзя что ли отбросить (просто не писать)?

Код
local c = string.char
local str = c(0xFF)..c(0xFF)..c(0xFF)..c(0xFF)..c(0x54)..c(0x53)..c(0x6F)..c(0x75)..
c(0x72)..c(0x63)..c(0x65)..c(0x20)..c(0x45)..c(0x6E)..c(0x67)..c(0x69)..c(0x6E)..
c(0x65)..c(0x20)..c(0x51)..c(0x75)..c(0x65)..c(0x72)..c(0x79)


Скрипт не стучится к серверу, он находится в состоянии готовности получить с сервера какие-либо данные.



1)нет понимаете прикол такой(я включаю скрипт и он каждую секунду отправляет запрос серверу и каждую секунду то получает ответ то таймайт)(и все это сопровождается жесточайшими лагами птохи)
2)откинуть 00 мне надо не в запросе к серверу а в ответе а то если напрмер в ответе идут сначала читабельные символы(обычные анг-буквы) а потом идет символ 00 и после него опять англ буквы,то последние англ буквы в чате не показываются,которые идут после символа с кодом 00

Автор: Setuper 12.3.2009, 16:52

Как он может отправлять данные каждую секунду, если функция отправки не находится в таймере.

Код
local _, sError = myudp:send(sDatagram, sServerIp, sServerPort)

Данные отправляются 1 раз при старте скрипта.

В таймере находится функция получения данных.

Насчёт символов, наверное можно сделать так:
Код
str = str:gsub("["..string.char(0x00).."]", "")


А в каком виде приходит сообщение скрипту с сервера?

Автор: IIPu3PAK 12.3.2009, 16:54

Цитата(Setuper @ 12.3.2009, 16:48) *
Как он может отправлять данные каждую секунду, если функция отправки не находится в таймере.

как бы точнее он и в правда 1 раз посылает...он их получить пытается через каждую секунду...а надо получил и все заглохнуть

Цитата
Насчёт символов, наверное можно сделать так:
Код
str = str:gsub("["..string.char(0x00).."]", "")



[23:53] Синтакс ...J_\PtokaX.0.3.5.2.LUA.5.1.1.RUS.by.NRJ\scripts\1.lua:51: attempt to index local 'sData' (a nil value)

Цитата
А в каком виде приходит сообщение скрипту с сервера?

вот в таком виде (все первые буквы до символа с кодом 00 норм выводятся)
Код
Example reply:

FF FF FF FF 49 02 67 61 6D 65 32 78 73 2E 63 6F    яяяяI.game2xs.co
6D 20 43 6F 75 6E 74 65 72 2D 53 74 72 69 6B 65    m Counter-Strike
20 53 6F 75 72 63 65 20 23 31 00 64 65 5F 64 75     Source #1.de_du
73 74 00 63 73 74 72 69 6B 65 00 43 6F 75 6E 74    st.cstrike.Count
65 72 2D 53 74 72 69 6B 65 3A 20 53 6F 75 72 63    er-Strike: Sourc
65 00 F0 00 05 10 04 64 6C 00 00 31 2E 30 2E 30    e......dl..1.0.0
2E 32 32 00                                        .22.

Автор: Setuper 12.3.2009, 17:00

Ну и каким образом ты выводишь часть сообщения в чат? Я что-то не могу понять.

Автор: IIPu3PAK 12.3.2009, 17:02

Цитата(Setuper @ 12.3.2009, 17:00) *
Ну и каким образом ты выводишь часть сообщения в чат? Я что-то не могу понять.


function ChatArrival(curUser, data)
ReceiveData()
SendToAll(sData)
SendToAll(sError)
end

Автор: Setuper 12.3.2009, 17:04

Код
local sDatagram = " FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69 6E 65 20 51 75 65 72 79 00 " -- отсылаемые данные
local sServerIp = "127.0.0.1" -- айпи
local sServerPort = 1209 -- порт
local iTimeOut = 1/100 -- таймаут соединения на получение
local iBuferSize = nil -- размер буфера (nil - стандартный)
----------------------------------------------------------------------------

-- loads the socket module
local socket = require("socket")

local myudp = socket.udp()

myudp:settimeout(iTimeOut)
myudp:setpeername(sServerIp, sServerPort)

-- уже точно не помню какие функции в старом апи, так что поправьте если накосячил!
function Main()
  SetTimer(1000)
end

function OnTimer()
  local sData, sError = ReceiveData()
  if not sError and sData then
    -- мы получили какие-то данные sData и тут уже их обрабатываем
    StopTimer()
    SendToAll(tostring(sData))
  end
end

function ChatArrival(tUser, sData)
  local sCmd = sData:match"%b<> !send"
  if sCmd then
    StartTimer()
    local _, sError = myudp:send(sDatagram, sServerIp, sServerPort)
    if sError then
      -- ошибка!
    end
  end
end

function OnExit()
  myudp:close()
end
OnError = OnExit

function ReceiveData()
  local sData, sError = myudp:receive(iBuferSize)
  if sError then
    -- ошибка!
    return nil, sError
  end
  return sData
end

Автор: IIPu3PAK 12.3.2009, 17:06

ну вот примерно так да
вот что я вижу в чате при работе скрипта

Цитата
[00:09:33] яяяяTSource Engine Query
[00:09:35] яяяяI&Left 4 Dead server (versus by IIPu3PAK and John710)
[00:09:37] nil
[00:09:37] timeout
[00:09:37] nil
[00:09:37] timeout
[00:09:39] nil
[00:09:39] timeout
[00:09:39] nil
[00:09:39] timeout

Автор: Setuper 12.3.2009, 17:11

Я подправил.
На команду в чат !send должны отправиться данные на сервер, после получения данных прослушка останавливается, пока в чат опять не будет отослана данная команда.

Автор: IIPu3PAK 12.3.2009, 17:13

Цитата(Setuper @ 12.3.2009, 17:11) *
Я подправил.
На команду в чат !send должны отправиться данные на сервер, после получения данных прослушка останавливается, пока в чат опять не будет отослана данная команда.


все с вашим скриптом все замечательно :smile2:

но вот как убить из получаемого сообщения коды 00 а то он после 00 невыводит(точнее не убить а всетаки заменить на * например или любой другой символ)

Автор: Setuper 12.3.2009, 17:21

Надо проверять, действительно ли вся строка приходит от сервера скрипту:

Код
function OnTimer()
  local sData, sError = ReceiveData()
  if not sError and sData then
    -- мы получили какие-то данные sData и тут уже их обрабатываем
    StopTimer()
    SendToAll("Length of data = "..sData:len())
    SendToAll(tostring(sData))
  end
end

Автор: IIPu3PAK 12.3.2009, 17:24

Цитата(Setuper @ 12.3.2009, 17:21) *
Надо проверять, действительно ли вся строка приходит от сервера скрипту:

Код
function OnTimer()
  local sData, sError = ReceiveData()
  if not sError and sData then
    -- мы получили какие-то данные sData и тут уже их обрабатываем
    StopTimer()
    SendToAll("Length of data = "..sData:len())
    SendToAll(tostring(sData))
  end
end


Цитата
[00:24:04 | 172.16.153.15] <IIPu3PAK> !send
[00:24:05] Length of data = 152
[00:24:05] яяяяI&Left 4 Dead server (versus by IIPu3PAK and John710)

Автор: Setuper 12.3.2009, 17:35

Код
function print(...)
  local m=''
  for i=1,select('#',...) do
    m=m..tostring(select(i,...))..", "
  end
  Core.SendToAll(m)
end

function OnTimer()
  local sData, sError = ReceiveData()
  if not sError and sData then
    -- мы получили какие-то данные sData и тут уже их обрабатываем
    StopTimer()
    SendToAll("Length of data = "..sData:len())
    print(string.byte(sData, 1, sData:len()))
    SendToAll(tostring(sData))
  end
end

Автор: IIPu3PAK 12.3.2009, 17:40

Код
00000000:ff ff ff ff 49 26 4c 65 66 74 20 34 20 44 65 61    яяяяI&Left 4 Dea
00000010:64 20 73 65 72 76 65 72 20 28 76 65 72 73 75 73    d server (versus
00000020:20 62 79 20 49 49 50 75 33 50 41 4b 20 61 6e 64     by IIPu3PAK and
00000030:20 4a 6f 68 6e 37 31 30 29 00 6c 34 64 5f 76 73     John710).l4d_vs
00000040:5f 68 6f 73 70 69 74 61 6c 30 34 5f 69 6e 74 65    _hospital04_inte
00000050:72 69 6f 72 00 6c 65 66 74 34 64 65 61 64 00 4c    rior.left4dead.L
00000060:34 44 20 2d 20 56 65 72 73 75 73 20 2d 20 4e 6f    4D - Versus - No
00000070:72 6d 61 6c 00 01 00 00 08 00 64 77 00 00 31 2e    rmal......dw..1.
00000080:30 2e 30 2e 39 00 a0 87 69 65 6d 70 74 79 2c 61    0.0.9. ‡iempty,a
00000090:6c 6c 74 61 6c 6b 2c 00 ff ff ff ff 49 26 4c 65    lltalk,.яяяяI&Le
000000a0:66 74 20 34 20 44 65 61 64 20 73 65 72 76 65 72    ft 4 Dead server
000000b0:20 28 76 65 72 73 75 73 20 62 79 20 49 49 50 75     (versus by IIPu
000000c0:33 50 41 4b 20 61 6e 64 20 4a 6f 68 6e 37 31 30    3PAK and John710
000000d0:29 00 6c 34 64 5f 76 73 5f 68 6f 73 70 69 74 61    ).l4d_vs_hospita
000000e0:6c 30 34 5f 69 6e 74 65 72 69 6f 72 00 6c 65 66    l04_interior.lef
000000f0:74 34 64 65 61 64 00 4c 34 44 20 2d 20 56 65 72    t4dead.L4D - Ver
00000100:73 75 73 20 2d 20 4e 6f 72 6d 61 6c 00 01 00 00    sus - Normal....
00000110:08 00 64 77 00 00 31 2e 30 2e 30 2e 39 00 a0 87    ..dw..1.0.0.9. ‡
00000120:69 65 6d 70 74 79 2c 61 6c 6c 74 61 6c 6b 2c 00    iempty,alltalk,.


вот так выглядит полный ответ от моего сервера

Автор: Setuper 12.3.2009, 17:42

Я понимаю, что он так выглядит. Я хочу понять какой символы с каким lua-кодом не могут выводиться в чат, для того чтобы их убрать. Что выводит код моего предыдущего поста?

Автор: IIPu3PAK 12.3.2009, 17:42

вот что выдало на ваш последний скрипт

Цитата
[00:42:07 | 172.16.153.15] <IIPu3PAK> !send
[00:42:08] Length of data = 152
[00:42:08] 255, 255, 255, 255, 73, 38, 76, 101, 102, 116, 32, 52, 32, 68, 101, 97, 100, 32, 115, 101, 114, 118, 101, 114, 32, 40, 118, 101, 114, 115, 117, 115, 32, 98, 121, 32, 73, 73, 80, 117, 51, 80, 65, 75, 32, 97, 110, 100, 32, 74, 111, 104, 110, 55, 49, 48, 41, 0, 108, 52, 100, 95, 118, 115, 95, 104, 111, 115, 112, 105, 116, 97, 108, 48, 52, 95, 105, 110, 116, 101, 114, 105, 111, 114, 0, 108, 101, 102, 116, 52, 100, 101, 97, 100, 0, 76, 52, 68, 32, 45, 32, 86, 101, 114, 115, 117, 115, 32, 45, 32, 78, 111, 114, 109, 97, 108, 0, 1, 0, 0, 8, 0, 100, 119, 0, 0, 49, 46, 48, 46, 48, 46, 57, 0, 160, 135, 105, 101, 109, 112, 116, 121, 44, 97, 108, 108, 116, 97, 108, 107, 44, 0,
[00:42:08] яяяяI&Left 4 Dead server (versus by IIPu3PAK and John710)

Автор: Setuper 12.3.2009, 17:43

Отлично, ща напишу функцию замены символов)))

Автор: IIPu3PAK 12.3.2009, 17:49

и еще некоторые коды символов котырые неможет выводить луа мне надо преобразовывать в специальные другие коды которые она сможет показать...надеюсь вы мне обьясните как

Автор: Setuper 12.3.2009, 17:51

Попробуй:

Код
function CorrectData(sData, sReplace)
  local sStr, iSmb = ''
  for i = 1, sData:len() do
    iSmb = sData:byte(i)
    if iSmb > 31 then
      sStr = sStr..string.char(iSmb)
    else
      sStr = sStr..sReplace
    end
  end
  return sStr
end

function OnTimer()
  local sData, sError = ReceiveData()
  if not sError and sData then
    -- мы получили какие-то данные sData и тут уже их обрабатываем
    StopTimer()
    SendToAll(CorrectData(sData, '*'))
  end
end


Невыводимые символы заменяются на *

Автор: IIPu3PAK 12.3.2009, 18:00

Теперь вообще ничего не выводит

Автор: Setuper 12.3.2009, 18:01

Исправил

Автор: IIPu3PAK 12.3.2009, 18:03

Цитата(Setuper @ 12.3.2009, 18:01) *
Исправил

ничего опять не выводит

Автор: Setuper 12.3.2009, 18:10

5 сек. Ща исправлю.

Вот так должно работать

Код
function CorrectData(sData, sReplace)
  local sStr, iSmb = ''
  for i = 1, sData:len() do
    iSmb = sData:byte(i)
    if iSmb > 31 then
      sStr = sStr..string.char(iSmb)
    else
      sStr = sStr..sReplace
    end
  end
  return sStr
end

Автор: IIPu3PAK 12.3.2009, 18:13

зы спасибо с последним скриптом вывел то что надо [01:13:45 | 172.16.153.15] <IIPu3PAK> !send
[01:13:46] яяяяI&Left 4 Dead server (co-op)*l4d_deadcity01_riverside9*left4dead*L4D - Co-op - Expert******dw**1.0.0.9* ‡iempty,alltalk,*

еще в хекс коде есть такая строчка "00 01 00 00 08 00 " .....
это количество игроков на сервере т.е. играет 1 слотов на карте 8 (эти значения могут меняться но всегда находятся между 00 ....как бы их поймать? тк они тоже невыводимые)
это те самые куча звездочек которые тут Expert******dw

и последнее если сервер вырублен то из-за скрипта жестоко лагает птоха

и еще количество символов 00 в ответе всегда одно и тоже

во сам исправил примерно так

Код
function CorrectData(sData, sReplace)
  local sStr, iSmb = ''
  for i = 1, sData:len() do
    iSmb = sData:byte(i)
    if iSmb > 31 then
      sStr = sStr..string.char(iSmb)
    elseif iSmb < 15 and iSmb > 0 then
      sStr = sStr..iSmb
    else
      sStr = sStr..sReplace
    end
  end
  return sStr
end


Код
[01:41:01] яяяяI&Left 4 Dead server (co-op)*l4d_deadcity01_riverside9*left4dead*L4D - Co-op - Expert*1**4*dw**1.0.0.9* ‡iempty,alltalk,*


но это неидеальный вариант :(

Автор: Setuper 12.3.2009, 18:45

Попробуй вот так, но я не уверен:

Код
function CorrectData(sData, sReplace)
  local iN, sStr, iSmb = 0, ''
  for i = 1, sData:len() do
    if iN == 0 then
      iSmb = sData:byte(i)
      if iSmb > 31 then
        sStr = sStr..string.char(iSmb)
      else
        local sP = GetPlayers(i, sData)
        if sP then
          sStr, iN = sStr..sP, 4
        else
          sStr = sStr..sReplace
        end
      end
    else
      iN = iN - 1
    end
  end
  return sStr
end

function GetPlayers(iNum, sData)
  local t, sStr, iSmb = {" Players: ", false, " Slots: ", false}, ''
  iSmb = sData:byte(iNum)
  if iSmb == 0 then
    for i,w in ipairs(t) do
      iSmb = sData:byte(iNum + i)
      if w then
        if iSmb == 0 then
          return
        end
        sStr = sStr..w..iSmb
      else
        if iSmb ~= 0 then
          return
        end
      end
    end
    return sStr
  end
end

Автор: IIPu3PAK 12.3.2009, 18:50

неа так непашет...ничего невыдет в итоге

Автор: Setuper 12.3.2009, 19:05

Кое что исправил. Попробуй.
Должно пахать. Я протестировал работоспособность.

Автор: IIPu3PAK 12.3.2009, 19:20

ничего не выводит

Автор: Setuper 12.3.2009, 19:27

А ошибки какие-нибудь скрипт выдаёт?
Почему у меня выводит, а у тебя не выводит?

Автор: IIPu3PAK 12.3.2009, 20:16

вообще никаких ошибок просто ничего непоказывает и все и лагает жутко птоха, как будто неподключилась к серверу(серв запущен)

Автор: Setuper 12.3.2009, 20:26

Вот полный код. Не знаю. Чем смог, тем помог.

CODE
local sDatagram = " FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69 6E 65 20 51 75 65 72 79 00 " -- отсылаемые данные
local sServerIp = "127.0.0.1" -- айпи
local sServerPort = 1209 -- порт
local iTimeOut = 1/100 -- таймаут соединения на получение
local iBuferSize = nil -- размер буфера (nil - стандартный)
----------------------------------------------------------------------------

-- loads the socket module
local socket = require("socket")

local myudp = socket.udp()

myudp:settimeout(iTimeOut)
myudp:setpeername(sServerIp, sServerPort)

-- уже точно не помню какие функции в старом апи, так что поправьте если накосячил!
function Main()
SetTimer(1000)
end

function GetPlayers(iNum, sData)
local t, sStr, iSmb = {" Players: ", false, " Slots: ", false}, ''
iSmb = sData:byte(iNum)
if iSmb == 0 then
for i,w in ipairs(t) do
iSmb = sData:byte(iNum + i)
if w then
if iSmb == 0 then
return
end
sStr = sStr..w..iSmb
else
if iSmb ~= 0 then
return
end
end
end
return sStr
end
end

function CorrectData(sData, sReplace)
local iN, sStr, iSmb = 0, ''
for i = 1, sData:len() do
if iN == 0 then
iSmb = sData:byte(i)
if iSmb > 31 then
sStr = sStr..string.char(iSmb)
else
local sP = GetPlayers(i, sData)
if sP then
sStr, iN = sStr..sP, 4
else
sStr = sStr..sReplace
end
end
else
iN = iN - 1
end
end
return sStr
end

function OnTimer()
local sData, sError = ReceiveData()
if not sError and sData then
-- мы получили какие-то данные sData и тут уже их обрабатываем
StopTimer()
SendToAll(CorrectData(sData, '*'))
end
end

function ChatArrival(tUser, sData)
local sCmd = sData:match"%b<> !send"
if sCmd then
StartTimer()
local _, sError = myudp:send(sDatagram, sServerIp, sServerPort)
if sError then
-- ошибка!
end
end
end

function OnExit()
myudp:close()
end
OnError = OnExit

function ReceiveData()
local sData, sError = myudp:receive(iBuferSize)
if sError then
-- ошибка!
return nil, sError
end
return sData
end

Автор: IIPu3PAK 14.3.2009, 18:41

вот пока еще не идеальный скрипт мониторинга

Код
local c = string.char
local sDatagram = c(0xFF)..c(0xFF)..c(0xFF)..c(0xFF)..c(0x54)..c(0x53)..c(0x6F)..c(0x75)..
c(0x72)..c(0x63)..c(0x65)..c(0x20)..c(0x45)..c(0x6E)..c(0x67)..c(0x69)..c(0x6E)..
c(0x65)..c(0x20)..c(0x51)..c(0x75)..c(0x65)..c(0x72)..c(0x79)..c(0x00)
--"0xFF..0xFF..0xFF..0xFF..0x54..0x53..0x6F..0x75..0x72..0x63..0x65..0x20..0x45..0x6E..0x67..0x69..
0x6E..0x65..0x20..0x51..0x75..0x65..0x72..0--x9..0x00" -- отсылаемые данные
local sServerIp = "192.168.23.15" -- айпи
local sServerPort = "27015" -- порт
local iTimeOut = 1 -- таймаут соединения на получение
local iBuferSize = nil -- размер буфера (nil - стандартный)
BotName = "Курильщик"        -- имя бота
BotDesc = "Закуривай;)"    -- описание бота
BotEmail = "hub@mail.ru"    -- email бота
----------------------------------------------------------------------------
-- loads the socket module
local socket = require("socket")

local myudp = socket.udp()

myudp:settimeout(iTimeOut)
myudp:setpeername(sServerIp, sServerPort)

-- уже точно не помню какие функции в старом апи, так что поправьте если накосячил!
function Main()
  SetTimer(1000)
  frmHub:RegBot(BotName, 1, BotDesc, BotEmail)
end

function CorrectData(sData, sReplace)
  local sStr, iSmb = ''
  for i = 1, sData:len() do
    iSmb = sData:byte(i)
    if iSmb > 243 and iSmb < 256 then
      sStr = sStr..sReplace
    elseif iSmb > 31 then
      sStr = sStr..string.char(iSmb)
    elseif  iSmb < 1 then
      sStr = sStr..sReplace
    elseif iSmb >= 1 then
    sStr = sStr..iSmb
    end
  end
  return sStr
end


function ChatArrival(tUser, sData)
  local sCmd = sData:match"%b<> !л4д"
  if sCmd then
    StartTimer()
    local _, sError = myudp:send(sDatagram, sServerIp, sServerPort)
    if sError then
      -- ошибка!
    end
  end
end

function OnExit()
  myudp:close()
end
OnError = OnExit

function ReceiveData()
  local sData, sError = myudp:receive(iBuferSize)
  if sError then
    -- ошибка!
    return nil, sError
  end
  return sData
end

function OnTimer()
  local sData, sError = ReceiveData()
  if not sError and sData then
    -- мы получили какие-то данные sData и тут уже их обрабатываем
    StopTimer()
    z=CorrectData(sData,'?')
   _,_,a,b,c,d,f= string.find(z,"????I7(.-)?(.-)?(.-)?(.-)?(.+)")
   f=string.sub(f, 3)
_,_,f,r,t= string.find(f,"(%d*)(%d)(.+)")
_,_,t= string.find(t,"(%d%p%d+%p%d+%p%d+)")
    SendToAll("Курильщик","Айпи адрес сервера--->192.168.23.15:27015")
    SendToAll("Курильщик","Название сервера--->"..a.."")
    SendToAll("Курильщик","Карта на сервере--->"..b.."")
    SendToAll("Курильщик","Тип и сложность игры--->"..d.."")
    if f==nil then
    SendToAll("Курильщик","Игроков на сервере--->"..f.."/"..r.."")
    else
    SendToAll("Курильщик","Игроков на сервере--->0/"..r.."")
    end
    SendToAll("Курильщик","Версия сервера--->"..t.."")
  end
end



как сделать в этом скрипте так чтобы отправлялась мессага юзеру а не всем.... З.Ы. как можно видеть из скрипта сообщения отправляются в функции онтаймер... а в этой функции нет tUser из chatarrival

еще вопрос вот строчка в коде _,_,a,b,c,d,f= string.find(z,"????I7(.-)?(.-)?(.-)?(.-)?(.+)") если изменить ее на _,_,a,b,c,d,f= string.find(z,"????(.-)?(.-)?(.-)?(.-)?(.+)") то переменный a,b становятся nil , с очтальными все норм....почему так?

Автор: Setuper 16.3.2009, 12:41

Закрыто, дабы автор темы создал тему в готовых скриптах.