1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 21:50:05 +08:00
SpaceVim/bundle/calendar.vim/autoload/calendar/google/client.vim
2022-05-28 15:29:51 +08:00

197 lines
6.7 KiB
VimL
Vendored

" =============================================================================
" Filename: autoload/calendar/google/client.vim
" Author: itchyny
" License: MIT License
" Last Change: 2020/11/30 20:02:44.
" =============================================================================
let s:save_cpo = &cpo
set cpo&vim
let s:cache = calendar#cache#new('google')
let s:auth_url = 'https://accounts.google.com/o/oauth2/auth'
let s:token_url = 'https://accounts.google.com/o/oauth2/token'
function! s:client() abort
return extend(deepcopy(calendar#setting#get('google_client')), { 'response_type': 'code' })
endfunction
function! s:get_url() abort
let client = s:client()
let param = {}
for x in ['client_id', 'redirect_uri', 'scope', 'response_type']
if has_key(client, x)
let param[x] = client[x]
endif
endfor
return s:auth_url . '?' . calendar#webapi#encodeURI(param)
endfunction
function! calendar#google#client#access_token() abort
let cache = s:cache.get('access_token')
if type(cache) != type({}) || type(cache) == type({}) && !has_key(cache, 'access_token')
call calendar#google#client#initialize_access_token()
let cache = s:cache.get('access_token')
if type(cache) != type({}) || type(cache) == type({}) && !has_key(cache, 'access_token')
return 1
endif
let content = cache
else
let content = cache
endif
return content.access_token
endfunction
function! calendar#google#client#initialize_access_token() abort
let client = s:client()
let url = s:get_url()
call calendar#webapi#open_url(url)
try
let code = input(printf(calendar#message#get('access_url_input_code'), url) . "\n" . calendar#message#get('input_code'))
catch
return
endtry
if code !=# ''
let response = calendar#webapi#post_nojson(s:token_url, {}, {
\ 'client_id': client.client_id,
\ 'client_secret': client.client_secret,
\ 'code': code,
\ 'redirect_uri': client.redirect_uri,
\ 'grant_type': 'authorization_code'})
let content = calendar#webapi#decode(response.content)
if calendar#google#client#access_token_response(response, content)
return
endif
else
return
endif
let g:calendar_google_event_downloading_list = 0
let g:calendar_google_event_download = 3
silent! let b:calendar.event._updated = 3
endfunction
function! calendar#google#client#refresh_token() abort
let client = s:client()
let cache = s:cache.get('refresh_token')
if type(cache) == type({}) && has_key(cache, 'refresh_token') && type(cache.refresh_token) == type('')
let response = calendar#webapi#post_nojson(s:token_url, {}, {
\ 'client_id': client.client_id,
\ 'client_secret': client.client_secret,
\ 'refresh_token': cache.refresh_token,
\ 'grant_type': 'refresh_token'})
let content = calendar#webapi#decode(response.content)
if calendar#google#client#access_token_response(response, content)
return 1
endif
return content.access_token
else
return 1
endif
endfunction
function! calendar#google#client#access_token_response(response, content) abort
if a:response.status == 200
if !has_key(a:content, 'access_token')
call calendar#echo#error_message('google_access_token_fail')
return 1
else
call s:cache.save('access_token', a:content)
if has_key(a:content, 'refresh_token') && type(a:content.refresh_token) == type('')
call s:cache.save('refresh_token', { 'refresh_token': a:content.refresh_token })
endif
endif
else
call calendar#echo#error_message('google_access_token_fail')
return 1
endif
endfunction
function! calendar#google#client#get(url, ...) abort
return s:request('get', a:url, a:0 ? a:1 : {}, a:0 > 1 ? a:2 : {})
endfunction
function! calendar#google#client#put(url, ...) abort
return s:request('put', a:url, a:0 ? a:1 : {}, a:0 > 1 ? a:2 : {})
endfunction
function! calendar#google#client#post(url, ...) abort
return s:request('post', a:url, a:0 ? a:1 : {}, a:0 > 1 ? a:2 : {})
endfunction
function! calendar#google#client#delete(url, ...) abort
return s:request('delete', a:url, a:0 ? a:1 : {}, a:0 > 1 ? a:2 : {})
endfunction
function! s:request(method, url, param, body) abort
let client = s:client()
let access_token = calendar#google#client#access_token()
if type(access_token) != type('')
return 1
endif
let param = extend(a:param, { 'oauth_token': access_token })
let response = calendar#webapi#{a:method}(a:url, param, a:body)
if response.status == 200
return calendar#webapi#decode(response.content)
elseif response.status == 401
unlet! access_token
let access_token = calendar#google#client#refresh_token()
if type(access_token) != type('')
return 1
endif
let param = extend(a:param, { 'oauth_token': access_token })
let response = calendar#webapi#{a:method}(a:url, param, a:body)
if response.status == 200
return calendar#webapi#decode(response.content)
endif
endif
return 1
endfunction
function! calendar#google#client#get_async(id, cb, url, ...) abort
call s:request_async(a:id, a:cb, 'get', a:url, a:0 ? a:1 : {}, a:0 > 1 ? a:2 : {})
endfunction
function! calendar#google#client#delete_async(id, cb, url, ...) abort
call s:request_async(a:id, a:cb, 'delete', a:url, a:0 ? a:1 : {}, a:0 > 1 ? a:2 : {})
endfunction
function! calendar#google#client#put_async(id, cb, url, ...) abort
call s:request_async(a:id, a:cb, 'put', a:url, a:0 ? a:1 : {}, a:0 > 1 ? a:2 : {})
endfunction
function! calendar#google#client#patch_async(id, cb, url, ...) abort
call s:request_async(a:id, a:cb, 'patch', a:url, a:0 ? a:1 : {}, a:0 > 1 ? a:2 : {})
endfunction
function! calendar#google#client#post_async(id, cb, url, ...) abort
call s:request_async(a:id, a:cb, 'post', a:url, a:0 ? a:1 : {}, a:0 > 1 ? a:2 : {})
endfunction
function! s:request_async(id, cb, method, url, param, body) abort
let access_token = calendar#google#client#access_token()
if type(access_token) != type('')
return 1
endif
let param = extend(a:param, { 'oauth_token': access_token })
call calendar#webapi#{a:method}_async(a:id, a:cb, a:url, param, a:body)
endfunction
function! calendar#google#client#get_async_use_api_key(id, cb, url, ...) abort
call s:request_async_use_api_key(a:id, a:cb, 'get', a:url, a:0 ? a:1 : {}, a:0 > 1 ? a:2 : {})
endfunction
function! calendar#google#client#post_async_use_api_key(id, cb, url, ...) abort
call s:request_async_use_api_key(a:id, a:cb, 'post', a:url, a:0 ? a:1 : {}, a:0 > 1 ? a:2 : {})
endfunction
function! s:request_async_use_api_key(id, cb, method, url, param, body) abort
let client = s:client()
let param = extend(a:param, { 'key': client.api_key })
call calendar#webapi#{a:method}_async(a:id, a:cb, a:url, param, a:body)
endfunction
let &cpo = s:save_cpo
unlet s:save_cpo