do

local function is_offline(hash)
  local afk = redis:hget(hash, 'afk')
  if afk == "true" then
    return true
  else
    return false
  end
end

local function get_afk_text(hash)
  local afk_text = redis:hget(hash, 'afk_text')
  if afk_text ~= nil and afk_text ~= "" and afk_text ~= "false" then
    return afk_text
  else
    return false
  end
end

local function switch_afk(user_name, user_id, chat_id, timestamp, text)
  local hash =  'afk:'..chat_id..':'..user_id
  
  if is_offline(hash) then
    local afk_text = get_afk_text(hash)
    if afk_text then
      return 'Du bist bereits AFK! ('..afk_text..')'
	else
	  return 'Du bist bereits AFK!'
	end
  end
  
  print('Setting redis hash afk in '..hash..' to true')
  redis:hset(hash, 'afk', true)
  print('Setting redis hash timestamp in '..hash..' to '..timestamp)
  redis:hset(hash, 'time', timestamp)
  
  if text then
    print('Setting redis hash afk_text in '..hash..' to '..text)
    redis:hset(hash, 'afk_text', text)
    return user_name..' ist AFK! ('..text..')'
  else
    return user_name..' ist AFK!'
  end
end

local function pre_process(msg)
  if msg.to.type ~= "chat" then
    -- Ignore
    return msg
  end
  
  local receiver = get_receiver(msg)
  local user_name = get_name(msg)
  local user_id = msg.from.id
  local chat_id = msg.to.id
  local hash =  'afk:'..chat_id..':'..user_id
  
  
  if is_offline(hash) then
    local afk_text = get_afk_text(hash)
	
	-- calculate afk time
	local timestamp = redis:hget(hash, 'time')
	local current_timestamp = msg.date
	local afk_time = current_timestamp - timestamp
	local seconds = afk_time % 60
    local minutes = math.floor(afk_time / 60)
	local minutes = minutes % 60
	local hours = math.floor(afk_time / 3600)
	if minutes == 00 and hours == 00 then
	  duration = seconds..' Sekunden'
	elseif hours == 00 and minutes ~= 00 then
	  duration = string.format("%02d:%02d", minutes, seconds)..' Minuten'
	elseif hours ~= 00 then
      duration = string.format("%02d:%02d:%02d", hours,  minutes, seconds)..' Stunden'
	end
   
	redis:hset(hash, 'afk', false)
    if afk_text then
	  redis:hset(hash, 'afk_text', false)
      send_msg(receiver, user_name..' ist wieder da! (war: '..afk_text..' für '..duration..')', ok_cb, false)
	else
	  send_msg(receiver, user_name..' ist wieder da! (war '..duration..' weg)', ok_cb, false)
	end
  end
  
  return msg
end

local function run(msg, matches)
  if msg.to.type ~= "chat" then
    return "Mir ist's egal, ob du AFK bist."
  end
  
  local user_id = msg.from.id
  local chat_id = msg.to.id
  local user_name = get_name(msg)
  local timestamp = msg.date
  
  if matches[2] then
    return switch_afk(user_name, user_id, chat_id, timestamp, matches[2])
  else
    return switch_afk(user_name, user_id, chat_id, timestamp)
  end
end

return {
  description = 'AFK und online schalten',
  usage = "#afk (Text): Setzt Status auf AFK mit optionalem Text",
  patterns = {
    "^#([Aa][Ff][Kk])$",
    "^#([Aa][Ff][Kk]) (.*)$"
  }, 
  run = run,
  pre_process = pre_process
}

-- by Akamaru [https://ponywave.de]
-- modified by iCON [http://wiidatabase.de]

end