|
|
|
Запрос времени из Интернта GetNetworkTime() (LUA) |
|
|
SeregaB |
28.6.2022, 17:05
|
Neophyte
Сообщений: 47
Регистрация: 22.9.2019 Группа: Пользователи Наличность: 0
Пользователь №: 19.405
|
Цитата(SeregaB @ 28.6.2022, 13:44) Подскажите пожалуйста, делал ли кто то запрос на время из интернета в LUA? Как это сделать с помощью команды GetNetworkTime()? NtpServers = { "time.windows.com", "pool.ntp.org", "time-a.nist.gov" }
как пример есть некая функция для C++ Код public static DateTime GetNetworkTime() { //default Windows time server const string ntpServer = "time.windows.com";
// NTP message size - 16 bytes of the digest (RFC 2030) var ntpData = new byte[48];
//Setting the Leap Indicator, Version Number and Mode values ntpData[0] = 0x1B; //LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode)
var addresses = Dns.GetHostEntry(ntpServer).AddressList;
//The UDP port number assigned to NTP is 123 var ipEndPoint = new IPEndPoint(addresses[0], 123); //NTP uses UDP var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Connect(ipEndPoint);
socket.Send(ntpData); socket.Receive(ntpData); socket.Close();
//Offset to get to the "Transmit Timestamp" field (time at which the reply //departed the server for the client, in 64-bit timestamp format." const byte serverReplyTime = 40;
//Get the seconds part ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);
//Get the seconds fraction ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);
//Convert From big-endian to little-endian intPart = SwapEndianness(intPart); fractPart = SwapEndianness(fractPart);
var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
//**UTC** time var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds);
return networkDateTime; }
// stackoverflow.com/a/3294698/162671 static uint SwapEndianness(ulong x) { return (uint)(((x & 0x000000ff) << 24) + ((x & 0x0000ff00) << 8) + ((x & 0x00ff0000) >> 8) + ((x & 0xff000000) >> 24)); }
ее как то можно изменить и применить для LUA?
|
|
|
|
SeregaB |
28.6.2022, 18:35
|
Neophyte
Сообщений: 47
Регистрация: 22.9.2019 Группа: Пользователи Наличность: 0
Пользователь №: 19.405
|
Цитата(Madeus @ 28.6.2022, 18:04) С ходу нагуглилось это https://gist.github.com/ericroy/453ecae379d...c2311d3b6bf49f0в принципе работает только возвращает в таком формате NTP time: 1656428417.1801. А для каких целей тебе это надо? хочу попробовать сделать ограничение по времени на использование бота, чтоб оно не было привязано к системному времени.
|
|
|
|
SeregaB |
29.6.2022, 11:54
|
Neophyte
Сообщений: 47
Регистрация: 22.9.2019 Группа: Пользователи Наличность: 0
Пользователь №: 19.405
|
Цитата(Madeus @ 28.6.2022, 18:43) А какая разница какое время системное, даже если оно не синхронизированое с нтп, или нтп?
Разница в том, что системное можно изменить, а время и дату из интернета не изменишь. Тем самым сделать привязку работы скрипта в времени из инета. Цитата(DarkMaster @ 28.6.2022, 19:23) А где вы эту функцию вообще нашли? Какая дллка ее содержит?
getNetworkTime() вшита в одну в"Вражескую программу", которая работает на LUA коде. И время там можно определить так: Код local tNet = os.date("*t", getNetworkTime() / 1000) print (tNet.year) print (tNet.month) print (tNet.day) print (tNet.hour)
|
|
|
|
Madeus |
29.6.2022, 14:43
|
Apprentice
Сообщений: 283
Регистрация: 19.11.2019 Группа: Пользователи Наличность: 8478
Пользователь №: 19.451
Возраст: 32
|
Все то же самое из ссылке что давал выше, только дополнительно подключаем socket и меняем принты на логи. code
Исходный код --lua local socket = require('socket') local M = {}
local DEFAULT_NTP_HOSTS = { "time.windows.com", "pool.ntp.org", "time-a.nist.gov" } local DEFAULT_NTP_PORT = 123
-- The seconds from Jan 1, 1900 to Jan 1, 1970 local SHIFT_TO_UNIX_EPOCH = 0x83AA7E80
-- Build a message. Set the first byte's bits to 00,011,011 for li = 0, vn = 3, and mode = 3 local NTP_TIME_QUERY = string. char(0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0)
local function read_uint32(s, offset) local v = s:byte(offset + 1) v = v * 256 + s:byte(offset + 2) v = v * 256 + s:byte(offset + 3) v = v * 256 + s:byte(offset + 4) return v end
local time_check_prototype = { __gc = function(self) self.s:close() end,
-- timeout: Pass nil to block until ready, or a max number of seconds to wait get = function(self, timeout) if self.ts then return self.ts end self.s:settimeout(timeout) local packet, timed_out = self.s:receive() if not timed_out and #packet >= 48 then -- Get the txTm_s field (transmit time, in seconds) -- Add the txTm_f value, converted to a fraction local seconds = read_uint32(packet, 40) - SHIFT_TO_UNIX_EPOCH local fraction = read_uint32(packet, 44) / 0xffffffff self.ts = seconds + fraction self.s:close() end return self.ts end, }
function M.start_time_check(hosts, port) port = port or DEFAULT_NTP_PORT hosts = hosts or DEFAULT_NTP_HOSTS if type(hosts) == 'string' then hosts = {hosts} end
local s = socket.udp() if not s then return nil, 'NTP: Failed to create UDP socket' end
-- Resolve ip addresses local ips = {} for _, host in ipairs(hosts) do local ip = socket.dns.toip(host) if ip then table.insert(ips, ip) end end
if #ips == 0 then return nil, 'NTP: Address resolution failed for all hosts in list' end
-- Send a time request to each ip local any_sent = false for _, ip in ipairs(ips) do if s:sendto(NTP_TIME_QUERY, ip, port) then any_sent = true end end
if not any_sent then return nil, 'NTP: sendto() failed' end
return setmetatable({s = s}, {__index = time_check_prototype}) end
function M.test() local t = assert(M.start_time_check()) local ts = assert(t:get(10), 'NTP: Check failed') assert(type(ts == 'number') and ts > 1483228800) return ts end
--return M local tNet = os.date("*t", M.test()) log(tNet.year) log(tNet.month) log(tNet.day) log(tNet.hour)
Где то уже прикреплял socket сам найти не могу дублирую сюда, распаковать в папку пилота
Прикрепленные файлы
lua_socket.zip ( 2,72 мегабайт )
Кол-во скачиваний: 198
|
|
|
|
DarkMaster |
1.7.2022, 8:13
|
Модератор UOPilot
Сообщений: 9.468
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27737
Пользователь №: 11.279
|
Форма таймштампа лего преобразуется кстати. Функция os.date([format[, time]]) %a abbreviated weekday name (e.g., Wed) %A full weekday name (e.g., Wednesday) %b abbreviated month name (e.g., Sep) %B full month name (e.g., September) %c date and time (e.g., 09/16/98 23:48:10) %d day of the month (16) [01-31] %H hour, using a 24-hour clock (23) [00-23] %I hour, using a 12-hour clock (11) [01-12] %M minute (48) [00-59] %m month (09) [01-12] %p either "am" or "pm" (pm) %S second (10) [00-61] %w weekday (3) [0-6 = Sunday-Saturday] %x date (e.g., 09/16/98) %X time (e.g., 23:48:10) %Y full year (1998) %y two-digit year (98) [00-99] %% the character `%ґ Код log(os.date(nil, 1656428417.1801)) log(os.date("%Y", 1656428417.1801)) log(os.date("%m", 1656428417.1801)) log(os.date("%d", 1656428417.1801)) log(os.date("%H", 1656428417.1801)) По поводу той сишной функции. Если она видима для луа, то можно сделать так: local ffi = require[[ffi]] ffi.cdef[[ unsigned int GetNetworkTime(); ]] -- дальше спокойно вызываем функцию log(os.date(nil, GetNetworkTime())) Тем не менее обращаю ваше внимание, что в вашем луа коде getNetworkTime, а в сишном GetNetworkTime (с большой буквы G), а это разное написание и оно должно совпадать. Сообщение отредактировал DarkMaster - 1.7.2022, 8:09
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|