2024-08-06 01:11:09 +02:00
|
|
|
local utils = require('codemp.utils')
|
2024-08-06 18:46:22 +02:00
|
|
|
local buffers = require('codemp.buffers')
|
2024-08-24 01:56:27 +02:00
|
|
|
local session = require('codemp.session')
|
2024-08-06 01:11:09 +02:00
|
|
|
|
2024-09-16 20:01:09 +02:00
|
|
|
---@class UserHighlight
|
|
|
|
---@field ns integer namespace to use for this user
|
|
|
|
---@field hi string color for user to use
|
|
|
|
---@field pos [integer, integer] cursor start position of this user
|
|
|
|
|
|
|
|
---@type table<string, UserHighlight>
|
2024-08-06 01:11:09 +02:00
|
|
|
local user_hl = {}
|
|
|
|
|
2024-08-25 03:50:52 +02:00
|
|
|
local function fetch_workspaces_list()
|
2024-08-24 01:58:03 +02:00
|
|
|
local new_list = {}
|
2024-09-01 03:06:27 +02:00
|
|
|
local owned = session.client:list_workspaces(true, false):await()
|
|
|
|
for _, ws in pairs(owned) do
|
|
|
|
table.insert(new_list, {
|
|
|
|
name = ws,
|
|
|
|
owned = true,
|
|
|
|
})
|
|
|
|
end
|
|
|
|
local invited = session.client:list_workspaces(false, true):await()
|
|
|
|
for _, ws in pairs(invited) do
|
|
|
|
table.insert(new_list, {
|
|
|
|
name = ws,
|
|
|
|
owned = false,
|
|
|
|
})
|
|
|
|
end
|
|
|
|
session.available = new_list
|
2024-09-14 14:24:48 +02:00
|
|
|
require('codemp.window').update()
|
2024-08-24 01:58:03 +02:00
|
|
|
end
|
|
|
|
|
2024-08-24 01:56:27 +02:00
|
|
|
---@param ws Workspace
|
|
|
|
local function register_cursor_callback(ws)
|
|
|
|
local controller = ws.cursor
|
2024-09-16 20:14:32 +02:00
|
|
|
local once = true
|
2024-08-06 01:11:09 +02:00
|
|
|
vim.api.nvim_create_autocmd({"CursorMoved", "CursorMovedI", "ModeChanged"}, {
|
2024-08-24 01:56:27 +02:00
|
|
|
group = vim.api.nvim_create_augroup("codemp-workspace-" .. ws.name, { clear = true }),
|
2024-08-06 01:11:09 +02:00
|
|
|
callback = function (_)
|
|
|
|
local cur = utils.cursor.position()
|
2024-08-08 04:34:23 +02:00
|
|
|
local buf = vim.api.nvim_get_current_buf()
|
2024-08-06 01:11:09 +02:00
|
|
|
if buffers.map[buf] ~= nil then
|
2024-09-16 20:14:32 +02:00
|
|
|
once = true
|
2024-09-16 18:27:23 +02:00
|
|
|
local _ = controller:send({
|
|
|
|
buffer = buffers.map[buf],
|
|
|
|
start = cur[1],
|
|
|
|
finish = cur[2],
|
|
|
|
}) -- no need to await here
|
2024-09-16 20:14:32 +02:00
|
|
|
else -- set ourselves "away" only once
|
|
|
|
if once then
|
|
|
|
local _ = controller:send({
|
|
|
|
buffer = "",
|
|
|
|
start = { 0, 0 },
|
|
|
|
finish = { 0, 0 },
|
|
|
|
}) -- no need to await here
|
|
|
|
end
|
|
|
|
once = false
|
2024-08-06 01:11:09 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
2024-08-24 01:56:27 +02:00
|
|
|
---@param ws Workspace
|
|
|
|
local function register_cursor_handler(ws)
|
|
|
|
local controller = ws.cursor
|
2024-08-16 03:49:24 +02:00
|
|
|
local async = vim.loop.new_async(vim.schedule_wrap(function ()
|
2024-08-15 03:41:28 +02:00
|
|
|
while true do
|
2024-08-17 01:56:09 +02:00
|
|
|
local event = controller:try_recv():await()
|
2024-08-16 03:49:24 +02:00
|
|
|
if event == nil then break end
|
2024-09-16 20:01:09 +02:00
|
|
|
local user = event.user -- do it on separate line so language server understands that it wont be nil
|
|
|
|
if user ~= nil then
|
|
|
|
if user_hl[user] == nil then
|
|
|
|
user_hl[user] = {
|
|
|
|
ns = vim.api.nvim_create_namespace("codemp-cursor-" .. event.user),
|
|
|
|
hi = utils.color(event.user),
|
|
|
|
pos = { 0, 0 },
|
|
|
|
}
|
|
|
|
end
|
|
|
|
user_hl[user].pos = event.start
|
|
|
|
local old_buffer = buffers.users[event.user]
|
|
|
|
if old_buffer ~= nil then
|
|
|
|
local old_buffer_id = buffers.map_rev[old_buffer]
|
|
|
|
if old_buffer_id ~= nil then
|
|
|
|
vim.api.nvim_buf_clear_namespace(old_buffer_id, user_hl[event.user].ns, 0, -1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
buffers.users[event.user] = event.buffer
|
|
|
|
local buffer_id = buffers.map_rev[event.buffer]
|
|
|
|
if buffer_id ~= nil then
|
|
|
|
utils.multiline_highlight(
|
|
|
|
buffer_id,
|
|
|
|
user_hl[event.user].ns,
|
|
|
|
user_hl[event.user].hi,
|
|
|
|
event.start,
|
|
|
|
event.finish
|
|
|
|
)
|
|
|
|
end
|
|
|
|
if old_buffer ~= event.buffer then
|
|
|
|
require('codemp.window').update() -- redraw user positions
|
2024-08-17 04:26:49 +02:00
|
|
|
end
|
2024-08-17 03:28:34 +02:00
|
|
|
end
|
2024-08-15 03:41:28 +02:00
|
|
|
end
|
2024-08-16 03:49:24 +02:00
|
|
|
end))
|
|
|
|
controller:callback(function (_controller) async:send() end)
|
|
|
|
end
|
|
|
|
|
2024-08-23 00:59:13 +02:00
|
|
|
---@param workspace string workspace name to join
|
|
|
|
---@return Workspace
|
|
|
|
---join a workspace and register event handlers
|
2024-08-16 03:49:24 +02:00
|
|
|
local function join(workspace)
|
2024-08-24 01:56:27 +02:00
|
|
|
local ws = session.client:join_workspace(workspace):await()
|
|
|
|
print(" >< joined workspace " .. ws.name)
|
|
|
|
register_cursor_callback(ws)
|
|
|
|
register_cursor_handler(ws)
|
2024-09-16 20:01:09 +02:00
|
|
|
utils.poller(
|
|
|
|
function() return ws:event() end,
|
|
|
|
function(event)
|
|
|
|
if event.type == "leave" then
|
|
|
|
if buffers.users[event.value] ~= nil then
|
|
|
|
vim.schedule(function ()
|
|
|
|
local buf_name = buffers.users[event.value]
|
|
|
|
vim.api.nvim_buf_clear_namespace(buffers.map_rev[buf_name], user_hl[event.value].ns, 0, -1)
|
|
|
|
buffers.users[event.value] = nil
|
|
|
|
user_hl[event.value] = nil
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
elseif event.type == "join" then
|
|
|
|
buffers.users[event.value] = ""
|
|
|
|
user_hl[event.value] = {
|
|
|
|
ns = vim.api.nvim_create_namespace("codemp-cursor-" .. event.value),
|
|
|
|
hi = utils.color(event.value),
|
|
|
|
pos = { 0, 0 },
|
|
|
|
}
|
|
|
|
end
|
|
|
|
vim.schedule(function() require('codemp.window').update() end)
|
|
|
|
end
|
|
|
|
)
|
2024-08-24 01:56:27 +02:00
|
|
|
|
|
|
|
session.workspace = ws
|
2024-09-14 14:24:48 +02:00
|
|
|
require('codemp.window').update()
|
2024-08-22 22:07:00 +02:00
|
|
|
|
|
|
|
return ws
|
2024-08-06 01:11:09 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
local function leave()
|
2024-08-24 01:56:27 +02:00
|
|
|
session.client:leave_workspace(session.workspace.name)
|
2024-08-06 01:11:09 +02:00
|
|
|
print(" -- left workspace")
|
2024-08-24 01:56:27 +02:00
|
|
|
session.workspace = nil
|
2024-08-06 01:11:09 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
return {
|
|
|
|
join = join,
|
|
|
|
leave = leave,
|
|
|
|
map = user_hl,
|
2024-08-24 01:58:03 +02:00
|
|
|
list = fetch_workspaces_list,
|
2024-08-06 01:11:09 +02:00
|
|
|
}
|