better formatter code

master
Rachel Fae Fox (foxiepaws) 2020-07-18 04:22:57 -04:00
parent 5c22f69953
commit 23e6c9bafb
2 changed files with 89 additions and 69 deletions

View File

@ -7,7 +7,7 @@ defmodule Discordirc.ChannelMap do
|> List.first() |> List.first()
case id do case id do
%{discordid: discordid, ircnetwork: ^network, ircchannel: ^channel} -> %{discordid: discordid} ->
{:ok, discordid} {:ok, discordid}
_ -> _ ->
@ -22,7 +22,7 @@ defmodule Discordirc.ChannelMap do
|> List.first() |> List.first()
case channel do case channel do
%{discordid: ^id, ircnetwork: net, ircchannel: chan} -> %{ircnetwork: net, ircchannel: chan} ->
{:ok, net, chan} {:ok, net, chan}
_ -> _ ->

View File

@ -1,11 +1,7 @@
defmodule Discordirc.Formatter do defmodule Discordirc.Formatter do
alias Nostrum.Api, as: DiscordAPI alias Nostrum.Api, as: DiscordAPI
def from_irc(nick, msg) do def from_irc(nick, msg, ctcp \\ false) do
from_irc(nick, msg, false)
end
def from_irc(nick, msg, ctcp) do
# strip or replace IRC formatting. # strip or replace IRC formatting.
fmsg = fmsg =
msg msg
@ -31,39 +27,78 @@ defmodule Discordirc.Formatter do
defmodule DiscordUserInfo do defmodule DiscordUserInfo do
defstruct id: nil, username: nil, discriminator: nil, nickname: nil defstruct id: nil, username: nil, discriminator: nil, nickname: nil
def from_id(id) do def from_id(id, guild) do
{:ok, user} = DiscordAPI.get_user(id) case DiscordAPI.get_user(id) do
# currently we'll just use the first guild we're connected to to resolve nicks. {:ok, user} ->
# TODO: implement mutli-guild functionality case DiscordAPI.get_guild_member(guild, user.id()) do
g = DiscordAPI.get_current_user_guilds!() |> List.first() {:error, _} ->
{:ok, member} = DiscordAPI.get_guild_member(g.id(), user.id()) nil
%DiscordUserInfo{ {:ok, member} ->
id: id, %DiscordUserInfo{
username: user.username, id: id,
discriminator: user.discriminator, username: user.username,
nickname: member.nick discriminator: user.discriminator,
} nickname: member.nick
}
end
{:error, _} ->
nil
end
end
end
defmodule DiscordChannelInfo do
defstruct id: nil, channel: nil
def from_id(id) do
case DiscordAPI.get_channel(id) do
{:ok, channel} ->
%DiscordChannelInfo{
id: id,
channel: channel.name
}
{:error, _} ->
nil
end
end end
end end
def tryreplace(s, m) do def tryreplace(s, m) do
pattern = ~r/\<\@\!(\d+)\>/um case m do
dui = m[:dui] %{dui: nil} ->
r = m[:str] s
if String.match?(s, pattern) do %{cui: nil} ->
if s == r do s
if is_binary(dui.nickname) do
String.replace(s, r, dui.nickname) %{str: r, dui: dui} ->
if String.match?(s, ~r/\<\@\!(\d+)\>/) do
if s == r do
if is_binary(dui.nickname) do
String.replace(s, r, "@" <> dui.nickname)
else
String.replace(s, r, "@" <> dui.username <> "#" <> dui.discriminator)
end
else
nil
end
else else
String.replace(s, r, dui.username <> "#" <> dui.discriminator) s
end
%{str: r, cui: cui} ->
if String.match?(s, ~r/\<#(\d+)\>/) do
if s == r do
String.replace(s, r, "#" <> cui.channel)
else
nil
end
else
s
end end
else
nil
end
else
s
end end
end end
@ -84,59 +119,44 @@ defmodule Discordirc.Formatter do
end end
end end
def fixdiscordidstrings(content, bare \\ false) do def fixdiscordidstrings(%{:content => content, :guild_id => guild}) do
pattern = ~r/\<\@\!(\d+)\>/um pattern = ~r/\<(\@\!|#)(\d+)\>/um
matches = matches =
Regex.scan(pattern, content) Regex.scan(pattern, content)
|> Enum.uniq() |> Enum.uniq()
|> Enum.map(fn x -> |> Enum.map(fn
[ [fst, "@!", lst] ->
str: List.first(x), %{str: fst, id: lst, dui: DiscordUserInfo.from_id(String.to_integer(lst), guild)}
id: List.last(x),
dui: DiscordUserInfo.from_id(String.to_integer(List.last(x))) [fst, "#", lst] ->
] %{str: fst, id: lst, cui: DiscordChannelInfo.from_id(String.to_integer(lst))}
end) end)
unless matches == [] do unless matches == [] do
if bare do doallreplacements(
doallreplacements( Regex.split(pattern, content, include_captures: true),
Regex.split(pattern, content, include_captures: true), matches,
matches, {"", matches}
{"", matches} )
)
else
doallreplacements(
Regex.split(pattern, content, include_captures: true),
matches,
{"@", matches}
)
end
else else
content content
end end
end end
def format_member_nick(msg) do
user = msg.author
{:ok, member} = DiscordAPI.get_guild_member(msg.guild_id, user.id())
if is_binary(member.nick) do
member.nick
else
"#{user.username}\##{user.discriminator}"
end
end
def from_discord(msg) do def from_discord(msg) do
content = msg.content %{attachments: attachments, author: user, guild_id: guild} = msg
attachments = msg.attachments
usr = format_member_nick(msg) usr =
case DiscordAPI.get_guild_member(guild, user.id) do
{:ok, %{nick: nick}} when is_binary(nick) -> nick
_ -> "#{user.username}\##{user.discriminator}"
end
cpart = cpart =
content msg
|> fixdiscordidstrings
|> String.split("\n") |> String.split("\n")
|> Enum.map(&fixdiscordidstrings(&1))
apart = apart =
attachments attachments