better formatter code
parent
5c22f69953
commit
23e6c9bafb
|
@ -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}
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
|
|
154
lib/formatter.ex
154
lib/formatter.ex
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue