1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-09 10:10:04 +08:00

fix(chat): fix chatting server port

This commit is contained in:
Shidong Wang 2021-10-24 21:33:03 +08:00
parent 7916f8067a
commit 7797732b37
No known key found for this signature in database
GPG Key ID: 41BB7053E835C848
3 changed files with 381 additions and 376 deletions

View File

@ -29,7 +29,7 @@ endif
let s:chat_address = '127.0.0.1' let s:chat_address = '127.0.0.1'
let s:chat_port = 8080 let s:chat_port = 8080
let s:chat_client_jar = fnamemodify(expand('<sfile>:p:h:h:h:h') . 'bundle\Chatting-server\target\Chatting-1.0-SNAPSHOT.jar', ':gs?[\\/]?/?') let s:chat_client_jar = fnamemodify(expand('<sfile>:p:h:h:h:h') . '/bundle/Chatting-server/target/Chatting-1.0-SNAPSHOT.jar', ':gs?[\\/]?/?')
function! SpaceVim#layers#chat#plugins() abort function! SpaceVim#layers#chat#plugins() abort
return [ return [

View File

@ -45,6 +45,7 @@ public class Server extends ServerSocket {
public Server() throws IOException { public Server() throws IOException {
super(SERVER_PORT); super(SERVER_PORT);
System.out.println("Server started on port:" + SERVER_PORT);
try { try {
while (true) { while (true) {
Socket socket = accept(); Socket socket = accept();

View File

@ -16,99 +16,103 @@ let s:opened_channels = []
let s:unread_msg_num = {} let s:unread_msg_num = {}
let s:st_sep = '' let s:st_sep = ''
let s:JOB = SpaceVim#api#import('job')
function! s:push_message(msg) abort function! s:push_message(msg) abort
if type(a:msg) == type([]) if type(a:msg) == type([])
for m in a:msg for m in a:msg
if !empty(m) if !empty(m)
call s:hander_msg(m) call s:hander_msg(m)
endif endif
endfor endfor
else else
if !empty(a:msg) if !empty(a:msg)
call s:hander_msg(a:msg) call s:hander_msg(a:msg)
endif
endif endif
endif
endfunction endfunction
function! s:hander_msg(msg) abort function! s:hander_msg(msg) abort
let info = json_decode(a:msg) let info = json_decode(a:msg)
call add(s:messages, info) call add(s:messages, info)
if info['type'] ==# 'onWindowChange' if info['type'] ==# 'onWindowChange'
let s:current_channel = info['name'] let s:current_channel = info['name']
if index(s:opened_channels, s:current_channel) == -1 if index(s:opened_channels, s:current_channel) == -1
call add(s:opened_channels, s:current_channel) call add(s:opened_channels, s:current_channel)
endif
if s:current_channel !=# ''
call s:update_statusline()
endif
elseif info['type'] ==# 'group_message'
let n = get(s:unread_msg_num, info['group_name'], 0)
let n += 1
if has_key(s:unread_msg_num, info['group_name'])
call remove(s:unread_msg_num, info['group_name'])
endif
call extend(s:unread_msg_num, {info['group_name'] : n})
if s:current_channel !=# ''
call s:update_statusline()
endif
elseif info['type'] ==# 'info_message'
if info['context'] =~# 'you are logined as '
let s:login_user = substitute(info['context'], 'you are logined as ', '', 'g')
endif
elseif info['type'] ==# 'onGetConnection'
let s:chatting_commands = split(info['commands'], ',')
endif endif
if s:current_channel !=# ''
call s:update_statusline()
endif
elseif info['type'] ==# 'group_message'
let n = get(s:unread_msg_num, info['group_name'], 0)
let n += 1
if has_key(s:unread_msg_num, info['group_name'])
call remove(s:unread_msg_num, info['group_name'])
endif
call extend(s:unread_msg_num, {info['group_name'] : n})
if s:current_channel !=# ''
call s:update_statusline()
endif
elseif info['type'] ==# 'info_message'
if info['context'] =~# 'you are logined as '
let s:login_user = substitute(info['context'], 'you are logined as ', '', 'g')
endif
elseif info['type'] ==# 'onGetConnection'
let s:chatting_commands = split(info['commands'], ',')
endif
endfunction endfunction
function! chat#chatting#start() abort function! chat#chatting#start() abort
if s:server_job_id == 0 if s:server_job_id == 0
call chat#logger#info('startting server, server_lib is ' . s:server_lib . '(' . (empty(glob(s:server_lib)) ? 'no such file' : 'file exists' ). ')') call chat#logger#info('startting server, server_lib is ' . s:server_lib . '(' . (filereadable(s:server_lib) ? 'no such file' : 'file exists' ). ')')
if has('nvim') let s:server_job_id = s:JOB.start(['java', '-cp', s:server_lib, 'com.wsdjeg.chat.Server', '-D', s:server_port],{
let s:server_job_id = jobstart(['java', '-cp', s:server_lib, 'com.wsdjeg.chat.Server'],{ \ 'on_stdout' : function('s:server_handler'),
\ 'on_stdout' : function('s:server_handler'), \ 'on_exit' : function('s:server_exit'),
\ }) \ })
elseif exists('*job#start') && !has('nvim') endif
let s:server_job_id = job#start(['java', '-cp', s:server_lib, 'com.wsdjeg.chat.Server'],{
\ 'on_stdout' : function('s:server_handler'),
\ })
endif
endif
endfunction endfunction
function! s:server_handler(id, data, event) abort function! s:server_handler(id, data, event) abort
for data in a:data
call chat#logger#info('server stdout:' . data)
endfor
endfunction
function! s:server_exit(id, data, event) abort
call chat#logger#info('server exit with code:' . a:data)
endfunction endfunction
function! s:client_handler(id, data, event) abort function! s:client_handler(id, data, event) abort
if a:event ==# 'stdout' if a:event ==# 'stdout'
call s:push_message(a:data) call s:push_message(a:data)
call s:update_msg_screen() call s:update_msg_screen()
elseif a:event ==# 'exit' elseif a:event ==# 'exit'
call chat#logger#info('client exit with code:' . a:data) call chat#logger#info('client exit with code:' . a:data)
let s:client_job_id = 0 let s:client_job_id = 0
endif endif
endfunction endfunction
function! s:ch_callbakc(ch, msg) abort function! s:ch_callbakc(ch, msg) abort
call s:push_message(a:msg) call s:push_message(a:msg)
call s:update_msg_screen() call s:update_msg_screen()
endfunction endfunction
function! s:start_client() abort function! s:start_client() abort
if has('nvim') if has('nvim')
if s:client_job_id == 0 if s:client_job_id == 0
let s:client_job_id = jobstart(['java', '-cp', s:server_lib, 'com.wsdjeg.chat.Client', s:server_ip, s:server_port],{ let s:client_job_id = jobstart(['java', '-cp', s:server_lib, 'com.wsdjeg.chat.Client', s:server_ip, s:server_port],{
\ 'on_stdout' : function('s:client_handler'), \ 'on_stdout' : function('s:client_handler'),
\ 'on_exit' : function('s:client_handler') \ 'on_exit' : function('s:client_handler')
\ }) \ })
call chat#logger#info('Server_lib:' . s:server_lib) call chat#logger#info('Server_lib:' . s:server_lib)
endif
else
let s:channel = ch_open(s:server_ip . ':' . s:server_port,
\ {'callback': function('s:ch_callbakc') ,'mode': 'nl', 'waittime': s:vim8_ch_waittime})
call chat#logger#info('Client channel status:' . ch_status(s:channel))
endif endif
call chat#logger#info('Client startting with server ip(' . s:server_ip . ') port(' . s:server_port . ')') else
let s:channel = ch_open(s:server_ip . ':' . s:server_port,
\ {'callback': function('s:ch_callbakc') ,'mode': 'nl', 'waittime': s:vim8_ch_waittime})
call chat#logger#info('Client channel status:' . ch_status(s:channel))
endif
call chat#logger#info('Client startting with server ip(' . s:server_ip . ') port(' . s:server_port . ')')
endfunction endfunction
let s:name = '__Chatting__' let s:name = '__Chatting__'
@ -118,362 +122,362 @@ let s:c_char = ''
let s:c_end = '' let s:c_end = ''
let s:msg_win_opened = 0 let s:msg_win_opened = 0
function! chat#chatting#OpenMsgWin() abort function! chat#chatting#OpenMsgWin() abort
if has('nvim') if has('nvim')
if s:client_job_id == 0 if s:client_job_id == 0
call s:start_client() call s:start_client()
endif endif
else
if !exists('s:channel') || ch_status(s:channel) !=# 'open'
call s:start_client()
endif
endif
if bufwinnr(s:name) < 0
if bufnr(s:name) != -1
exe 'silent! botright split ' . '+b' . bufnr(s:name)
else else
if !exists('s:channel') || ch_status(s:channel) !=# 'open' exe 'silent! botright split ' . s:name
call s:start_client()
endif
endif endif
if bufwinnr(s:name) < 0 else
if bufnr(s:name) != -1 exec bufwinnr(s:name) . 'wincmd w'
exe 'silent! botright split ' . '+b' . bufnr(s:name) endif
else call s:windowsinit()
exe 'silent! botright split ' . s:name call s:init_hi()
endif setl modifiable
let s:msg_win_opened = 1
if !empty(s:last_channel)
let s:current_channel = s:last_channel
endif
call s:update_msg_screen()
call s:echon()
while get(s:, 'quit_chating_win', 0) == 0
let nr = getchar()
if nr !=# "\<Up>" && nr !=# "\<Down>"
let s:complete_input_history_num = [0,0]
endif
if nr != 9
let s:complete_num = 0
endif
if nr == 13
call s:enter()
elseif nr ==# "\<Right>" || nr == 6 "<Right> 向右移动光标
let s:c_begin = s:c_begin . s:c_char
let s:c_char = matchstr(s:c_end, '^.')
let s:c_end = substitute(s:c_end, '^.', '', 'g')
elseif nr == 21 " ctrl+u clean the message
let s:c_begin = ''
elseif nr == 9 " use <tab> complete str
if s:complete_num == 0
let complete_base = s:c_begin
else
let s:c_begin = complete_base
endif
let s:c_begin = s:complete(complete_base, s:complete_num)
let s:complete_num += 1
elseif nr == 11 " ctrl+k delete the chars from cursor to the end
let s:c_char = ''
let s:c_end = ''
elseif nr ==# "\<M-Left>" || nr ==# "\<M-h>"
"<Alt>+<Left> 移动到左边一个聊天窗口
call s:previous_channel()
elseif nr ==# "\<M-Right>" || nr ==# "\<M-l>"
"<Alt>+<Right> 移动到右边一个聊天窗口
call s:next_channel()
elseif nr ==# "\<Left>" || nr == 2 "<Left> 向左移动光标
if s:c_begin !=# ''
let s:c_end = s:c_char . s:c_end
let s:c_char = matchstr(s:c_begin, '.$')
let s:c_begin = substitute(s:c_begin, '.$', '', 'g')
endif
elseif nr ==# "\<PageUp>"
let l = line('.') - winheight('$')
if l < 0
exe 0
else
exe l
endif
elseif nr ==# "\<PageDown>"
exe line('.') + winheight('$')
elseif nr ==# "\<Home>" || nr == 1 "<Home> 或 <ctrl> + a 将光标移动到行首
let s:c_end = substitute(s:c_begin . s:c_char . s:c_end, '^.', '', 'g')
let s:c_char = matchstr(s:c_begin, '^.')
let s:c_begin = ''
elseif nr ==# "\<End>" || nr == 5 "<End> 或 <ctrl> + e 将光标移动到行末
let s:c_begin = s:c_begin . s:c_char . s:c_end
let s:c_char = ''
let s:c_end = ''
elseif nr ==# s:close_windows_char
let s:quit_chating_win = 1
elseif nr == 8 || nr ==# "\<bs>" " ctrl+h or <bs> delete last char
let s:c_begin = substitute(s:c_begin,'.$','','g')
elseif nr ==# "\<Up>"
if s:complete_input_history_num == [0,0]
let complete_input_history_base = s:c_begin
let s:c_char = ''
let s:c_end = ''
else
let s:c_begin = complete_input_history_base
endif
let s:complete_input_history_num[0] += 1
let s:c_begin = s:complete_input_history(complete_input_history_base, s:complete_input_history_num)
elseif nr ==# "\<Down>"
if s:complete_input_history_num == [0,0]
let complete_input_history_base = s:c_begin
let s:c_char = ''
let s:c_end = ''
else
let s:c_begin = complete_input_history_base
endif
let s:complete_input_history_num[1] += 1
let s:c_begin = s:complete_input_history(complete_input_history_base, s:complete_input_history_num)
else else
exec bufwinnr(s:name) . 'wincmd w' let s:c_begin .= nr2char(nr)
endif endif
call s:windowsinit()
call s:init_hi()
setl modifiable
let s:msg_win_opened = 1
if !empty(s:last_channel)
let s:current_channel = s:last_channel
endif
call s:update_msg_screen()
call s:echon() call s:echon()
while get(s:, 'quit_chating_win', 0) == 0 endwhile
let nr = getchar() setl nomodifiable
if nr !=# "\<Up>" && nr !=# "\<Down>" exe 'bd ' . bufnr(s:name)
let s:complete_input_history_num = [0,0] let s:quit_chating_win = 0
endif let s:last_channel = s:current_channel
if nr != 9 let s:current_channel = ''
let s:complete_num = 0 let s:msg_win_opened = 0
endif normal! :
if nr == 13
call s:enter()
elseif nr ==# "\<Right>" || nr == 6 "<Right> 向右移动光标
let s:c_begin = s:c_begin . s:c_char
let s:c_char = matchstr(s:c_end, '^.')
let s:c_end = substitute(s:c_end, '^.', '', 'g')
elseif nr == 21 " ctrl+u clean the message
let s:c_begin = ''
elseif nr == 9 " use <tab> complete str
if s:complete_num == 0
let complete_base = s:c_begin
else
let s:c_begin = complete_base
endif
let s:c_begin = s:complete(complete_base, s:complete_num)
let s:complete_num += 1
elseif nr == 11 " ctrl+k delete the chars from cursor to the end
let s:c_char = ''
let s:c_end = ''
elseif nr ==# "\<M-Left>" || nr ==# "\<M-h>"
"<Alt>+<Left> 移动到左边一个聊天窗口
call s:previous_channel()
elseif nr ==# "\<M-Right>" || nr ==# "\<M-l>"
"<Alt>+<Right> 移动到右边一个聊天窗口
call s:next_channel()
elseif nr ==# "\<Left>" || nr == 2 "<Left> 向左移动光标
if s:c_begin !=# ''
let s:c_end = s:c_char . s:c_end
let s:c_char = matchstr(s:c_begin, '.$')
let s:c_begin = substitute(s:c_begin, '.$', '', 'g')
endif
elseif nr ==# "\<PageUp>"
let l = line('.') - winheight('$')
if l < 0
exe 0
else
exe l
endif
elseif nr ==# "\<PageDown>"
exe line('.') + winheight('$')
elseif nr ==# "\<Home>" || nr == 1 "<Home> 或 <ctrl> + a 将光标移动到行首
let s:c_end = substitute(s:c_begin . s:c_char . s:c_end, '^.', '', 'g')
let s:c_char = matchstr(s:c_begin, '^.')
let s:c_begin = ''
elseif nr ==# "\<End>" || nr == 5 "<End> 或 <ctrl> + e 将光标移动到行末
let s:c_begin = s:c_begin . s:c_char . s:c_end
let s:c_char = ''
let s:c_end = ''
elseif nr ==# s:close_windows_char
let s:quit_chating_win = 1
elseif nr == 8 || nr ==# "\<bs>" " ctrl+h or <bs> delete last char
let s:c_begin = substitute(s:c_begin,'.$','','g')
elseif nr ==# "\<Up>"
if s:complete_input_history_num == [0,0]
let complete_input_history_base = s:c_begin
let s:c_char = ''
let s:c_end = ''
else
let s:c_begin = complete_input_history_base
endif
let s:complete_input_history_num[0] += 1
let s:c_begin = s:complete_input_history(complete_input_history_base, s:complete_input_history_num)
elseif nr ==# "\<Down>"
if s:complete_input_history_num == [0,0]
let complete_input_history_base = s:c_begin
let s:c_char = ''
let s:c_end = ''
else
let s:c_begin = complete_input_history_base
endif
let s:complete_input_history_num[1] += 1
let s:c_begin = s:complete_input_history(complete_input_history_base, s:complete_input_history_num)
else
let s:c_begin .= nr2char(nr)
endif
call s:echon()
endwhile
setl nomodifiable
exe 'bd ' . bufnr(s:name)
let s:quit_chating_win = 0
let s:last_channel = s:current_channel
let s:current_channel = ''
let s:msg_win_opened = 0
normal! :
endfunction endfunction
function! s:update_msg_screen() abort function! s:update_msg_screen() abort
if s:msg_win_opened if s:msg_win_opened
normal! ggdG normal! ggdG
for msg in s:messages for msg in s:messages
if msg['type'] ==# 'group_message' && msg['group_name'] ==# s:current_channel if msg['type'] ==# 'group_message' && msg['group_name'] ==# s:current_channel
call append(line('$'), '[' . msg['time'] . '] < ' . msg['sendder'] . ' > ' . msg['context']) call append(line('$'), '[' . msg['time'] . '] < ' . msg['sendder'] . ' > ' . msg['context'])
elseif msg['type'] ==# 'info_message' && msg['context'] !~# '^join channel :' elseif msg['type'] ==# 'info_message' && msg['context'] !~# '^join channel :'
call append(line('$'), '[' . msg['time'] . '] ' . msg['context']) call append(line('$'), '[' . msg['time'] . '] ' . msg['context'])
elseif msg['type'] ==# 'user_message' elseif msg['type'] ==# 'user_message'
\ && ( \ && (
\ msg['sendder'] ==# s:current_channel \ msg['sendder'] ==# s:current_channel
\ || \ ||
\ (msg['sendder'] ==# s:login_user && msg['receiver'] ==# s:current_channel) \ (msg['sendder'] ==# s:login_user && msg['receiver'] ==# s:current_channel)
\ ) \ )
call append(line('$'), '[' . msg['time'] . '] < ' . msg['sendder'] . ' > ' . msg['context']) call append(line('$'), '[' . msg['time'] . '] < ' . msg['sendder'] . ' > ' . msg['context'])
endif endif
endfor endfor
normal! gg normal! gg
delete delete
normal! G normal! G
redraw redraw
call s:echon() call s:echon()
endif endif
endfunction endfunction
function! s:echon() abort function! s:echon() abort
redraw! redraw!
echohl Comment | echon s:c_base echohl Comment | echon s:c_base
echohl None | echon s:c_begin echohl None | echon s:c_begin
echohl Wildmenu | echon s:c_char echohl Wildmenu | echon s:c_char
echohl None | echon s:c_end echohl None | echon s:c_end
endfunction endfunction
fu! s:windowsinit() abort fu! s:windowsinit() abort
" option " option
setl fileformat=unix setl fileformat=unix
setl fileencoding=utf-8 setl fileencoding=utf-8
setl iskeyword=@,48-57,_ setl iskeyword=@,48-57,_
setl noreadonly setl noreadonly
setl buftype=nofile setl buftype=nofile
setl bufhidden=wipe setl bufhidden=wipe
setl noswapfile setl noswapfile
setl nobuflisted setl nobuflisted
setl nolist setl nolist
setl nonumber setl nonumber
setl norelativenumber setl norelativenumber
setl wrap setl wrap
setl winfixwidth setl winfixwidth
setl winfixheight setl winfixheight
setl textwidth=0 setl textwidth=0
setl nospell setl nospell
setl nofoldenable setl nofoldenable
setl cursorline setl cursorline
endf endf
function! s:debug() abort function! s:debug() abort
tabnew tabnew
for line in s:debug_log for line in s:debug_log
call append(line('$'), line) call append(line('$'), line)
endfor endfor
nnoremap <buffer><silent> q :bd!<CR> nnoremap <buffer><silent> q :bd!<CR>
endfunction endfunction
let s:enter_history = [] let s:enter_history = []
function! s:enter() abort function! s:enter() abort
if s:c_begin . s:c_char . s:c_end ==# '/quit' if s:c_begin . s:c_char . s:c_end ==# '/quit'
let s:quit_chating_win = 1 let s:quit_chating_win = 1
let s:c_end = ''
let s:c_char = ''
let s:c_begin = ''
return
endif
if has('nvim')
if s:client_job_id != 0
call jobsend(s:client_job_id, [s:c_begin . s:c_char . s:c_end, ''])
endif
else
call ch_sendraw(s:channel, s:c_begin . s:c_char . s:c_end ."\n")
endif
call add(s:enter_history, s:c_begin . s:c_char . s:c_end)
let s:c_end = '' let s:c_end = ''
let s:c_char = '' let s:c_char = ''
let s:c_begin = '' let s:c_begin = ''
return
endif
if has('nvim')
if s:client_job_id != 0
call jobsend(s:client_job_id, [s:c_begin . s:c_char . s:c_end, ''])
endif
else
call ch_sendraw(s:channel, s:c_begin . s:c_char . s:c_end ."\n")
endif
call add(s:enter_history, s:c_begin . s:c_char . s:c_end)
let s:c_end = ''
let s:c_char = ''
let s:c_begin = ''
endfunction endfunction
let s:complete_num = 0 let s:complete_num = 0
function! s:complete(base,num) abort function! s:complete(base,num) abort
if a:base =~# '^/[a-z]*$' if a:base =~# '^/[a-z]*$'
let rsl = filter(copy(s:chatting_commands), "v:val =~# a:base .'[^\ .]*'") let rsl = filter(copy(s:chatting_commands), "v:val =~# a:base .'[^\ .]*'")
if len(rsl) > 0 if len(rsl) > 0
return rsl[a:num % len(rsl)] . ' ' return rsl[a:num % len(rsl)] . ' '
endif
endif endif
endif
return a:base
return a:base
endfunction endfunction
let s:complete_input_history_num = [0,0] let s:complete_input_history_num = [0,0]
function! s:complete_input_history(base,num) abort function! s:complete_input_history(base,num) abort
let results = filter(copy(s:enter_history), "v:val =~# '^' . a:base") let results = filter(copy(s:enter_history), "v:val =~# '^' . a:base")
if len(results) > 0 if len(results) > 0
call add(results, a:base) call add(results, a:base)
let index = ((len(results) - 1) - a:num[0] + a:num[1]) % len(results) let index = ((len(results) - 1) - a:num[0] + a:num[1]) % len(results)
return results[index] return results[index]
else else
return a:base return a:base
endif endif
endfunction endfunction
function! s:init_hi() abort function! s:init_hi() abort
if get(s:, 'init_hi_done', 0) == 0 if get(s:, 'init_hi_done', 0) == 0
" current channel " current channel
hi! ChattingHI1 ctermbg=003 ctermfg=Black guibg=#fabd2f guifg=#282828 hi! ChattingHI1 ctermbg=003 ctermfg=Black guibg=#fabd2f guifg=#282828
" channel with new msg " channel with new msg
hi! ChattingHI2 ctermbg=005 ctermfg=Black guibg=#b16286 guifg=#282828 hi! ChattingHI2 ctermbg=005 ctermfg=Black guibg=#b16286 guifg=#282828
" normal channel " normal channel
hi! ChattingHI3 ctermbg=007 ctermfg=Black guibg=#8ec07c guifg=#282828 hi! ChattingHI3 ctermbg=007 ctermfg=Black guibg=#8ec07c guifg=#282828
" end " end
hi! ChattingHI4 ctermbg=243 guibg=#7c6f64 hi! ChattingHI4 ctermbg=243 guibg=#7c6f64
" current channel + end " current channel + end
hi! ChattingHI5 guibg=#7c6f64 guifg=#fabd2f hi! ChattingHI5 guibg=#7c6f64 guifg=#fabd2f
" current channel + new msg channel " current channel + new msg channel
hi! ChattingHI6 guibg=#b16286 guifg=#fabd2f hi! ChattingHI6 guibg=#b16286 guifg=#fabd2f
" current channel + normal channel " current channel + normal channel
hi! ChattingHI7 guibg=#8ec07c guifg=#fabd2f hi! ChattingHI7 guibg=#8ec07c guifg=#fabd2f
" new msg channel + end " new msg channel + end
hi! ChattingHI8 guibg=#7c6f64 guifg=#b16286 hi! ChattingHI8 guibg=#7c6f64 guifg=#b16286
" new msg channel + current channel " new msg channel + current channel
hi! ChattingHI9 guibg=#fabd2f guifg=#b16286 hi! ChattingHI9 guibg=#fabd2f guifg=#b16286
" new msg channel + normal channel " new msg channel + normal channel
hi! ChattingHI10 guibg=#8ec07c guifg=#b16286 hi! ChattingHI10 guibg=#8ec07c guifg=#b16286
" new msg channel + new msg channel " new msg channel + new msg channel
hi! ChattingHI11 guibg=#b16286 guifg=#b16286 hi! ChattingHI11 guibg=#b16286 guifg=#b16286
" normal channel + end " normal channel + end
hi! ChattingHI12 guibg=#7c6f64 guifg=#8ec07c hi! ChattingHI12 guibg=#7c6f64 guifg=#8ec07c
" normal channel + normal channel " normal channel + normal channel
hi! ChattingHI13 guibg=#8ec07c guifg=#8ec07c hi! ChattingHI13 guibg=#8ec07c guifg=#8ec07c
" normal channel + new msg channel " normal channel + new msg channel
hi! ChattingHI14 guibg=#b16286 guifg=#8ec07c hi! ChattingHI14 guibg=#b16286 guifg=#8ec07c
" normal channel + current channel " normal channel + current channel
hi! ChattingHI15 guibg=#fabd2f guifg=#8ec07c hi! ChattingHI15 guibg=#fabd2f guifg=#8ec07c
let s:init_hi_done = 1 let s:init_hi_done = 1
endif endif
endfunction endfunction
function! s:update_statusline() abort function! s:update_statusline() abort
let st = '' let st = ''
for ch in s:opened_channels for ch in s:opened_channels
let ch = substitute(ch, ' ', '\ ', 'g') let ch = substitute(ch, ' ', '\ ', 'g')
if ch == s:current_channel if ch == s:current_channel
if has_key(s:unread_msg_num, s:current_channel) if has_key(s:unread_msg_num, s:current_channel)
call remove(s:unread_msg_num, s:current_channel) call remove(s:unread_msg_num, s:current_channel)
endif endif
let st .= '%#ChattingHI1#[' . ch . ']' let st .= '%#ChattingHI1#[' . ch . ']'
if index(s:opened_channels, ch) == len(s:opened_channels) - 1 if index(s:opened_channels, ch) == len(s:opened_channels) - 1
let st .= '%#ChattingHI5#' . s:st_sep let st .= '%#ChattingHI5#' . s:st_sep
elseif get(s:unread_msg_num, s:opened_channels[index(s:opened_channels, ch) + 1], 0) > 0 elseif get(s:unread_msg_num, s:opened_channels[index(s:opened_channels, ch) + 1], 0) > 0
let st .= '%#ChattingHI6#' . s:st_sep let st .= '%#ChattingHI6#' . s:st_sep
else else
let st .= '%#ChattingHI7#' . s:st_sep let st .= '%#ChattingHI7#' . s:st_sep
endif endif
else
let n = get(s:unread_msg_num, ch, 0)
if n > 0
let st .= '%#ChattingHI2#[' . ch . '(' . n . 'new)]'
if index(s:opened_channels, ch) == len(s:opened_channels) - 1
let st .= '%#ChattingHI8#' . s:st_sep
elseif get(s:unread_msg_num, s:opened_channels[index(s:opened_channels, ch) + 1], 0) > 0
\ && s:opened_channels[index(s:opened_channels, ch) + 1] !=# s:current_channel
let st .= '%#ChattingHI11#' . s:st_sep
elseif s:opened_channels[index(s:opened_channels, ch) + 1] ==# s:current_channel
let st .= '%#ChattingHI9#' . s:st_sep
else else
let n = get(s:unread_msg_num, ch, 0) let st .= '%#ChattingHI10#' . s:st_sep
if n > 0
let st .= '%#ChattingHI2#[' . ch . '(' . n . 'new)]'
if index(s:opened_channels, ch) == len(s:opened_channels) - 1
let st .= '%#ChattingHI8#' . s:st_sep
elseif get(s:unread_msg_num, s:opened_channels[index(s:opened_channels, ch) + 1], 0) > 0
\ && s:opened_channels[index(s:opened_channels, ch) + 1] !=# s:current_channel
let st .= '%#ChattingHI11#' . s:st_sep
elseif s:opened_channels[index(s:opened_channels, ch) + 1] ==# s:current_channel
let st .= '%#ChattingHI9#' . s:st_sep
else
let st .= '%#ChattingHI10#' . s:st_sep
endif
else
let st .= '%#ChattingHI3#[' . ch . ']'
if index(s:opened_channels, ch) == len(s:opened_channels) - 1
let st .= '%#ChattingHI12#' . s:st_sep
elseif get(s:unread_msg_num, s:opened_channels[index(s:opened_channels, ch) + 1], 0) > 0
\ && s:opened_channels[index(s:opened_channels, ch) + 1] !=# s:current_channel
let st .= '%#ChattingHI14#' . s:st_sep
elseif s:opened_channels[index(s:opened_channels, ch) + 1] ==# s:current_channel
let st .= '%#ChattingHI15#' . s:st_sep
else
let st .= '%#ChattingHI13#' . s:st_sep
endif
endif
endif endif
endfor else
let st .= '%#ChattingHI4# ' let st .= '%#ChattingHI3#[' . ch . ']'
exe 'set statusline=' . st if index(s:opened_channels, ch) == len(s:opened_channels) - 1
let st .= '%#ChattingHI12#' . s:st_sep
elseif get(s:unread_msg_num, s:opened_channels[index(s:opened_channels, ch) + 1], 0) > 0
\ && s:opened_channels[index(s:opened_channels, ch) + 1] !=# s:current_channel
let st .= '%#ChattingHI14#' . s:st_sep
elseif s:opened_channels[index(s:opened_channels, ch) + 1] ==# s:current_channel
let st .= '%#ChattingHI15#' . s:st_sep
else
let st .= '%#ChattingHI13#' . s:st_sep
endif
endif
endif
endfor
let st .= '%#ChattingHI4# '
exe 'set statusline=' . st
endfunction endfunction
function! s:previous_channel() abort function! s:previous_channel() abort
let id = index(s:opened_channels, s:current_channel) let id = index(s:opened_channels, s:current_channel)
let id -= 1 let id -= 1
if id < 0 if id < 0
let id = id + len(s:opened_channels) let id = id + len(s:opened_channels)
endif endif
let s:current_channel = s:opened_channels[id] let s:current_channel = s:opened_channels[id]
if s:current_channel =~# '^#' if s:current_channel =~# '^#'
call s:send('/join ' . s:current_channel) call s:send('/join ' . s:current_channel)
else else
call s:send('/query ' . s:current_channel) call s:send('/query ' . s:current_channel)
endif endif
call s:update_msg_screen() call s:update_msg_screen()
call s:update_statusline() call s:update_statusline()
endfunction endfunction
function! s:next_channel() abort function! s:next_channel() abort
let id = index(s:opened_channels, s:current_channel) let id = index(s:opened_channels, s:current_channel)
let id += 1 let id += 1
if id > len(s:opened_channels) - 1 if id > len(s:opened_channels) - 1
let id = id - len(s:opened_channels) let id = id - len(s:opened_channels)
endif endif
let s:current_channel = s:opened_channels[id] let s:current_channel = s:opened_channels[id]
if s:current_channel =~# '^#' if s:current_channel =~# '^#'
call s:send('/join ' . s:current_channel) call s:send('/join ' . s:current_channel)
else else
call s:send('/query ' . s:current_channel) call s:send('/query ' . s:current_channel)
endif endif
call s:update_msg_screen() call s:update_msg_screen()
call s:update_statusline() call s:update_statusline()
endfunction endfunction
function! s:send(msg) abort function! s:send(msg) abort
if has('nvim') if has('nvim')
if s:client_job_id != 0 if s:client_job_id != 0
call jobsend(s:client_job_id, [a:msg, '']) call jobsend(s:client_job_id, [a:msg, ''])
endif
else
call ch_sendraw(s:channel, a:msg ."\n")
endif endif
else
call ch_sendraw(s:channel, a:msg ."\n")
endif
endfunction endfunction
call chat#debug#defind('chatting', function('s:debug')) call chat#debug#defind('chatting', function('s:debug'))