summaryrefslogtreecommitdiff
path: root/lib/lsg_web/controllers/alcoolog_controller.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/lsg_web/controllers/alcoolog_controller.ex')
-rw-r--r--lib/lsg_web/controllers/alcoolog_controller.ex323
1 files changed, 0 insertions, 323 deletions
diff --git a/lib/lsg_web/controllers/alcoolog_controller.ex b/lib/lsg_web/controllers/alcoolog_controller.ex
deleted file mode 100644
index 3081762..0000000
--- a/lib/lsg_web/controllers/alcoolog_controller.ex
+++ /dev/null
@@ -1,323 +0,0 @@
-defmodule NolaWeb.AlcoologController do
- use NolaWeb, :controller
- require Logger
-
- plug NolaWeb.ContextPlug when action not in [:token]
- plug NolaWeb.ContextPlug, [restrict: :public] when action in [:token]
-
- def token(conn, %{"token" => token}) do
- case Nola.Token.lookup(token) do
- {:ok, {:alcoolog, :index, network, channel}} -> index(conn, nil, network, channel)
- err ->
- Logger.debug("AlcoologControler: token #{inspect err} invalid")
- conn
- |> put_status(404)
- |> text("Page not found")
- end
- end
-
- def nick(conn = %{assigns: %{account: account}}, params = %{"network" => network, "nick" => nick}) do
- profile_account = IRC.Account.find_always_by_nick(network, nick, nick)
- days = String.to_integer(Map.get(params, "days", "180"))
- friend? = Enum.member?(IRC.Membership.friends(account), profile_account.id)
- if friend? do
- stats = Nola.IRC.AlcoologPlugin.get_full_statistics(profile_account.id)
- history = for {{nick, ts}, points, active, cl, deg, type, descr, meta} <- Nola.IRC.AlcoologPlugin.nick_history(profile_account) do
- %{
- at: ts |> DateTime.from_unix!(:millisecond),
- points: points,
- active: active,
- cl: cl,
- deg: deg,
- type: type,
- description: descr,
- meta: meta
- }
- end
- history = Enum.sort(history, &(DateTime.compare(&1.at, &2.at) != :lt))
- |> IO.inspect()
- conn
- |> assign(:title, "alcoolog #{nick}")
- |> render("user.html", network: network, profile: profile_account, days: days, nick: nick, history: history, stats: stats)
- else
- conn
- |> put_status(404)
- |> text("Page not found")
- end
- end
-
- def nick_stats_json(conn = %{assigns: %{account: account}}, params = %{"network" => network, "nick" => nick}) do
- profile_account = IRC.Account.find_always_by_nick(network, nick, nick)
- friend? = Enum.member?(IRC.Membership.friends(account), profile_account.id)
- if friend? do
- stats = Nola.IRC.AlcoologPlugin.get_full_statistics(profile_account.id)
-
- conn
- |> put_resp_content_type("application/json")
- |> text(Jason.encode!(stats))
- else
- conn
- |> put_status(404)
- |> json([])
- end
- end
-
- def nick_gls_json(conn = %{assigns: %{account: account}}, params = %{"network" => network, "nick" => nick}) do
- profile_account = IRC.Account.find_always_by_nick(network, nick, nick)
- friend? = Enum.member?(IRC.Membership.friends(account), profile_account.id)
- count = String.to_integer(Map.get(params, "days", "180"))
- if friend? do
- data = Nola.IRC.AlcoologPlugin.user_over_time_gl(profile_account, count)
- delay = count*((24 * 60)*60)
- now = DateTime.utc_now()
- start_date = DateTime.utc_now()
- |> DateTime.shift_zone!("Europe/Paris", Tzdata.TimeZoneDatabase)
- |> DateTime.add(-delay, :second, Tzdata.TimeZoneDatabase)
- |> DateTime.to_date()
- |> Date.to_erl()
- filled = (:calendar.date_to_gregorian_days(start_date) .. :calendar.date_to_gregorian_days(DateTime.utc_now |> DateTime.to_date() |> Date.to_erl))
- |> Enum.to_list
- |> Enum.map(&(:calendar.gregorian_days_to_date(&1)))
- |> Enum.map(&Date.from_erl!(&1))
- |> Enum.map(fn(date) ->
- %{date: date, gls: Map.get(data, date, 0)}
- end)
- |> Enum.sort(&(Date.compare(&1.date, &2.date) != :gt))
-
- conn
- |> put_resp_content_type("application/json")
- |> text(Jason.encode!(filled))
- else
- conn
- |> put_status(404)
- |> json([])
- end
- end
-
-
-
- def nick_volumes_json(conn = %{assigns: %{account: account}}, params = %{"network" => network, "nick" => nick}) do
- profile_account = IRC.Account.find_always_by_nick(network, nick, nick)
- friend? = Enum.member?(IRC.Membership.friends(account), profile_account.id)
- count = String.to_integer(Map.get(params, "days", "180"))
- if friend? do
- data = Nola.IRC.AlcoologPlugin.user_over_time(profile_account, count)
- delay = count*((24 * 60)*60)
- now = DateTime.utc_now()
- start_date = DateTime.utc_now()
- |> DateTime.shift_zone!("Europe/Paris", Tzdata.TimeZoneDatabase)
- |> DateTime.add(-delay, :second, Tzdata.TimeZoneDatabase)
- |> DateTime.to_date()
- |> Date.to_erl()
- filled = (:calendar.date_to_gregorian_days(start_date) .. :calendar.date_to_gregorian_days(DateTime.utc_now |> DateTime.to_date() |> Date.to_erl))
- |> Enum.to_list
- |> Enum.map(&(:calendar.gregorian_days_to_date(&1)))
- |> Enum.map(&Date.from_erl!(&1))
- |> Enum.map(fn(date) ->
- %{date: date, volumes: Map.get(data, date, 0)}
- end)
- |> Enum.sort(&(Date.compare(&1.date, &2.date) != :gt))
-
- conn
- |> put_resp_content_type("application/json")
- |> text(Jason.encode!(filled))
- else
- conn
- |> put_status(404)
- |> json([])
- end
- end
-
- def nick_log_json(conn = %{assigns: %{account: account}}, %{"network" => network, "nick" => nick}) do
- profile_account = IRC.Account.find_always_by_nick(network, nick, nick)
- friend? = Enum.member?(IRC.Membership.friends(account), profile_account.id)
- if friend? do
- history = for {{nick, ts}, points, active, cl, deg, type, descr, meta} <- Nola.IRC.AlcoologPlugin.nick_history(profile_account) do
- %{
- at: ts |> DateTime.from_unix!(:millisecond) |> DateTime.to_iso8601(),
- points: points,
- active: active,
- cl: cl,
- deg: deg,
- type: type,
- description: descr,
- meta: meta
- }
- end
- last = List.last(history)
- {_, active} = Nola.IRC.AlcoologPlugin.user_stats(profile_account)
- last = %{last | active: active, at: DateTime.utc_now() |> DateTime.to_iso8601()}
- history = history ++ [last]
-
- conn
- |> put_resp_content_type("application/json")
- |> text(Jason.encode!(history))
- else
- conn
- |> put_status(404)
- |> json([])
- end
- end
-
- def nick_history_json(conn = %{assigns: %{account: account}}, %{"network" => network, "nick" => nick}) do
- profile_account = IRC.Account.find_always_by_nick(network, nick, nick)
- friend? = Enum.member?(IRC.Membership.friends(account), profile_account.id)
- if friend? do
- history = for {_, date, value} <- Nola.IRC.AlcoologAnnouncerPlugin.log(profile_account) do
- %{date: DateTime.to_iso8601(date), value: value}
- end
- conn
- |> put_resp_content_type("application/json")
- |> text(Jason.encode!(history))
- else
- conn
- |> put_status(404)
- |> json([])
- end
- end
-
- def index(conn = %{assigns: %{account: account}}, %{"network" => network, "chan" => channel}) do
- index(conn, account, network, NolaWeb.reformat_chan(channel))
- end
-
- def index(conn = %{assigns: %{account: account}}, _) do
- index(conn, account, nil, nil)
- end
-
- #def index(conn, params) do
- # network = Map.get(params, "network")
- # chan = if c = Map.get(params, "chan") do
- # NolaWeb.reformat_chan(c)
- # end
- # irc_conn = if network do
- # IRC.Connection.get_network(network, chan)
- # end
- # bot = if(irc_conn, do: irc_conn.nick)#
- #
- # conn
- # |> put_status(403)
- # |> render("auth.html", network: network, channel: chan, irc_conn: conn, bot: bot)
- #end
-
- def index(conn, account, network, channel) do
- aday = ((24 * 60)*60)
- now = DateTime.utc_now()
- before7 = now
- |> DateTime.add(-(7*aday), :second)
- |> DateTime.to_unix(:millisecond)
- before15 = now
- |> DateTime.add(-(15*aday), :second)
- |> DateTime.to_unix(:millisecond)
- before31 = now
- |> DateTime.add(-(31*aday), :second)
- |> DateTime.to_unix(:millisecond)
- #match = :ets.fun2ms(fn(obj = {{^nick, date}, _, _, _, _}) when date > before -> obj end)
- match = [
- {{{:_, :"$1"}, :_, :_, :_, :_, :_, :_, :_},
- [
- {:>, :"$1", {:const, before15}},
- ], [:"$_"]}
- ]
-
- # tuple ets: {{nick, date}, volumes, current, nom, commentaire}
- members = IRC.Membership.expanded_members_or_friends(account, network, channel)
- members_ids = Enum.map(members, fn({account, _, nick}) -> account.id end)
- member_names = Enum.reduce(members, %{}, fn({account, _, nick}, acc) -> Map.put(acc, account.id, nick) end)
- drinks = :ets.select(Nola.IRC.AlcoologPlugin.ETS, match)
- |> Enum.filter(fn({{account, _}, _vol, _cur, _cl, _deg, _name, _cmt, _meta}) -> Enum.member?(members_ids, account) end)
- |> Enum.map(fn({{account, _}, _, _, _, _, _, _, _} = object) -> {object, Map.get(member_names, account)} end)
- |> Enum.sort_by(fn({{{_, ts}, _, _, _, _, _, _, _}, _}) -> ts end, &>/2)
-
- stats = Nola.IRC.AlcoologPlugin.get_channel_statistics(account, network, channel)
-
- top = Enum.reduce(drinks, %{}, fn({{{account_id, _}, vol, _, _, _, _, _, _}, _}, acc) ->
- nick = Map.get(member_names, account_id)
- all = Map.get(acc, nick, 0)
- Map.put(acc, nick, all + vol)
- end)
- |> Enum.sort_by(fn({_nick, count}) -> count end, &>/2)
- # {date, single_peak}
- #
- conn
- |> assign(:title, "alcoolog")
- |> render("index.html", network: network, channel: channel, drinks: drinks, top: top, stats: stats)
- end
-
- def index_gls_json(conn = %{assigns: %{account: account}}, %{"network" => network, "chan" => channel}) do
- count = 30
- channel = NolaWeb.reformat_chan(channel)
- members = IRC.Membership.expanded_members_or_friends(account, network, channel)
- members_ids = Enum.map(members, fn({account, _, nick}) -> account.id end)
- member_names = Enum.reduce(members, %{}, fn({account, _, nick}, acc) -> Map.put(acc, account.id, nick) end)
- delay = count*((24 * 60)*60)
- now = DateTime.utc_now()
- start_date = DateTime.utc_now()
- |> DateTime.shift_zone!("Europe/Paris", Tzdata.TimeZoneDatabase)
- |> DateTime.add(-delay, :second, Tzdata.TimeZoneDatabase)
- |> DateTime.to_date()
- |> Date.to_erl()
- filled = (:calendar.date_to_gregorian_days(start_date) .. :calendar.date_to_gregorian_days(DateTime.utc_now |> DateTime.to_date() |> Date.to_erl))
- |> Enum.to_list
- |> Enum.map(&(:calendar.gregorian_days_to_date(&1)))
- |> Enum.map(&Date.from_erl!(&1))
- |> Enum.map(fn(date) ->
- {date, (for {a, _, _} <- members, into: Map.new, do: {Map.get(member_names, a.id, a.id), 0})}
- end)
- |> Enum.into(Map.new)
-
- gls = Enum.reduce(members, filled, fn({account, _, _}, gls) ->
- Enum.reduce(Nola.IRC.AlcoologPlugin.user_over_time_gl(account, count), gls, fn({date, gl}, gls) ->
- u = Map.get(gls, date, %{})
- |> Map.put(Map.get(member_names, account.id, account.id), gl)
- Map.put(gls, date, u)
- end)
- end)
-
- dates = (:calendar.date_to_gregorian_days(start_date) .. :calendar.date_to_gregorian_days(DateTime.utc_now |> DateTime.to_date() |> Date.to_erl))
- |> Enum.to_list
- |> Enum.map(&(:calendar.gregorian_days_to_date(&1)))
- |> Enum.map(&Date.from_erl!(&1))
-
- filled2 = Enum.map(member_names, fn({_, name}) ->
- history = (:calendar.date_to_gregorian_days(start_date) .. :calendar.date_to_gregorian_days(DateTime.utc_now |> DateTime.to_date() |> Date.to_erl))
- |> Enum.to_list
- |> Enum.map(&(:calendar.gregorian_days_to_date(&1)))
- |> Enum.map(&Date.from_erl!(&1))
- |> Enum.map(fn(date) ->
- get_in(gls, [date, name]) #%{date: date, gl: get_in(gls, [date, name])}
- end)
- if Enum.all?(history, fn(x) -> x == 0 end) do
- nil
- else
- %{name: name, history: history}
- end
- end)
- |> Enum.filter(fn(x) -> x end)
-
- conn
- |> put_resp_content_type("application/json")
- |> text(Jason.encode!(%{labels: dates, data: filled2}))
- end
-
- def minisync(conn, %{"user_id" => user_id, "key" => key, "value" => value}) do
- account = IRC.Account.get(user_id)
- if account do
- ds = Nola.IRC.AlcoologPlugin.data_state()
- meta = Nola.IRC.AlcoologPlugin.get_user_meta(ds, account.id)
- case Float.parse(value) do
- {val, _} ->
- new_meta = Map.put(meta, String.to_existing_atom(key), val)
- Nola.IRC.AlcoologPlugin.put_user_meta(ds, account.id, new_meta)
- _ ->
- conn
- |> put_status(:unprocessable_entity)
- |> text("invalid value")
- end
- else
- conn
- |> put_status(:not_found)
- |> text("not found")
- end
- end
-
-end