aboutsummaryrefslogtreecommitdiff
path: root/captain
diff options
context:
space:
mode:
authorJeffrey Armstrong <jeff@approximatrix.com>2021-09-15 11:04:52 -0400
committerJeffrey Armstrong <jeff@approximatrix.com>2021-09-15 11:04:52 -0400
commita3fe1adbf76e16e218864a8cfecdea7e6bc5dccd (patch)
treecb5e5d4117bd96bcd1f43003193d43e94e05457f /captain
parent842079426ac0b36ed6187faed231ecba15132b41 (diff)
downloadlevitating-a3fe1adbf76e16e218864a8cfecdea7e6bc5dccd.tar.gz
levitating-a3fe1adbf76e16e218864a8cfecdea7e6bc5dccd.zip
Added online and offline checking based on last checkin time for players. Added labeling of online status to most places players appear. Fixed css so display works in NetSurf.
Diffstat (limited to 'captain')
-rw-r--r--captain/db.f9077
-rw-r--r--captain/example/static/style.css2
-rw-r--r--captain/external.f9015
-rw-r--r--captain/levitating-captain.prj11
-rw-r--r--captain/requtils.f9040
-rw-r--r--captain/templates/index.html2
-rw-r--r--captain/web.f9034
7 files changed, 146 insertions, 35 deletions
diff --git a/captain/db.f90 b/captain/db.f90
index b9d1e61..152f61b 100644
--- a/captain/db.f90
+++ b/captain/db.f90
@@ -32,8 +32,9 @@ implicit none
integer, parameter::JOB_STATUS_WORKING = 3
integer, parameter::JOB_STATUS_PENDING = 0
- integer, parameter::PLAYER_STATUS_BUSY = JOB_STATUS_WORKING
- integer, parameter::PLAYER_STATUS_IDLE = 100
+ integer, parameter::PLAYER_STATUS_BUSY = JOB_STATUS_WORKING
+ integer, parameter::PLAYER_STATUS_IDLE = 100
+ integer, parameter::PLAYER_STATUS_OFFLINE = 101
character(1024)::database_file
type(c_ptr)::db
@@ -1248,28 +1249,27 @@ contains
integer, dimension(8), intent(out)::values
type(sqlite3_stmt)::stmt
- integer::i
! This call properly retrieves the offset from UTC if you want it...
+ values = 0
call date_and_time(values=values)
- values(1:3) = 0
- values(5:8) = 0
if(stmt%prepare(db, "SELECT year, month, day, hour, minute, second FROM checkin WHERE player=? LIMIT 1") == SQLITE_OK) then
if(stmt%bind_int(1, player) == SQLITE_OK) then
if(stmt%step() == SQLITE_ROW) then
- do i = 1, 7
- if(i < 4) then
- values(i) = stmt%column_int(i-1)
- else if(i >= 5) then
- values(i-1) = stmt%column_int(i-1)
- end if
- end do
+ values(1) = stmt%column_int(0)
+ values(2) = stmt%column_int(1)
+ values(3) = stmt%column_int(2)
+ values(5) = stmt%column_int(3)
+ values(6) = stmt%column_int(4)
+ values(7) = stmt%column_int(5)
+ else
+ values = 0
end if
end if
end if
call stmt%finalize()
-
+
end subroutine get_last_checkin_time
subroutine get_player_platform(player, platform)
@@ -1295,4 +1295,55 @@ contains
end subroutine get_player_platform
+ pure function julian_date(values) result(jd)
+ implicit none
+
+ integer, dimension(3), intent(in)::values
+ integer::jd
+
+ jd = (1461 * (values(1) + 4800 + (values(2)-14)/12))/4 + &
+ (367 * (values(2) - 2 - 12*((values(2)-14)/12)))/12 - &
+ (3*((values(1) + 4900 + (values(2)-14)/12)/100))/4 + &
+ values(3) - 32075
+
+ end function julian_date
+
+ pure function seconds_difference(first, second) result(diff)
+ implicit none
+
+ integer, dimension(8), intent(in)::first, second
+ integer(kind=8)::diff
+
+ diff = (julian_date(first(1:3)) - julian_date(second(1:3))) * 24 * 3600
+
+ diff = diff + (first(5) - second(5)) * 3600
+ diff = diff + (first(6) - second(6)) * 60
+ diff = diff + (first(7) - second(7))
+
+ end function seconds_difference
+
+ function is_player_online(player) result(ret)
+ implicit none
+
+ integer, intent(in)::player
+ logical::ret
+
+ integer, dimension(8)::now, last
+
+ call date_and_time(values=now)
+ call get_last_checkin_time(player, last)
+
+ ! All zeroes mean that it was never online
+ if(all(last == 0)) then
+
+ ret = .false.
+
+ else
+
+ ret = (seconds_difference(now, last) <= 60)
+
+ end if
+
+ end function is_player_online
+
end module captain_db
diff --git a/captain/example/static/style.css b/captain/example/static/style.css
index 6af0d2e..41d6ed0 100644
--- a/captain/example/static/style.css
+++ b/captain/example/static/style.css
@@ -52,7 +52,7 @@ body {
.content {
- margin-top: 80px;
+ padding-top: 80px;
clear:both;
margin-left: 1em;
margin-right: 1em;
diff --git a/captain/external.f90 b/captain/external.f90
index 61184f1..0cdcfdf 100644
--- a/captain/external.f90
+++ b/captain/external.f90
@@ -242,10 +242,12 @@ contains
function generate_players_gemini() result(res)
use captain_db
+ use request_utils, only: get_player_status_utf8
implicit none
character(len=:), pointer::res
character(len=PLAYER_NAME_LENGTH), dimension(:), pointer::players
+ character(4)::player_status
integer::n, i, nsize
character(len=3*PLAYER_NAME_LENGTH)::one_player
@@ -270,7 +272,9 @@ contains
res = "## Existing Players"
do i = 1, n
- one_player = "=> /players/"//trim(players(i))//".gmi "//trim(players(i))
+ player_status = get_player_status_utf8(players(i))
+
+ one_player = "=> /players/"//trim(players(i))//".gmi "//trim(player_status)//" "//trim(players(i))
if(i == 1) then
res = trim(res)//new_line(res(1:1))//new_line(res(1:1))//trim(one_player)
else
@@ -289,7 +293,7 @@ contains
function generate_one_instuction_gemini(req) result(res)
use captain_db
use server_response
- use request_utils, only: get_status_utf8
+ use request_utils, only: get_player_status_utf8
use request_utils, only: render_jobs_links
implicit none
@@ -352,12 +356,7 @@ contains
res = trim(res)//nl//nl//"### Launch Now"
do i = 1, n_players
call get_player_name(players(i), player_name)
- if(is_player_busy(players(i))) then
- player_status = get_status_utf8(PLAYER_STATUS_BUSY)
- else
- player_status = get_status_utf8(PLAYER_STATUS_IDLE)
- end if
-
+ player_status = get_player_status_utf8(players(i))
res = trim(res)//nl//"=> "//trim(req%location)//"?launch="//trim(player_name)// &
" "//trim(player_status)//" "//trim(player_name)
end do
diff --git a/captain/levitating-captain.prj b/captain/levitating-captain.prj
index 0e786f6..066c943 100644
--- a/captain/levitating-captain.prj
+++ b/captain/levitating-captain.prj
@@ -18,7 +18,7 @@
}]
},{
"Folders":[],
- "Name":"+common",
+ "Name":"-common",
"Files":[{
"filename":"../common/jessl.f90",
"enabled":"1"
@@ -39,7 +39,14 @@
"enabled":"0"
}]
},{
- "Folders":[],
+ "Folders":[{
+ "Folders":[],
+ "Name":"+static",
+ "Files":[{
+ "filename":"example/static/style.css",
+ "enabled":"1"
+ }]
+ }],
"Name":"+example",
"Files":[{
"filename":"example/levitating.conf",
diff --git a/captain/requtils.f90 b/captain/requtils.f90
index a0c42c7..41eacc6 100644
--- a/captain/requtils.f90
+++ b/captain/requtils.f90
@@ -32,6 +32,11 @@ implicit none
module procedure instruction_link_from_name
module procedure instruction_link_from_id
end interface
+
+ interface get_player_status_utf8
+ module procedure get_player_status_utf8_by_id
+ module procedure get_player_status_utf8_by_name
+ end interface
contains
@@ -143,10 +148,45 @@ contains
! Envelope 0x2709
res = char(226)//char(156)//char(137)//" "
+ case(PLAYER_STATUS_OFFLINE)
+ ! Fancy question mark 0xe29d93
+ res = char(226)//char(157)//char(147)//" "
+
end select
end function get_status_utf8
+ function get_player_status_utf8_by_id(player_id) result(res)
+ use captain_db, only: is_player_online, is_player_busy, &
+ PLAYER_STATUS_BUSY, PLAYER_STATUS_IDLE, PLAYER_STATUS_OFFLINE
+ implicit none
+
+ integer, intent(in)::player_id
+ character(4)::res
+
+ if(is_player_online(player_id)) then
+ if(is_player_busy(player_id)) then
+ res = get_status_utf8(PLAYER_STATUS_BUSY)
+ else
+ res = get_status_utf8(PLAYER_STATUS_IDLE)
+ end if
+ else
+ res = get_status_utf8(PLAYER_STATUS_OFFLINE)
+ end if
+
+ end function get_player_status_utf8_by_id
+
+ function get_player_status_utf8_by_name(player) result(res)
+ use captain_db, only: get_player_id
+ implicit none
+
+ character(*), intent(in)::player
+ character(4)::res
+
+ res = get_player_status_utf8_by_id(get_player_id(player))
+
+ end function get_player_status_utf8_by_name
+
function is_request_static(req)
use server_response
use logging
diff --git a/captain/templates/index.html b/captain/templates/index.html
index 5d90ad4..fc4de13 100644
--- a/captain/templates/index.html
+++ b/captain/templates/index.html
@@ -20,7 +20,7 @@
<li><a href="{{ base_url }}/about.html">About</a></li>
</ul>
</div>
- <h1>{{ title }} - I'm Levitating!</h1>
+ <h1 style="overflow: hidden; text-overflow: ellipsis;white-space: nowrap;">{{ title }} - I'm Levitating!</h1>
</div>
<div class="content">
diff --git a/captain/web.f90 b/captain/web.f90
index 9817775..f66250c 100644
--- a/captain/web.f90
+++ b/captain/web.f90
@@ -89,7 +89,7 @@ contains
function generate_one_instuction_html(req) result(res)
use captain_db
use server_response
- use request_utils, only: get_status_utf8, render_jobs_links, generate_simple_pager
+ use request_utils, only: get_player_status_utf8, render_jobs_links, generate_simple_pager
implicit none
type(request)::req
@@ -170,12 +170,7 @@ contains
do i = 1, n_players
call get_player_name(players(i), player_name)
- if(is_player_busy(players(i))) then
- player_status = get_status_utf8(PLAYER_STATUS_BUSY)
- else
- player_status = get_status_utf8(PLAYER_STATUS_IDLE)
- end if
-
+ player_status = get_player_status_utf8(players(i))
one_link => html_link(req%page//"?launch="//trim(player_name), &
trim(player_status)//" "//trim(player_name))
@@ -511,12 +506,14 @@ contains
function generate_players_html() result(res)
use captain_db
+ use request_utils, only: get_status_utf8
implicit none
character(len=:), pointer::res
character(len=PLAYER_NAME_LENGTH), dimension(:), pointer::players
- integer::n, i, nsize
+ integer::n, i, nsize, pid
+ character(4)::player_status
character(len=:), pointer::one_player
n = get_player_count()
@@ -539,8 +536,20 @@ contains
res = "<h2>Existing Players</h2>"//new_line(' ')//"<ul>"
do i = 1, n
+
+ pid = get_player_id(players(i))
+ if(is_player_online(pid)) then
+ if(is_player_busy(pid)) then
+ player_status = get_status_utf8(PLAYER_STATUS_BUSY)
+ else
+ player_status = get_status_utf8(PLAYER_STATUS_IDLE)
+ end if
+ else
+ player_status = get_status_utf8(PLAYER_STATUS_OFFLINE)
+ end if
+
one_player => html_link("players/"//trim(players(i))//".html", &
- trim(players(i)))
+ trim(player_status)//" "//trim(players(i)))
res = trim(res)//new_line(' ')//"<li>"//trim(one_player)//"</li>"
deallocate(one_player)
end do
@@ -580,7 +589,12 @@ contains
n = get_instructions_count(player=pid)
allocate(character(len=(2*n*PLAYER_NAME_LENGTH + 1024)) :: res)
- res = "<h2>"//trim(player_name)//"</h2>"
+ res = "<h2>"//trim(player_name)
+ if(is_player_online(pid)) then
+ res = trim(res)//" - Online</h2>"
+ else
+ res = trim(res)//" - Offline</h2>"
+ end if
! Last checkin
call get_last_checkin_time(pid, values)