46 lines
893 B
Ruby
46 lines
893 B
Ruby
# frozen_string_literal: true
|
|
|
|
require 'csv'
|
|
require 'time'
|
|
require 'fileutils'
|
|
|
|
class MessageBoard
|
|
Message = Struct.new(:timestamp, :username, :text)
|
|
|
|
def initialize(path)
|
|
@path = path
|
|
@messages = []
|
|
@mu = Mutex.new
|
|
load_csv
|
|
end
|
|
|
|
def append(username, text)
|
|
msg = Message.new(Time.now.strftime('%m-%d %H:%M'), username, text)
|
|
@mu.synchronize do
|
|
@messages << msg
|
|
FileUtils.mkdir_p(File.dirname(@path))
|
|
CSV.open(@path, 'a') { |csv| csv << [msg.timestamp, msg.username, msg.text] }
|
|
end
|
|
msg
|
|
end
|
|
|
|
def last(n = 30)
|
|
@mu.synchronize { @messages.last(n) }
|
|
end
|
|
|
|
def count
|
|
@mu.synchronize { @messages.size }
|
|
end
|
|
|
|
private
|
|
|
|
def load_csv
|
|
return unless File.exist?(@path)
|
|
CSV.foreach(@path) do |row|
|
|
@messages << Message.new(*row)
|
|
end
|
|
rescue => e
|
|
warn "MessageBoard load error: #{e}"
|
|
end
|
|
end
|