diff --git a/app/models/scheduled_task.rb b/app/models/scheduled_task.rb
index a6ecf39..cbde051 100644
--- a/app/models/scheduled_task.rb
+++ b/app/models/scheduled_task.rb
@@ -41,7 +41,7 @@ class ScheduledTask < ActiveRecord::Base
def to_user_string
m = self.partition % 100
- hours = self.partition / 100
+ hours = (self.partition / 100) + self.server.timezone_delta
h_24 = hours % 24
h_12 = h_24 % 12
ampm = h_24 < 12 ? 'am' : 'pm'
@@ -49,17 +49,17 @@ def to_user_string
return "#{DAYS_OF_WEEK_INVERSE[d]} #{h_12}:#{m} #{ampm} #{action}"
end
- def self.parse(str)
+ def self.parse(str, server)
xs = []
str.each_line do |l|
- x = self.parse_line(l.clean)
+ x = self.parse_line(l.clean, server)
if !x.nil?
xs.push(x)
end
end
end
- def self.parse_line(line)
+ def self.parse_line(line, server)
if line =~ /([a-z]+)\s+(\d+):(\d+)\s*([a-z]+)\s+([a-z]+)/
day = DAYS_OF_WEEK[$1]
hour = $2.to_i % 12
@@ -87,13 +87,19 @@ def self.parse_line(line)
return nil
end
return ScheduledTask.new({
- partition: self.calculate_partition(day, hour, minute, ampm),
+ server: server,
+ partition: self.calculate_partition(day, hour, minute, ampm, server.timezone_delta),
action: action,
})
end
end
- def self.calculate_partition(day, hour, minute, ampm)
- return (day * 24 + hour + ampm * 12) * 100 + minute
+ def self.calculate_partition(day, hour, minute, ampm, delta)
+ x = ((day * 24) + (hour) + (ampm * 12) - (delta)) % (7 * 24)
+ return x * 100 + minute
+ end
+
+ def self.server_time
+ return DateTime.now.in_time_zone(Gamocosm::TIMEZONE).strftime('%-I:%M %P (%H:%M) %Z')
end
end
diff --git a/app/models/server.rb b/app/models/server.rb
index f1f48f4..4db2160 100644
--- a/app/models/server.rb
+++ b/app/models/server.rb
@@ -16,6 +16,7 @@
# remote_region_slug :string not null
# remote_size_slug :string not null
# remote_snapshot_id :integer
+# timezone_delta :integer default(0), not null
#
class Server < ActiveRecord::Base
@@ -55,6 +56,10 @@ def before_validate_callback
self.ssh_keys = self.ssh_keys.try(:gsub, /\s/, '').clean
end
+ def schedule_text
+ return self.scheduled_tasks.map { |x| x.to_user_string }.join("\n")
+ end
+
def host_name
return "#{name}.minecraft.gamocosm"
end
diff --git a/app/models/server_log.rb b/app/models/server_log.rb
index 0928bbd..af3e8d5 100644
--- a/app/models/server_log.rb
+++ b/app/models/server_log.rb
@@ -14,6 +14,6 @@ class ServerLog < ActiveRecord::Base
belongs_to :server
def when
- return created_at.in_time_zone(ActiveSupport::TimeZone[-8]).strftime('%Y %b %e (%H:%M:%S %Z)')
+ return created_at.in_time_zone(Gamocosm::TIMEZONE).strftime('%Y %b %-d (%H:%M:%S %Z)')
end
end
diff --git a/app/views/servers/_schedule.html.erb b/app/views/servers/_schedule.html.erb
new file mode 100644
index 0000000..a1e3932
--- /dev/null
+++ b/app/views/servers/_schedule.html.erb
@@ -0,0 +1,30 @@
+
+<%= panel_with_heading 'Schedule' do %>
+ <%= simple_form_for @server, (@demo.nil? ? { url: server_path(@server), method: :put } : { html: { onsubmit: 'return false;' } }) do |f| %>
+
+ You can setup a schedule to start/stop a server at different days of the week. + Autoshutdown also works with the schedule, but note that autoshutdown goes off after ~8 minutes of inactivity. +
++ The current server time is <%= ScheduledTask.server_time %> (Pacific Time). + Suppose your time is 3 hours ahead of the server: your "timezone delta" is 3. + If your time is behind the server, you can enter a negative number. + This way, your schedule will be based on your times. +
+
+ Enter a rule on each line, in the format [day of week] [hour]:[minute] [am or pm] [start or stop]
:
+