Skip to content

Commit

Permalink
Merge pull request #18
Browse files Browse the repository at this point in the history
Support timeline navigation
  • Loading branch information
malkoG committed Jan 2, 2023
2 parents 2b8e517 + ff3fa0e commit cfca589
Show file tree
Hide file tree
Showing 5 changed files with 155 additions and 87 deletions.
16 changes: 15 additions & 1 deletion lua/mastodon/api_client.lua
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,30 @@ M.get_status = function(status_id)
return status
end

M.fetch_home_timeline = function()
M.fetch_home_timeline = function(params)
local active_accounts = db_client:get_active_account()
local active_account = active_accounts[1]
local query = {}

if params.since_id ~= nil then
query.since_id = params.since_id
end

if params.max_id ~= nil then
query.max_id = params.max_id
end

if params.min_id ~= nil then
query.min_id = params.min_id
end

local access_token = active_account.access_token
local instance_url = active_account.instance_url

local url = instance_url .. "/api/v1/timelines/home"

local res = curl.get(url, {
query = query,
headers = {
accept = "application/json",
content_type = "application/json",
Expand Down
105 changes: 90 additions & 15 deletions lua/mastodon/commands.lua
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ end


M.fetch_home_timeline = function()
local statuses = api_client.fetch_home_timeline()
local statuses = api_client.fetch_home_timeline({})
local bufnr = 0
local buf = nil
local target_buf_name = "Mastodon Home"
Expand All @@ -117,7 +117,22 @@ M.fetch_home_timeline = function()
bufnr = vim.api.nvim_get_current_buf()
renderer.render_home_timeline(bufnr, win, statuses)

vim.api.nvim_win_set_cursor(0, {1, 0})
local max_status_id = nil
local min_status_id = nil
max_status_id = statuses[1]["id"]
min_status_id = statuses[#statuses]["id"]

if max_status_id ~= nil then
if vim.b[bufnr].max_status_id == nil then
vim.b[bufnr].max_status_id = max_status_id
end
end

if min_status_id ~= nil then
if vim.b[bufnr].min_status_id == nil then
vim.b[bufnr].min_status_id = min_status_id
end
end
end

M.fetch_bookmarks = function()
Expand All @@ -141,8 +156,6 @@ M.fetch_bookmarks = function()

bufnr = vim.api.nvim_get_current_buf()
renderer.render_bookmarks(bufnr, win, statuses)

vim.api.nvim_win_set_cursor(0, {1, 0})
end

M.fetch_favourites = function()
Expand All @@ -166,8 +179,6 @@ M.fetch_favourites = function()

bufnr = vim.api.nvim_get_current_buf()
renderer.render_favourites(bufnr, win, statuses)

vim.api.nvim_win_set_cursor(0, {1, 0})
end

M.fetch_replies = function()
Expand All @@ -191,8 +202,6 @@ M.fetch_replies = function()

bufnr = vim.api.nvim_get_current_buf()
renderer.render_replies(bufnr, win, statuses)

vim.api.nvim_win_set_cursor(0, {1, 0})
end

M.reload_statuses = function()
Expand All @@ -207,10 +216,25 @@ M.reload_statuses = function()
vim.api.nvim_buf_delete(bufnr, {})
bufnr = new_buf

local statuses = api_client.fetch_home_timeline()
local statuses = api_client.fetch_home_timeline({})
renderer.render_home_timeline(bufnr, win, statuses)

vim.api.nvim_win_set_cursor(0, {1, 0})
local max_status_id = nil
local min_status_id = nil
max_status_id = statuses[1]["id"]
min_status_id = statuses[#statuses]["id"]

if max_status_id ~= nil then
if vim.b[bufnr].max_status_id == nil then
vim.b[bufnr].max_status_id = max_status_id
end
end

if min_status_id ~= nil then
if vim.b[bufnr].min_status_id == nil then
vim.b[bufnr].min_status_id = min_status_id
end
end
elseif string.find(buf_name, "Mastodon Bookmark") then
local new_buf = vim.api.nvim_create_buf(true, true)
vim.api.nvim_win_set_buf(win, new_buf)
Expand All @@ -219,8 +243,6 @@ M.reload_statuses = function()

local statuses = api_client.fetch_bookmarks()
renderer.render_bookmarks(bufnr, win, statuses)

vim.api.nvim_win_set_cursor(0, {1, 0})
elseif string.find(buf_name, "Mastodon Favourites") then
local new_buf = vim.api.nvim_create_buf(true, true)
vim.api.nvim_win_set_buf(win, new_buf)
Expand All @@ -229,8 +251,6 @@ M.reload_statuses = function()

local statuses = api_client.fetch_favourites()
renderer.render_favourites(bufnr, win, statuses)

vim.api.nvim_win_set_cursor(0, {1, 0})
elseif string.find(buf_name, "Mastodon Replies") then
local new_buf = vim.api.nvim_create_buf(true, true)
vim.api.nvim_win_set_buf(win, new_buf)
Expand All @@ -239,8 +259,63 @@ M.reload_statuses = function()

local statuses = api_client.fetch_replies()
renderer.render_favourites(bufnr, win, statuses)
end
end


M.fetch_older_statuses = function()
local win = vim.api.nvim_get_current_win()
local bufnr = vim.api.nvim_get_current_buf()
local min_status_id = vim.b[bufnr].min_status_id

local buf_name = vim.api.nvim_buf_get_name(bufnr)
local fetch_statuses = api_client.fetch_home_timeline
local render_statuses = renderer.render_home_timeline

if string.find(buf_name, "Mastodon Home") then
fetch_statuses = api_client.fetch_home_timeline
render_statuses = renderer.render_home_timeline
end

if string.find(buf_name, "Mastodon Home") then
local statuses = fetch_statuses({ max_id = min_status_id })
if #statuses > 0 then
min_status_id = statuses[#statuses]["id"]

if min_status_id ~= nil then
vim.b[bufnr].min_status_id = min_status_id
end
end

render_statuses(bufnr, win, statuses, { mode = "append" })
end
end

M.fetch_newer_statuses = function()
local win = vim.api.nvim_get_current_win()
local bufnr = vim.api.nvim_get_current_buf()
local max_status_id = vim.b[bufnr].max_status_id

local buf_name = vim.api.nvim_buf_get_name(bufnr)
local fetch_statuses = api_client.fetch_home_timeline
local render_statuses = renderer.render_home_timeline

if string.find(buf_name, "Mastodon Home") then
fetch_statuses = api_client.fetch_home_timeline
render_statuses = renderer.render_home_timeline
end

if string.find(buf_name, "Mastodon Home") then
local statuses = fetch_statuses({ min_id = max_status_id })
if #statuses > 0 then
max_status_id = statuses[1]["id"]

if max_status_id ~= nil then
vim.b[bufnr].max_status_id = max_status_id
end
end

vim.api.nvim_win_set_cursor(0, {1, 0})
render_statuses(bufnr, win, statuses, { mode = "prepend" })
end
end

Expand Down
110 changes: 39 additions & 71 deletions lua/mastodon/renderer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ local function prepare_statuses(statuses, width)
}
end

M.render_home_timeline = function(bufnr, win, statuses)
local function render_statuses(bufnr, win, statuses, buf_name, mode)
local namespaces = vim.api.nvim_get_namespaces()
local mastodon_ns = namespaces['MastodonNS']

Expand All @@ -254,98 +254,66 @@ M.render_home_timeline = function(bufnr, win, statuses)
local line_numbers = result.line_numbers
local metadata = result.metadata

vim.api.nvim_buf_set_name(bufnr, "Mastodon Home")
local offset = 0
vim.api.nvim_buf_set_name(bufnr, buf_name)
vim.api.nvim_buf_set_option(bufnr, "filetype", "mastodon")
vim.api.nvim_buf_set_lines(0, 0, 0, 'true', lines)
vim.api.nvim_win_set_hl_ns(win, mastodon_ns)

for _, line_number in ipairs(line_numbers) do
vim.api.nvim_buf_add_highlight(bufnr, mastodon_ns, "MastodonHandle", line_number, 0, -1)
end

for _, metadata_for_line in ipairs(metadata) do
vim.api.nvim_buf_set_extmark(bufnr, mastodon_ns, metadata_for_line.line_number, 0, {
virt_text = {{metadata_for_line.data, "Whitespace"}},
})
if mode == "prepend" then
offset = 0
vim.api.nvim_buf_set_lines(bufnr, 0, 0, 'true', lines)
elseif mode == "append" then
offset = vim.api.nvim_buf_line_count(bufnr)
vim.api.nvim_buf_set_lines(bufnr, -1, -1, 'true', lines)
end
end

M.render_bookmarks = function(bufnr, win, statuses)
local namespaces = vim.api.nvim_get_namespaces()
local mastodon_ns = namespaces['MastodonNS']

local width = vim.api.nvim_win_get_width(win)
local result = prepare_statuses(statuses, width)
local lines = result.lines
local line_numbers = result.line_numbers
local metadata = result.metadata

vim.api.nvim_buf_set_name(bufnr, "Mastodon Bookmark")
vim.api.nvim_buf_set_option(bufnr, "filetype", "mastodon")
vim.api.nvim_buf_set_lines(0, 0, 0, 'true', lines)
vim.api.nvim_win_set_hl_ns(win, mastodon_ns)

for _, line_number in ipairs(line_numbers) do
vim.api.nvim_buf_add_highlight(bufnr, mastodon_ns, "MastodonHandle", line_number, 0, -1)
vim.api.nvim_buf_add_highlight(bufnr, mastodon_ns, "MastodonHandle", offset + line_number, 0, -1)
end

for _, metadata_for_line in ipairs(metadata) do
vim.api.nvim_buf_set_extmark(bufnr, mastodon_ns, metadata_for_line.line_number, 0, {
vim.api.nvim_buf_set_extmark(bufnr, mastodon_ns, offset + metadata_for_line.line_number, 0, {
virt_text = {{metadata_for_line.data, "Whitespace"}},
})
end
end

M.render_favourites = function(bufnr, win, statuses)
local namespaces = vim.api.nvim_get_namespaces()
local mastodon_ns = namespaces['MastodonNS']

local width = vim.api.nvim_win_get_width(win)
local result = prepare_statuses(statuses, width)
local lines = result.lines
local line_numbers = result.line_numbers
local metadata = result.metadata

vim.api.nvim_buf_set_name(bufnr, "Mastodon Favourites")
vim.api.nvim_buf_set_option(bufnr, "filetype", "mastodon")
vim.api.nvim_buf_set_lines(0, 0, 0, 'true', lines)
vim.api.nvim_win_set_hl_ns(win, mastodon_ns)

for _, line_number in ipairs(line_numbers) do
vim.api.nvim_buf_add_highlight(bufnr, mastodon_ns, "MastodonHandle", line_number, 0, -1)
if mode == "prepend" then
utils.scroll_to_top()
elseif mode == "append" then
utils.scroll_to_bottom()
end
end

for _, metadata_for_line in ipairs(metadata) do
vim.api.nvim_buf_set_extmark(bufnr, mastodon_ns, metadata_for_line.line_number, 0, {
virt_text = {{metadata_for_line.data, "Whitespace"}},
})
M.render_home_timeline = function(bufnr, win, statuses, options)
local mode = "prepend"
if options ~= nil then
mode = options.mode
end
render_statuses(bufnr, win, statuses, "Mastodon Home", mode)
end

M.render_replies = function(bufnr, win, statuses)
local namespaces = vim.api.nvim_get_namespaces()
local mastodon_ns = namespaces['MastodonNS']

local width = vim.api.nvim_win_get_width(win)
local result = prepare_statuses(statuses, width)
local lines = result.lines
local line_numbers = result.line_numbers
local metadata = result.metadata

vim.api.nvim_buf_set_name(bufnr, "Mastodon Replies")
vim.api.nvim_buf_set_option(bufnr, "filetype", "mastodon")
vim.api.nvim_buf_set_lines(0, 0, 0, 'true', lines)
vim.api.nvim_win_set_hl_ns(win, mastodon_ns)
M.render_bookmarks = function(bufnr, win, statuses, options)
local mode = "prepend"
if options ~= nil then
mode = options.mode
end
render_statuses(bufnr, win, statuses, "Mastodon Bookmark", mode)
end

for _, line_number in ipairs(line_numbers) do
vim.api.nvim_buf_add_highlight(bufnr, mastodon_ns, "MastodonHandle", line_number, 0, -1)
M.render_favourites = function(bufnr, win, statuses, options)
local mode = "prepend"
if options ~= nil then
mode = options.mode
end
render_statuses(bufnr, win, statuses, "Mastodon Favourites", mode)
end

for _, metadata_for_line in ipairs(metadata) do
vim.api.nvim_buf_set_extmark(bufnr, mastodon_ns, metadata_for_line.line_number, 0, {
virt_text = {{metadata_for_line.data, "Whitespace"}},
})
M.render_replies = function(bufnr, win, statuses, options)
local mode = "prepend"
if options ~= nil then
mode = options.mode
end
render_statuses(bufnr, win, statuses, "Mastodon Replies", mode)
end

M.flatten_nodes = flatten_nodes
Expand Down
9 changes: 9 additions & 0 deletions lua/mastodon/utils.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@ M.trim = function(s)
return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
end

M.scroll_to_top = function()
vim.api.nvim_win_set_cursor(0, {1, 0})
end

M.scroll_to_bottom = function()
local target = vim.api.nvim_buf_line_count(0)
vim.api.nvim_win_set_cursor(0, {target, 0})
end

M.execute_curl = function(curl_command)
local handle = io.popen(curl_command, 'r')
local response = handle:read("*a")
Expand Down
2 changes: 2 additions & 0 deletions plugin/mastodon.lua
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ vim.api.nvim_create_autocmd('FileType', {
-- if keymap starts with `,m`,
-- buffer-wide or system-wide commands should be called
map('n', ',mr', ":lua require('mastodon').reload_statuses()<CR>", default_opts)
map('n', ',mk', ":lua require('mastodon.commands').fetch_newer_statuses()<CR>", default_opts)
map('n', ',mj', ":lua require('mastodon.commands').fetch_older_statuses()<CR>", default_opts)

-- If keymap starts with `,t`
-- status-wide commands should be called
Expand Down

0 comments on commit cfca589

Please sign in to comment.