Как сделать чтобы не сворачивалась игра для выполнения команды?

invilso.

Известный
Автор темы
249
89
Версия MoonLoader
.027.0-preview
Здравствуйте, есть какой-то вариат сделать так чтобы оно не сворачивало игру ради выполнения команды?

Lua:
function execute_linux_command(command, temp_file)
    local handle = io.popen('start /exec ' .. command .. ' > '..temp_file)
    local result = handle:read("*a")
    handle:close()
    wait(100)
    local file = io.open(temp_file, "r")
    result = file:read('*all')
    file:close()
    return result
end
 
Решение
Здравствуйте, есть какой-то вариат сделать так чтобы оно не сворачивало игру ради выполнения команды?

Lua:
function execute_linux_command(command, temp_file)
    local handle = io.popen('start /exec ' .. command .. ' > '..temp_file)
    local result = handle:read("*a")
    handle:close()
    wait(100)
    local file = io.open(temp_file, "r")
    result = file:read('*all')
    file:close()
    return result
end
Используй FFI для этого:

What do u think about this code??????:
local ffi = require 'ffi'

ffi.cdef[[
    int ShellExecuteA(void *hwnd, const char *lpOperation, const char *lpFile, const char *lpParameters, const char *lpDirectory, int nShowCmd);
]]
local shell32 = ffi.load('shell32')

local function execute(command, callback)
    local tmpFilePath = ''...

invilso.

Известный
Автор темы
249
89
Попробуй так:
Lua:
function execute_linux_command(command, temp_file)
    os.execute(command .. ' > '..temp_file)
    wait(100)
    local file = io.open(temp_file, "r")
    local result = file:read('*all')
    file:close()
    return result
end
Не сработало, все также откинуло с игры, я наверное сделаю немножко костылем, потому что обрыл уже чуть не весь интернет в поиске нужного решения и ничего не подходит. Напишу маленький луа/питон скрипт который запустится при стартер игры в cmd минимизированном и будет принимать команды от игры и выполнять их.
 

СоМиК

Известный
457
310
Здравствуйте, есть какой-то вариат сделать так чтобы оно не сворачивало игру ради выполнения команды?

Lua:
function execute_linux_command(command, temp_file)
    local handle = io.popen('start /exec ' .. command .. ' > '..temp_file)
    local result = handle:read("*a")
    handle:close()
    wait(100)
    local file = io.open(temp_file, "r")
    result = file:read('*all')
    file:close()
    return result
end
Используй FFI для этого:

What do u think about this code??????:
local ffi = require 'ffi'

ffi.cdef[[
    int ShellExecuteA(void *hwnd, const char *lpOperation, const char *lpFile, const char *lpParameters, const char *lpDirectory, int nShowCmd);
]]
local shell32 = ffi.load('shell32')

local function execute(command, callback)
    local tmpFilePath = ''
    if callback then
        tmpFilePath = os.tmpname()
        command = ('%s > "%s"'):format(command, tmpFilePath)
    end
    local result = shell32.ShellExecuteA(nil, 'open', 'cmd.exe', ('/c %s'):format(command), nil, 0) > 32
    if callback and result then
        lua_thread.create(function()
            while not doesFileExist(tmpFilePath) do wait(0) end
            local tmpFile = io.open(tmpFilePath, 'r')
            local output = tmpFile:read('*a')
            tmpFile:close()
            os.remove(tmpFilePath)
            callback(output)
        end)
    end
    return result
end

execute('start "" "https://t.me/ReSale_Revolution_LK_Bot"') -- откроет тг бота лучшего скрипта для цр аризона рп фарм фарм фарм вирты ФАРМ
execute('start "" "C:\\Users"') -- откроет пользователей на диске C в проводнике
execute('echo "test callback"', function(output) print(output) end) -- вызовет каллбек с параметром output возвращающим строку "test callback"
execute('lua', function(output) print(output) end) --LuaJIT 2.1.0-beta3 -- Copyright (C) 2005-2017 Mike Pall. http://luajit.org/JIT: ON SSE2 SSE3 SSE4.1 AMD BMI2 fold cse dce fwd dse narrow loop abc sink fuse
 
  • Нравится
  • Грустно
Реакции: invilso. и ChromiusJ

invilso.

Известный
Автор темы
249
89
Используй FFI для этого:

What do u think about this code??????:
local ffi = require 'ffi'

ffi.cdef[[
    int ShellExecuteA(void *hwnd, const char *lpOperation, const char *lpFile, const char *lpParameters, const char *lpDirectory, int nShowCmd);
]]
local shell32 = ffi.load('shell32')

local function execute(command, callback)
    local tmpFilePath = ''
    if callback then
        tmpFilePath = os.tmpname()
        command = ('%s > "%s"'):format(command, tmpFilePath)
    end
    local result = shell32.ShellExecuteA(nil, 'open', 'cmd.exe', ('/c %s'):format(command), nil, 0) > 32
    if callback and result then
        lua_thread.create(function()
            while not doesFileExist(tmpFilePath) do wait(0) end
            local tmpFile = io.open(tmpFilePath, 'r')
            local output = tmpFile:read('*a')
            tmpFile:close()
            os.remove(tmpFilePath)
            callback(output)
        end)
    end
    return result
end

execute('start "" "https://t.me/ReSale_Revolution_LK_Bot"') -- откроет тг бота лучшего скрипта для цр аризона рп фарм фарм фарм вирты ФАРМ
execute('start "" "C:\\Users"') -- откроет пользователей на диске C в проводнике
execute('echo "test callback"', function(output) print(output) end) -- вызовет каллбек с параметром output возвращающим строку "test callback"
execute('lua', function(output) print(output) end) --LuaJIT 2.1.0-beta3 -- Copyright (C) 2005-2017 Mike Pall. http://luajit.org/JIT: ON SSE2 SSE3 SSE4.1 AMD BMI2 fold cse dce fwd dse narrow loop abc sink fuse
какое-то странное поведение заметил, первый раз команда выполнилась, после перезапуска скрипта она уже отказывается выполниться. Да и судя по всему до перезапуска выполнилась только одна команда
впринципе уже не нужно, написал на сокетах это, обработкой команд к linux и возвратом значений занимается скрипт питонячий.


---------------------------------------------
Решение которое у меня сработало, чтобы выполнить unix команду из gta_sa.exe который запущен через wine
В моем кейсе работает незаметно для глаза, то есть не подлагивает игра.

Код на питоне который получает команду, выполняет её и отправляет обратно ответ команды.
Command Handler:
import socket
import subprocess

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("127.0.0.1", 12345))

while True:
    data, addr = sock.recvfrom(1024)
    command = data.decode("utf-8")

    try:
        output = subprocess.check_output(command, shell=True)
        result = output.decode("utf-8")
    except subprocess.CalledProcessError as e:
        result = "Error: " + str(e)

    sock.sendto(result.encode("utf-8"), addr)


Скрипт на луа который отправляет команду и записывает ответ в консоль.
Lua:
local socket = require("socket")

function send_command(command, server_port)
    local udp = socket.udp()
    udp:setpeername("127.0.0.1", server_port)
    udp:send(command)
    udp:settimeout(1)

    local response, err = udp:receive()
    udp:close()

    if response then
        return response
    else
        return err
    end
end

local response = send_command("/usr/bin/nvidia-smi --query-gpu=index,utilization.gpu,memory.total,memory.used,memory.free --format=csv,noheader", 12345)
print(response)

Питонячий скрипт должен быть запущен постоянно, используя systemd или init.d это легко сделать.
 
Последнее редактирование:

СоМиК

Известный
457
310
какое-то странное поведение заметил, первый раз команда выполнилась, после перезапуска скрипта она уже отказывается выполниться. Да и судя по всему до перезапуска выполнилась только одна команда
впринципе уже не нужно, написал на сокетах это, обработкой команд к linux и возвратом значений занимается скрипт питонячий.


---------------------------------------------
Решение которое у меня сработало, чтобы выполнить unix команду из gta_sa.exe который запущен через wine
В моем кейсе работает незаметно для глаза, то есть не подлагивает игра.


Код на питоне который получает команду, выполняет её и отправляет обратно ответ команды.
Command Handler:
import socket
import subprocess

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("127.0.0.1", 12345))

while True:
    data, addr = sock.recvfrom(1024)
    command = data.decode("utf-8")

    try:
        output = subprocess.check_output(command, shell=True)
        result = output.decode("utf-8")
    except subprocess.CalledProcessError as e:
        result = "Error: " + str(e)

    sock.sendto(result.encode("utf-8"), addr)


Скрипт на луа который отправляет команду и записывает ответ в консоль.
Lua:
local socket = require("socket")

function send_command(command, server_port)
    local udp = socket.udp()
    udp:setpeername("127.0.0.1", server_port)
    udp:send(command)
    udp:settimeout(1)

    local response, err = udp:receive()
    udp:close()

    if response then
        return response
    else
        return err
    end
end

local response = send_command("/usr/bin/nvidia-smi --query-gpu=index,utilization.gpu,memory.total,memory.used,memory.free --format=csv,noheader", 12345)
print(response)

Питонячий скрипт должен быть запущен постоянно, используя systemd или init.d это легко сделать.
А что тебе нужно то было по итогу? Я не особо понял, почему мой вариант не подошёл
 

invilso.

Известный
Автор темы
249
89
А что тебе нужно то было по итогу? Я не особо понял, почему мой вариант не подошёл
То что ты и скинул, оно подошло бы проекрастно. Вот только твой вариант отработал только один раз и больше никак заводиться не хотел, даже после перезапуска гта.
 

СоМиК

Известный
457
310
Вот только твой вариант отработал только один раз и больше никак заводиться не хотел, даже после перезапуска гта.
без понятия почему такое могло бы быть) Я у себя проверял много раз, все работало ¯\_(ツ)_/¯
 

invilso.

Известный
Автор темы
249
89
без понятия почему такое могло бы быть) Я у себя проверял много раз, все работало ¯\_(ツ)_/¯
есть подозрения что это из-за вайна. Отмечу твой ответ решением в таком случае, вдруг пригодится кому.
 
  • Нравится
Реакции: СоМиК