diff options
author | Jeffrey Armstrong <jeff@approximatrix.com> | 2021-09-15 11:04:52 -0400 |
---|---|---|
committer | Jeffrey Armstrong <jeff@approximatrix.com> | 2021-09-15 11:04:52 -0400 |
commit | a3fe1adbf76e16e218864a8cfecdea7e6bc5dccd (patch) | |
tree | cb5e5d4117bd96bcd1f43003193d43e94e05457f /captain | |
parent | 842079426ac0b36ed6187faed231ecba15132b41 (diff) | |
download | levitating-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.f90 | 77 | ||||
-rw-r--r-- | captain/example/static/style.css | 2 | ||||
-rw-r--r-- | captain/external.f90 | 15 | ||||
-rw-r--r-- | captain/levitating-captain.prj | 11 | ||||
-rw-r--r-- | captain/requtils.f90 | 40 | ||||
-rw-r--r-- | captain/templates/index.html | 2 | ||||
-rw-r--r-- | captain/web.f90 | 34 |
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) |