Skip to content

Commit

Permalink
feat: handle automatically moving the server executable to nvim's dat…
Browse files Browse the repository at this point in the history
…a directory
  • Loading branch information
vyfor committed Dec 8, 2024
1 parent 694fb96 commit ae0fb6f
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 43 deletions.
79 changes: 57 additions & 22 deletions lua/cord.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,78 @@ local logger = require 'cord.util.logger'

local M = {}

function M.setup(opts)
if not config:validate(opts or {}) then return end
logger.set_level(config.values.log_level)

function M.initialize(config)
local client = ipc.new(config.values)
client:connect(function()
local file_manager = require 'cord.util.file_manager'
local utils = require 'cord.util'
local Producer = require 'cord.event.sender'
local Handler = require 'cord.event.receiver'
M.handler = Handler.new(client)

M.handler:register('ready', function()
logger.info 'Connected to Discord'

local Producer = require 'cord.event.sender'
local ActivityManager = require 'cord.activity.manager'
M.producer = Producer.new(client)
M.handler = Handler.new(client)

if config.values.hooks.on_ready then config.values.hooks.on_ready() end
local executable = file_manager.get_executable_name()
local target_path = file_manager.get_target_path(executable)
if utils.file_exists(target_path) then
M.handler:register('shutdown', function()
local data_path = file_manager.get_data_path()
local executable_path = data_path .. utils.path_sep .. executable

M.producer = Producer.new(client)
M.producer:initialize(config.values)
M.manager =
ActivityManager.new { tx = M.producer, config = config.values }
if not utils.file_exists(executable_path) then
utils.mkdir(data_path)
else
local ok, err = utils.rm_file(executable_path)
if not ok then
logger.error(
'Failed to remove existing executable: ' .. (err or '')
)
return
end
end

client:on_close(function()
if config.values.hooks.on_disconnect then
config.values.hooks.on_disconnect()
local ok, err = utils.move_file(target_path, executable_path)
if not ok then
logger.error('Failed to move executable: ' .. (err or ''))
return
end

M.manager:pause()
client:close()
M.initialize(config)
end)
M.producer:shutdown()
else
M.handler:register('ready', function()
logger.info 'Connected to Discord'

local ActivityManager = require 'cord.activity.manager'

M.manager:run()
end)
if config.values.hooks.on_ready then config.values.hooks.on_ready() end

M.producer:initialize(config.values)
M.manager =
ActivityManager.new { tx = M.producer, config = config.values }

client:on_close(function()
if config.values.hooks.on_disconnect then
config.values.hooks.on_disconnect()
end

M.manager:pause()
end)

M.manager:run()
end)
end

M.handler:run()
end)
end

M.client = client
function M.setup(opts)
if not config:validate(opts or {}) then return end
logger.set_level(config.values.log_level)
M.initialize(config)
end

return M
26 changes: 10 additions & 16 deletions lua/cord/core/spawn.lua
Original file line number Diff line number Diff line change
@@ -1,28 +1,22 @@
local logger = require 'cord.util.logger'
local utils = require 'cord.util'
local file_manager = require 'cord.util.file_manager'

local uv = vim.loop or vim.uv

local M = {}

local function get_plugin_root()
local source = debug.getinfo(1, 'S').source:sub(2)
return vim.fn.fnamemodify(source, ':h:h:h:h')
end

function M.spawn_server(config, path, callback)
local executable
if config.advanced.server.executable_path then
executable = config.advanced.server.executable_path
else
executable = utils.os_name == 'Windows' and 'target/release/cord.exe'
or 'target/release/cord'
executable = get_plugin_root() .. '/' .. executable
end
local executable = config.advanced.server.executable_path
if not executable then
local executable_path, err = file_manager.get_executable()

if err then
logger.error(err)
return
end

if not utils.file_exists(executable) then
logger.error('Server executable not found at \'' .. executable .. '\'')
return
executable = executable_path
end

local stdout = uv.new_pipe()
Expand Down
6 changes: 1 addition & 5 deletions lua/cord/event/receiver.lua
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,7 @@ end

function Handler:on_event(type, data)
local handler = self.handlers[type]
if handler then
handler(data)
else
logger.warn('Unknown event type: ' .. type)
end
if handler then handler(data) end
end

function Handler:register(type, callback) self.handlers[type] = callback end
Expand Down
54 changes: 54 additions & 0 deletions lua/cord/util/file_manager.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
local utils = require 'cord.util'

local M = {}

function M.get_plugin_root()
local source = debug.getinfo(1, 'S').source:sub(2)
return vim.fn.fnamemodify(source, ':h:h:h:h')
end

function M.get_target_path(name)
return M.get_plugin_root()
.. utils.path_sep
.. 'target'
.. utils.path_sep
.. 'release'
.. utils.path_sep
.. name
end

function M.get_data_path()
return vim.fn.stdpath 'data' .. utils.path_sep .. 'cord'
end

function M.get_executable_name()
return utils.os_name == 'Windows' and 'cord.exe' or 'cord'
end

function M.get_executable()
local executable_name = M.get_executable_name()
local target_path = M.get_target_path(executable_name)
local data_path = M.get_data_path()
local executable_path = data_path .. utils.path_sep .. executable_name

if utils.file_exists(target_path) then
if not utils.file_exists(executable_path) then
utils.mkdir(data_path)
else
local ok, err = utils.rm_file(executable_path)
if not ok then
return nil, 'Failed to remove existing executable: ' .. (err or '')
end
end

local ok, err = utils.move_file(target_path, executable_path)
if not ok then return nil, 'Failed to move executable: ' .. (err or '') end
return executable_path
end

if utils.file_exists(executable_path) then return executable_path end

return nil, 'Executable not found'
end

return M

0 comments on commit ae0fb6f

Please sign in to comment.