feat(irc): support optional SASL and NickServ auth (#511)

* feat(irc): support SASL and NickServ auth

* feat(irc): add missing fields

* feat(irc): support SASL and NickServ auth

* feat(irc): add missing fields

* feat(irc): add validation

* feat(indexers): unify and set required values

* feat(irc): add postgres migrations

* feat(irc): use nick as handlerkey

* feat(irc): use account for nickserv

* fix(irc): pg db migration
This commit is contained in:
ze0s 2022-10-27 22:25:58 +02:00 committed by GitHub
parent 4ef0408f33
commit 4bf023d030
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
65 changed files with 1404 additions and 631 deletions

View file

@ -26,7 +26,7 @@ func NewIrcRepo(log logger.Logger, db *DB) domain.IrcRepo {
func (r *IrcRepo) GetNetworkByID(ctx context.Context, id int64) (*domain.IrcNetwork, error) {
queryBuilder := r.db.squirrel.
Select("id", "enabled", "name", "server", "port", "tls", "pass", "invite_command", "nickserv_account", "nickserv_password").
Select("id", "enabled", "name", "server", "port", "tls", "pass", "nick", "auth_mechanism", "auth_account", "auth_password", "invite_command").
From("irc_network").
Where("id = ?", id)
@ -38,20 +38,21 @@ func (r *IrcRepo) GetNetworkByID(ctx context.Context, id int64) (*domain.IrcNetw
var n domain.IrcNetwork
var pass, inviteCmd sql.NullString
var nsAccount, nsPassword sql.NullString
var pass, nick, inviteCmd sql.NullString
var account, password sql.NullString
var tls sql.NullBool
row := r.db.handler.QueryRowContext(ctx, query, args...)
if err := row.Scan(&n.ID, &n.Enabled, &n.Name, &n.Server, &n.Port, &tls, &pass, &inviteCmd, &nsAccount, &nsPassword); err != nil {
if err := row.Scan(&n.ID, &n.Enabled, &n.Name, &n.Server, &n.Port, &tls, &pass, &nick, &n.Auth.Mechanism, &account, &password, &inviteCmd); err != nil {
return nil, errors.Wrap(err, "error scanning row")
}
n.TLS = tls.Bool
n.Pass = pass.String
n.Nick = nick.String
n.InviteCommand = inviteCmd.String
n.NickServ.Account = nsAccount.String
n.NickServ.Password = nsPassword.String
n.Auth.Account = account.String
n.Auth.Password = password.String
return &n, nil
}
@ -103,7 +104,7 @@ func (r *IrcRepo) DeleteNetwork(ctx context.Context, id int64) error {
func (r *IrcRepo) FindActiveNetworks(ctx context.Context) ([]domain.IrcNetwork, error) {
queryBuilder := r.db.squirrel.
Select("id", "enabled", "name", "server", "port", "tls", "pass", "invite_command", "nickserv_account", "nickserv_password").
Select("id", "enabled", "name", "server", "port", "tls", "pass", "nick", "auth_mechanism", "auth_account", "auth_password", "invite_command").
From("irc_network").
Where("enabled = ?", true)
@ -123,20 +124,21 @@ func (r *IrcRepo) FindActiveNetworks(ctx context.Context) ([]domain.IrcNetwork,
for rows.Next() {
var net domain.IrcNetwork
var pass, inviteCmd sql.NullString
var nsAccount, nsPassword sql.NullString
var pass, nick, inviteCmd sql.NullString
var account, password sql.NullString
var tls sql.NullBool
if err := rows.Scan(&net.ID, &net.Enabled, &net.Name, &net.Server, &net.Port, &tls, &pass, &inviteCmd, &nsAccount, &nsPassword); err != nil {
if err := rows.Scan(&net.ID, &net.Enabled, &net.Name, &net.Server, &net.Port, &tls, &pass, &nick, &net.Auth.Mechanism, &account, &password, &inviteCmd); err != nil {
return nil, errors.Wrap(err, "error scanning row")
}
net.TLS = tls.Bool
net.Pass = pass.String
net.Nick = nick.String
net.InviteCommand = inviteCmd.String
net.NickServ.Account = nsAccount.String
net.NickServ.Password = nsPassword.String
net.Auth.Account = account.String
net.Auth.Password = password.String
networks = append(networks, net)
}
@ -149,7 +151,7 @@ func (r *IrcRepo) FindActiveNetworks(ctx context.Context) ([]domain.IrcNetwork,
func (r *IrcRepo) ListNetworks(ctx context.Context) ([]domain.IrcNetwork, error) {
queryBuilder := r.db.squirrel.
Select("id", "enabled", "name", "server", "port", "tls", "pass", "invite_command", "nickserv_account", "nickserv_password").
Select("id", "enabled", "name", "server", "port", "tls", "pass", "nick", "auth_mechanism", "auth_account", "auth_password", "invite_command").
From("irc_network").
OrderBy("name ASC")
@ -169,20 +171,21 @@ func (r *IrcRepo) ListNetworks(ctx context.Context) ([]domain.IrcNetwork, error)
for rows.Next() {
var net domain.IrcNetwork
var pass, inviteCmd sql.NullString
var nsAccount, nsPassword sql.NullString
var pass, nick, inviteCmd sql.NullString
var account, password sql.NullString
var tls sql.NullBool
if err := rows.Scan(&net.ID, &net.Enabled, &net.Name, &net.Server, &net.Port, &tls, &pass, &inviteCmd, &nsAccount, &nsPassword); err != nil {
if err := rows.Scan(&net.ID, &net.Enabled, &net.Name, &net.Server, &net.Port, &tls, &pass, &nick, &net.Auth.Mechanism, &account, &password, &inviteCmd); err != nil {
return nil, errors.Wrap(err, "error scanning row")
}
net.TLS = tls.Bool
net.Pass = pass.String
net.Nick = nick.String
net.InviteCommand = inviteCmd.String
net.NickServ.Account = nsAccount.String
net.NickServ.Password = nsPassword.String
net.Auth.Account = account.String
net.Auth.Password = password.String
networks = append(networks, net)
}
@ -232,10 +235,10 @@ func (r *IrcRepo) ListChannels(networkID int64) ([]domain.IrcChannel, error) {
func (r *IrcRepo) CheckExistingNetwork(ctx context.Context, network *domain.IrcNetwork) (*domain.IrcNetwork, error) {
queryBuilder := r.db.squirrel.
Select("id", "enabled", "name", "server", "port", "tls", "pass", "invite_command", "nickserv_account", "nickserv_password").
Select("id", "enabled", "name", "server", "port", "tls", "pass", "nick", "auth_mechanism", "auth_account", "auth_password", "invite_command").
From("irc_network").
Where("server = ?", network.Server).
Where("nickserv_account = ?", network.NickServ.Account)
Where("auth_account = ?", network.Auth.Account)
query, args, err := queryBuilder.ToSql()
if err != nil {
@ -247,10 +250,11 @@ func (r *IrcRepo) CheckExistingNetwork(ctx context.Context, network *domain.IrcN
var net domain.IrcNetwork
var pass, inviteCmd, nickPass sql.NullString
var pass, nick, inviteCmd sql.NullString
var account, password sql.NullString
var tls sql.NullBool
err = row.Scan(&net.ID, &net.Enabled, &net.Name, &net.Server, &net.Port, &tls, &pass, &inviteCmd, &net.NickServ.Account, &nickPass)
err = row.Scan(&net.ID, &net.Enabled, &net.Name, &net.Server, &net.Port, &tls, &pass, &nick, &net.Auth.Mechanism, &account, &password, &inviteCmd)
if err == sql.ErrNoRows {
// no result is not an error in our case
return nil, nil
@ -260,8 +264,10 @@ func (r *IrcRepo) CheckExistingNetwork(ctx context.Context, network *domain.IrcN
net.TLS = tls.Bool
net.Pass = pass.String
net.Nick = nick.String
net.InviteCommand = inviteCmd.String
net.NickServ.Password = nickPass.String
net.Auth.Account = account.String
net.Auth.Password = password.String
return &net, nil
}
@ -269,10 +275,11 @@ func (r *IrcRepo) CheckExistingNetwork(ctx context.Context, network *domain.IrcN
func (r *IrcRepo) StoreNetwork(network *domain.IrcNetwork) error {
netName := toNullString(network.Name)
pass := toNullString(network.Pass)
nick := toNullString(network.Nick)
inviteCmd := toNullString(network.InviteCommand)
nsAccount := toNullString(network.NickServ.Account)
nsPassword := toNullString(network.NickServ.Password)
account := toNullString(network.Auth.Account)
password := toNullString(network.Auth.Password)
var err error
var retID int64
@ -286,9 +293,11 @@ func (r *IrcRepo) StoreNetwork(network *domain.IrcNetwork) error {
"port",
"tls",
"pass",
"nick",
"auth_mechanism",
"auth_account",
"auth_password",
"invite_command",
"nickserv_account",
"nickserv_password",
).
Values(
network.Enabled,
@ -297,9 +306,11 @@ func (r *IrcRepo) StoreNetwork(network *domain.IrcNetwork) error {
network.Port,
network.TLS,
pass,
nick,
network.Auth.Mechanism,
account,
password,
inviteCmd,
nsAccount,
nsPassword,
).
Suffix("RETURNING id").
RunWith(r.db.handler)
@ -317,10 +328,11 @@ func (r *IrcRepo) StoreNetwork(network *domain.IrcNetwork) error {
func (r *IrcRepo) UpdateNetwork(ctx context.Context, network *domain.IrcNetwork) error {
netName := toNullString(network.Name)
pass := toNullString(network.Pass)
nick := toNullString(network.Nick)
inviteCmd := toNullString(network.InviteCommand)
nsAccount := toNullString(network.NickServ.Account)
nsPassword := toNullString(network.NickServ.Password)
account := toNullString(network.Auth.Account)
password := toNullString(network.Auth.Password)
var err error
@ -332,9 +344,11 @@ func (r *IrcRepo) UpdateNetwork(ctx context.Context, network *domain.IrcNetwork)
Set("port", network.Port).
Set("tls", network.TLS).
Set("pass", pass).
Set("nick", nick).
Set("auth_mechanism", network.Auth.Mechanism).
Set("auth_account", account).
Set("auth_password", password).
Set("invite_command", inviteCmd).
Set("nickserv_account", nsAccount).
Set("nickserv_password", nsPassword).
Set("updated_at", time.Now().Format(time.RFC3339)).
Where("id = ?", network.ID)

View file

@ -36,14 +36,16 @@ CREATE TABLE irc_network
port INTEGER NOT NULL,
tls BOOLEAN,
pass TEXT,
nick TEXT,
auth_mechanism TEXT,
auth_account TEXT,
auth_password TEXT,
invite_command TEXT,
nickserv_account TEXT,
nickserv_password TEXT,
connected BOOLEAN,
connected_since TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE (server, port, nickserv_account)
UNIQUE (server, port, nick)
);
CREATE TABLE irc_channel
@ -589,4 +591,28 @@ CREATE INDEX indexer_identifier_index
ALTER TABLE filter
ADD COLUMN use_regex_release_tags BOOLEAN DEFAULT FALSE;
`,
`ALTER TABLE irc_network
RENAME COLUMN nickserv_account TO auth_account;
ALTER TABLE irc_network
RENAME COLUMN nickserv_password TO auth_password;
ALTER TABLE irc_network
ADD nick TEXT;
ALTER TABLE irc_network
ADD auth_mechanism TEXT DEFAULT 'SASL_PLAIN';
ALTER TABLE irc_network
DROP CONSTRAINT irc_network_server_port_nickserv_account_key;
ALTER TABLE irc_network
ADD CONSTRAINT irc_network_server_port_nick_key
UNIQUE (server, port, nick);
UPDATE irc_network
SET nick = irc_network.auth_account;
UPDATE irc_network
SET auth_mechanism = 'SASL_PLAIN';`,
}

View file

@ -36,14 +36,16 @@ CREATE TABLE irc_network
port INTEGER NOT NULL,
tls BOOLEAN,
pass TEXT,
nick TEXT,
auth_mechanism TEXT,
auth_account TEXT,
auth_password TEXT,
invite_command TEXT,
nickserv_account TEXT,
nickserv_password TEXT,
connected BOOLEAN,
connected_since TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE (server, port, nickserv_account)
UNIQUE (server, port, nick)
);
CREATE TABLE irc_channel
@ -909,4 +911,52 @@ CREATE INDEX indexer_identifier_index
ALTER TABLE filter
ADD COLUMN use_regex_release_tags BOOLEAN DEFAULT FALSE;
`,
`
CREATE TABLE irc_network_dg_tmp
(
id INTEGER
primary key,
enabled BOOLEAN,
name TEXT not null,
server TEXT not null,
port INTEGER not null,
tls BOOLEAN,
pass TEXT,
nick TEXT,
auth_mechanism TEXT,
auth_account TEXT,
auth_password TEXT,
invite_command TEXT,
connected BOOLEAN,
connected_since TIMESTAMP,
created_at TIMESTAMP default CURRENT_TIMESTAMP,
updated_at TIMESTAMP default CURRENT_TIMESTAMP,
unique (server, port, nick)
);
INSERT INTO irc_network_dg_tmp(id, enabled, name, server, port, tls, pass, nick, auth_mechanism, auth_account, auth_password, invite_command,
connected, connected_since, created_at, updated_at)
SELECT id,
enabled,
name,
server,
port,
tls,
pass,
nickserv_account,
'SASL_PLAIN',
nickserv_account,
nickserv_password,
invite_command,
connected,
connected_since,
created_at,
updated_at
FROM irc_network;
DROP TABLE irc_network;
ALTER TABLE irc_network_dg_tmp
RENAME TO irc_network;
`,
}

View file

@ -14,9 +14,18 @@ type IrcChannel struct {
Monitoring bool `json:"monitoring"`
}
type NickServ struct {
Account string `json:"account,omitempty"`
Password string `json:"password,omitempty"`
type IRCAuthMechanism string
const (
IRCAuthMechanismNone IRCAuthMechanism = "NONE"
IRCAuthMechanismSASLPlain IRCAuthMechanism = "SASL_PLAIN"
IRCAuthMechanismNickServ IRCAuthMechanism = "NICKSERV"
)
type IRCAuth struct {
Mechanism IRCAuthMechanism `json:"mechanism,omitempty"`
Account string `json:"account,omitempty"`
Password string `json:"password,omitempty"`
}
type IrcNetwork struct {
@ -27,8 +36,9 @@ type IrcNetwork struct {
Port int `json:"port"`
TLS bool `json:"tls"`
Pass string `json:"pass"`
Nick string `json:"nick"`
Auth IRCAuth `json:"auth,omitempty"`
InviteCommand string `json:"invite_command"`
NickServ NickServ `json:"nickserv,omitempty"`
Channels []IrcChannel `json:"channels"`
Connected bool `json:"connected"`
ConnectedSince *time.Time `json:"connected_since"`
@ -42,8 +52,9 @@ type IrcNetworkWithHealth struct {
Port int `json:"port"`
TLS bool `json:"tls"`
Pass string `json:"pass"`
Nick string `json:"nick"`
Auth IRCAuth `json:"auth,omitempty"`
InviteCommand string `json:"invite_command"`
NickServ NickServ `json:"nickserv,omitempty"`
CurrentNick string `json:"current_nick"`
PreferredNick string `json:"preferred_nick"`
Channels []ChannelWithHealth `json:"channels"`

View file

@ -15,11 +15,14 @@ source: custom
settings:
- name: passkey
type: secret
required: true
label: Pass key
help: "Your passkey"
regex: /([\da-z]{32})
- name: uid
type: secret
required: true
label: User ID
help: "Your User ID"
regex: /(\d+)
@ -34,12 +37,19 @@ irc:
announcers:
- ACiD-BaBy
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -15,10 +15,13 @@ source: gazelle
settings:
- name: authkey
type: secret
required: true
label: Auth key
help: Right click DL on a torrent and get the authkey.
- name: torrent_pass
type: secret
required: true
label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass.
@ -32,22 +35,30 @@ irc:
announcers:
- Voyager
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user-bot
- name: nickserv.password
help: NickServ account. Make sure to group your main user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "Voyager autobot USERNAME IRCKey"
required: false
default: "Voyager autobot USERNAME IRCKEY"
required: true
label: Invite command
help: Invite auth with Voyager.
help: Invite auth with Voyager. Replace USERNAME with site nick and set IRCKEY.
parse:
type: multi

View file

@ -15,6 +15,7 @@ source: gazelle
settings:
- name: passkey
type: secret
required: true
label: PassKey
help: Settings -> Account -> Passkey.
@ -28,22 +29,30 @@ irc:
announcers:
- Satsuki
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user|autodl
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|autodl
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "/msg Satsuki enter #announce {AB username} ircKey"
default: "Satsuki enter #announce USERNAME IRCKEY"
required: true
label: Invite command
help: Invite auth with Satsuki, animebytes.tv/irc
help: Invite auth with Satsuki, animebytes.tv/irc. Replace USERNAME and IRCKEY.
parse:
type: single

View file

@ -15,6 +15,7 @@ source: UNIT3D (F3NIX)
settings:
- name: rsskey
type: secret
required: true
label: RSS key
help: "Go to your profile, My Security, RSS Key and copy RSS key."
@ -29,22 +30,30 @@ irc:
- Willie
- Millie
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. MUST follow format user|autodl
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|autodl
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "Millie announce ircKey"
default: "Millie announce IRCKEY"
required: true
label: Invite command
help: Invite auth with Millie.
help: Invite auth with Millie. Replace IRCKEY.
parse:
type: single

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: passkey
type: secret
required: true
label: Pass key
help: "Your passkey"
regex: /([\da-z]{32})
@ -29,12 +30,19 @@ irc:
announcers:
- BHD-bot
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: rsskey
type: secret
required: true
label: RSS key
help: "The rsskey in your RSS feed link"
@ -28,12 +29,19 @@ irc:
announcers:
- Tracer
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Ask staff to unlock it!
- name: nickserv.password
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -16,14 +16,19 @@ source: gazelle
settings:
- name: authkey
type: secret
required: true
label: Auth key
help: Right click DL on a torrent and get the authkey.
- name: torrent_pass
type: secret
required: true
label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass.
- name: api_key
type: secret
required: true
label: API Key
help: Username -> Edit Profile -> API
@ -49,12 +54,19 @@ irc:
announcers:
- Barney
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user|autodl
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|autodl
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -15,7 +15,8 @@ source: UNIT3D
settings:
- name: passkey
type: secret
label: Passkey
required: true
label: RSS key
help: "Go to your profile tab under safety, copy RSS Key (RID)"
irc:
@ -28,22 +29,30 @@ irc:
announcers:
- DBBot
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|autodl
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "DBBot announce ircKey"
default: "DBBot announce IRCKEY"
required: true
label: Invite command
help: Invite auth with DBBot.
help: Invite auth with DBBot. Replace IRCKEY with your key.
parse:
type: single

View file

@ -15,6 +15,7 @@ source: gazelle
settings:
- name: passkey
type: secret
required: true
label: PassKey
help: Settings -> Security -> Passkey.
@ -28,16 +29,24 @@ irc:
announcers:
- ENDOR
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user|autodl
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|autodl
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "ENDOR !invite USERNAME IRCKEY"

View file

@ -15,10 +15,13 @@ source: gazelle
settings:
- name: authkey
type: secret
required: true
label: Auth key
help: Right click DL on a torrent and get the authkey.
- name: torrent_pass
type: secret
required: true
label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass.
@ -32,12 +35,19 @@ irc:
announcers:
- "^Wizard^"
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot. Must have staff permission first.
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot. Must have staff permission first.
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -15,10 +15,13 @@ source: gazelle
settings:
- name: authkey
type: secret
required: true
label: Auth key
help: Right click DL on a torrent and get the authkey.
- name: torrent_pass
type: secret
required: true
label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass.
@ -32,12 +35,19 @@ irc:
announcers:
- TheGimp
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user|bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "The passkey in your profile."
@ -28,12 +29,19 @@ irc:
announcers:
- Announce
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_dl
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_dl
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password

View file

@ -13,10 +13,13 @@ source: gazelle
settings:
- name: uid
type: text
required: true
label: User ID
help: Create rss link at https://www.fuzer.me/getrss.php and find at &u=11111
- name: passkey
type: secret
required: true
label: PassKey
help: Create rss link at https://www.fuzer.me/getrss.php and find at &torrent_pass=...
@ -30,15 +33,22 @@ irc:
announcers:
- Fuzer
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account
- name: nickserv.password
- name: auth.password
type: secret
required: false
label: NickServ Password
help: A password of your choice to be used for the bot identification. Save it!
help: NickServ password
parse:
type: single

View file

@ -16,14 +16,19 @@ source: gazelle
settings:
- name: authkey
type: secret
required: true
label: Auth key
help: Right click DL on a torrent and get the authkey.
- name: torrent_pass
type: secret
required: true
label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass.
- name: api_key
type: secret
required: true
label: API Key
help: Username -> Edit / Settings -> API Keys
@ -49,22 +54,30 @@ irc:
announcers:
- Vertigo
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user|bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "Vertigo ENTER #GGn-Announce USERNAME IRCKey"
default: "Vertigo ENTER #GGn-Announce USERNAME IRCKEY"
required: true
label: Invite command
help: Invite auth with Vertigo.
help: Invite auth with Vertigo. Replace USERNAME and IRCKEY.
parse:
type: single

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: rsskey
type: secret
required: true
label: RSS key
help: "Go to My Panel and then Change PID. It will show the PID, but don't click it!"
@ -28,12 +29,19 @@ irc:
announcers:
- hdspace
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password

View file

@ -16,10 +16,12 @@ source: xbtit
settings:
- name: key
type: secret
required: true
label: RSS key
help: "Generate a RSS feed and copy key from URL"
- name: token
type: secret
required: true
label: RSS Token
help: "Generate a RSS feed and copy token from URL"
@ -33,12 +35,19 @@ irc:
announcers:
- HoboLarry
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user-bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user-bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: Copy the passkey from your profile page
@ -28,22 +29,30 @@ irc:
announcers:
- midgards
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user|autodl
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|autodl
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "midgards announce IRCKey"
default: "midgards announce IRCKEY"
required: true
label: Invite command
help: Invite auth with the key from https://hdbits.org/bot_invite.php
help: Invite auth with the key from https://hdbits.org/bot_invite.php. Replace IRCKEY.
parse:
type: single

View file

@ -13,10 +13,13 @@ source: gazelle
settings:
- name: passkey
type: secret
required: true
label: PassKey
help: Right click download on a torrent and get the passkey.
- name: authkey
type: secret
required: true
label: Auth key
help: Right click download on a torrent and get the authkey.
@ -30,22 +33,30 @@ irc:
announcers:
- HeBoT
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: "Bot nick. Make sure you follow the naming scheme: username|bot"
- name: auth.account
type: text
required: true
label: NickServ Account
help: "NickServ account name. Make sure you follow the naming scheme: HebitsNickname|bot"
- name: nickserv.password
help: NickServ account. Make sure to group your main user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password
help: A password of your choice to be used for the bot identification. Save it!
help: NickServ password
- name: invite_command
type: secret
default: "HeBoT !invite IRCKey"
default: "HeBoT !invite IRCKEY"
required: true
label: Invite command
help: "Replace IRCKey with: Edit Profile -> Access Settings -> IRC Key"
help: "Replace IRCKEY with: Edit Profile -> Access Settings -> IRC Key"
parse:
type: multi

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Go to https://immortalseed.me/getrss.php to get the RSS feed link and extract passkey from secret_key"
regex: '[\?&;]secret_key=([\da-fA-F]{32})'
@ -29,15 +30,21 @@ irc:
announcers:
- thoth
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
help: NickServ account. Make sure to group your user and bot.
- name: nickserv.password
- name: auth.password
type: secret
required: true
required: false
label: NickServ Password
help: NickServ password
@ -46,7 +53,7 @@ irc:
default: "immortal invite USERNAME IRCKEY"
required: true
label: Invite command
help: Invite auth with immortal.
help: Invite auth with immortal. Replace USERNAME and IRCKEY.
parse:
type: single

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Go to your profile and copy your passkey"
@ -28,12 +29,19 @@ irc:
announcers:
- Metal
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -16,6 +16,7 @@ source: unknown
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Copy the passkey from your details page."
@ -30,12 +31,19 @@ irc:
- IPT
- FunTimes
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_autodl
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_autodl
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password

View file

@ -1,61 +1,69 @@
---
#id: Milkie
name: Milkie
identifier: milkie
description: Milkie is a private torrent tracker for GENERAL.
language: en-us
urls:
- https://www.milkie.cc
privacy: private
protocol: torrent
supports:
- irc
- rss
source: custom
settings:
- name: apikey
type: secret
label: Api key
help: "Go to your profile and copy your Api key from settings"
regex: /([a-zA-Z0-9\+])
irc:
network: P2P-Network
server: irc.p2p-network.net
port: 6697
tls: true
channels:
- "#milkie-announce"
announcers:
- the_cow
- the_cow1
- the_cow2
settings:
- name: nickserv.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
type: secret
required: false
label: NickServ Password
help: NickServ password
parse:
type: single
lines:
- test:
- "{tv} :: The.Great.Xmas.Show.S00E00.1080p.WEB.H264-TEST :: [1080p, web] :: https://milkie.cc/browse/xxxxxxxxxxxx"
pattern: '{(.*)}\s::\s(.*)\s::\s\[(.*)\]\s::\s(https?\:\/\/[^\/]+\/)browse\/(.*)'
vars:
- category
- torrentName
- releaseTags
- baseUrl
- torrentId
match:
torrenturl: "{{ .baseUrl }}api/v1/torrents/{{ .torrentId }}/torrent?key={{ .apikey }}"
encode:
- apikey
---
#id: Milkie
name: Milkie
identifier: milkie
description: Milkie is a private torrent tracker for GENERAL.
language: en-us
urls:
- https://www.milkie.cc
privacy: private
protocol: torrent
supports:
- irc
- rss
source: custom
settings:
- name: apikey
type: secret
required: true
label: Api key
help: "Go to your profile and copy your Api key from settings"
regex: /([a-zA-Z0-9\+])
irc:
network: P2P-Network
server: irc.p2p-network.net
port: 6697
tls: true
channels:
- "#milkie-announce"
announcers:
- the_cow
- the_cow1
- the_cow2
settings:
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password
help: NickServ password
parse:
type: single
lines:
- test:
- "{tv} :: The.Great.Xmas.Show.S00E00.1080p.WEB.H264-TEST :: [1080p, web] :: https://milkie.cc/browse/xxxxxxxxxxxx"
pattern: '{(.*)}\s::\s(.*)\s::\s\[(.*)\]\s::\s(https?\:\/\/[^\/]+\/)browse\/(.*)'
vars:
- category
- torrentName
- releaseTags
- baseUrl
- torrentId
match:
torrenturl: "{{ .baseUrl }}api/v1/torrents/{{ .torrentId }}/torrent?key={{ .apikey }}"
encode:
- apikey

View file

@ -15,10 +15,13 @@ source: gazelle
settings:
- name: authkey
type: secret
required: true
label: Auth key
help: Right click DL on a torrent and get the authkey.
- name: torrent_pass
type: secret
required: true
label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass.
@ -32,12 +35,19 @@ irc:
announcers:
- Jarvis
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: cookie
type: secret
required: true
label: Cookie (mam_id)
help: "Check how to get cookies in your browser and find the mam_id cookie. Changes monthly"
@ -28,12 +29,19 @@ irc:
announcers:
- MouseBot
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot. Use main nick here.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -14,6 +14,7 @@ source: unknown
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Check a torrent download link. key='value' is your passkey."
@ -27,13 +28,19 @@ irc:
announcers:
- nCore
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|autodl
label: Nick
help: Bot nick. Eg. user|autodl
- name: nickserv.password
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password
@ -41,10 +48,10 @@ irc:
- name: invite_command
type: secret
default: "NBOT !invite <KEY>"
default: "NBOT !invite IRCKEY"
required: true
label: Invite command
help: Invite auth with the key from https://ncore.pro/irc.php
help: Invite auth with the key from https://ncore.pro/irc.php. Replace IRCKEY
parse:
type: single

View file

@ -15,10 +15,13 @@ source: gazelle
settings:
- name: authkey
type: secret
required: true
label: Auth key
help: Right click DL on a torrent and get the authkey.
- name: torrent_pass
type: secret
required: true
label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass.
@ -32,24 +35,30 @@ irc:
announcers:
- DRADIS
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Like user|bot
label: Nick
help: Bot nick. Eg. user|bot
- name: nickserv.password
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
required: false
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "Muffit bot #nbl-announce USERNAME IRCKey"
default: "Muffit bot #nbl-announce USERNAME IRCKEY"
required: true
label: Invite command
help: Invite auth with Muffit.
help: Invite auth with Muffit. Replace USERNAME and IRCKEY.
parse:
type: single

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Copy passkey from a download link"
@ -28,12 +29,19 @@ irc:
announcers:
- NB
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Use primary nick or ask staff to allow grouped nick.
- name: nickserv.password
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -15,10 +15,13 @@ source: gazelle
settings:
- name: authkey
type: secret
required: true
label: Auth key
help: Right click DL on a torrent and get the authkey.
- name: torrent_pass
type: secret
required: true
label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass.
@ -32,22 +35,30 @@ irc:
announcers:
- Udon
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user|bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "Udon KNOCK oppaitime-announce [username] [irckey]"
default: "Udon KNOCK oppaitime-announce USERNAME IRCKEY"
required: true
label: Invite command
help: Invite auth with Udon. Replace [username] site username and [irckey] with your IRC key.
help: Invite auth with Udon. Replace USERNAME site username and IRCKEY with your IRC key.
# Categories
# Movies

View file

@ -15,6 +15,7 @@ source: gazelle
settings:
- name: torrent_pass
type: text
required: true
label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass.
@ -28,22 +29,30 @@ irc:
announcers:
- hermes
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user|bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "hermes enter #announce USERNAME IRCKey"
default: "hermes enter #announce USERNAME IRCKEY"
required: true
label: Invite command
help: Invite auth with Hermes.
help: Invite auth with Hermes. Replace USERNAME and IRCKEY.
parse:
type: single

View file

@ -15,10 +15,13 @@ source: gazelle
settings:
- name: authkey
type: secret
required: true
label: Auth key
help: Right click DL on a torrent and get the authkey.
- name: torrent_pass
type: secret
required: true
label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass.
@ -32,12 +35,19 @@ irc:
announcers:
- "PB-Announcer"
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot.
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Copy your passkey from the RSS feed"
@ -28,13 +29,19 @@ irc:
announcers:
- PS-Info
settings:
- name: nickserv.account
- name: nick
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: nickserv.password
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password
@ -42,10 +49,10 @@ irc:
- name: invite_command
type: secret
default: "PS-Info pass <IRC_KEY>"
default: "PS-Info pass IRCKEY"
required: true
label: Invite command
help: Invite auth with PS-Info. Replace <IRC_KEY> with your IRC key.
help: Invite auth with PS-Info. Replace IRCKEY with your IRC key.
parse:

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: rsskey
type: secret
required: true
label: RSS key
help: "Go to your profile and copy your RSS key"
@ -28,13 +29,19 @@ irc:
announcers:
- PT-BOT
settings:
- name: nickserv.account
- name: nick
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: nickserv.password
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password
@ -42,10 +49,10 @@ irc:
- name: invite_command
type: secret
default: "PT-BOT invite IRC_KEY"
default: "PT-BOT invite IRCKEY"
required: true
label: Invite command
help: Invite auth with PT-BOT. Replace IRC_KEY with your IRC key.
help: Invite auth with PT-BOT. Replace IRCKEY with your IRC key.
parse:
type: single

View file

@ -1,61 +1,69 @@
---
#id: tracker69
name: PreToMe
identifier: pretome
description: PreToMe (PTM) is 0Day/General ratioless tracker with very good speed & Pretime.
language: en-us
urls:
- https://pretome.info/
privacy: private
protocol: torrent
supports:
- irc
- rss
source: custom
settings:
- name: rsskey
type: secret
label: RSS key
help: "Copy your RSS key from the RSS feed"
regex: /([\da-fA-F]{32})
irc:
network: PreToMe
server: irc.pretome.info
port: 6697
tls: true
channels:
- "#announce"
announcers:
- PTMbot
settings:
- name: nickserv.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
type: secret
required: true
label: NickServ Password
help: NickServ password
parse:
type: single
lines:
- test:
- "tehFire: [Applications|Windows] Chen went to the Mall :: preGAP: 1m and 32s :: https://pretome.info/details.php?id=696969"
- "[Movies|x264] Orlando.Bloom.Had.A.Cow-ze0s :: preGAP: P2P source :: https://pretome.info/details.php?id=646321"
- "tehFIRE: [TV|XviD] Royal.Institution.Christmas.Lectures.2009.Part2.WS.PDTV.XviD-WATERS :: preGAP: 1m and 9s :: https://pretome.info/details.php?id=127107"
- "tehFIRE: [TV|x264] Newsreaders.S01E05.HDTV.x264-2HD https://pretome.info/details.php?id=333951"
pattern: '\[([^\]]+)\] ([^:]+)(?: :: [^:]+:.* :: )?(https?\:\/\/[^\/]+).*id=(\d+)'
vars:
- category
- torrentName
- baseUrl
- torrentId
match:
torrenturl: "{{ .baseUrl }}/download.php/{{ .torrentId }}/{{ .rsskey }}/{{ .torrentName }}.torrent"
encode:
- torrentName
---
#id: tracker69
name: PreToMe
identifier: pretome
description: PreToMe (PTM) is 0Day/General ratioless tracker with very good speed & Pretime.
language: en-us
urls:
- https://pretome.info/
privacy: private
protocol: torrent
supports:
- irc
- rss
source: custom
settings:
- name: rsskey
type: secret
required: true
label: RSS key
help: "Copy your RSS key from the RSS feed"
regex: /([\da-fA-F]{32})
irc:
network: PreToMe
server: irc.pretome.info
port: 6697
tls: true
channels:
- "#announce"
announcers:
- PTMbot
settings:
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password
help: NickServ password
parse:
type: single
lines:
- test:
- "tehFire: [Applications|Windows] Chen went to the Mall :: preGAP: 1m and 32s :: https://pretome.info/details.php?id=696969"
- "[Movies|x264] Orlando.Bloom.Had.A.Cow-ze0s :: preGAP: P2P source :: https://pretome.info/details.php?id=646321"
- "tehFIRE: [TV|XviD] Royal.Institution.Christmas.Lectures.2009.Part2.WS.PDTV.XviD-WATERS :: preGAP: 1m and 9s :: https://pretome.info/details.php?id=127107"
- "tehFIRE: [TV|x264] Newsreaders.S01E05.HDTV.x264-2HD https://pretome.info/details.php?id=333951"
pattern: '\[([^\]]+)\] ([^:]+)(?: :: [^:]+:.* :: )?(https?\:\/\/[^\/]+).*id=(\d+)'
vars:
- category
- torrentName
- baseUrl
- torrentId
match:
torrenturl: "{{ .baseUrl }}/download.php/{{ .torrentId }}/{{ .rsskey }}/{{ .torrentName }}.torrent"
encode:
- torrentName

View file

@ -16,18 +16,25 @@ source: gazelle
settings:
- name: authkey
type: secret
required: true
label: Auth key
help: Right click DL on a torrent and get the authkey.
- name: torrent_pass
type: secret
required: true
label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass.
- name: api_user
type: secret
required: true
label: API User
help: Edit profile -> Security -> Generate new api keys
- name: api_key
type: secret
required: true
label: API Key
help: Edit profile -> Security -> Generate new api keys
@ -57,22 +64,30 @@ irc:
announcers:
- Hummingbird
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user|autodl
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|autodl
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "Hummingbird ENTER USERNAME IRCKey #ptp-announce-dev"
default: "Hummingbird ENTER USERNAME IRCKEY #ptp-announce-dev"
required: true
label: Invite command
help: Invite auth with Hummingbird.
help: Invite auth with Hummingbird. Replace USERNAME and IRCKEY.
parse:
type: single

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: rsskey
type: secret
required: true
label: RSS key
help: "Copy your RSS key from the RSS feed"
regex: /([\da-fA-F]{20})
@ -29,12 +30,19 @@ irc:
announcers:
- _PussyBot_
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password

View file

@ -16,14 +16,19 @@ source: gazelle
settings:
- name: authkey
type: secret
required: true
label: Auth key
help: Right click DL on a torrent and get the authkey.
- name: torrent_pass
type: secret
required: true
label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass.
- name: api_key
type: secret
required: true
label: API Key
help: Settings -> Account Settings -> API Keys - Generate new api keys. Scope (User, Torrents)
@ -49,22 +54,30 @@ irc:
announcers:
- Drone
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user-autodl
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user-autodl
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "Drone enter #red-announce USERNAME IRCKey"
default: "Drone enter #red-announce USERNAME IRCKEY"
required: true
label: Invite command
help: Invite auth with Drone.
help: Invite auth with Drone. Replace USERNAME and IRCKEY.
parse:
type: single

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Go to User CP, User CP Home and copy the passkey"
@ -31,12 +32,19 @@ irc:
- retroflix-announcer2
- retroflix-announcer3
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Copy the passkey from a download link"
@ -28,16 +29,24 @@ irc:
announcers:
- RevoTT
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_autodl
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_autodl
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "RevoTT !invite USERNAME PASSKEY"

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Go to https://scenehd.org/getrss.php and extract your Passkey"
@ -28,12 +29,19 @@ irc:
announcers:
- SceneHD
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password
@ -41,10 +49,10 @@ irc:
- name: invite_command
type: secret
default: "SceneHD .invite <IRC_KEY> #annnonce"
default: "SceneHD .invite IRCKEY #annnonce"
required: true
label: Invite command
help: Invite auth with SceneHD. Replace <IRC_KEY> with your IRC key
help: Invite auth with SceneHD. Replace IRCKEY with your IRC key
parse:
type: single

View file

@ -14,6 +14,7 @@ source: unknown
settings:
- name: passkey
type: secret
required: true
label: PassKey
help: Copy the passkey from your profile
@ -27,12 +28,19 @@ irc:
announcers:
- speedapp-announcer
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your main user and bot.
- name: nickserv.password
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -23,12 +23,19 @@ irc:
announcers:
- "Katou"
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account.
- name: nickserv.password
help: NickServ account. Make sure to group your main user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -15,6 +15,7 @@ source: rartracker
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Copy the passkey from the /rss page."
@ -28,12 +29,19 @@ irc:
announcers:
- SuperBits
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user-bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user-bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: cookie
type: secret
required: true
label: Cookie
help: "Check how to get cookies in your browser and find the uid and pass cookies. Example: uid=1234; pass=asdf12347asdf13"
@ -28,16 +29,24 @@ irc:
announcers:
- ByteMe
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user-bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user-bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "erica letmeinannounce USERNAME IRCKEY"

View file

@ -1,60 +1,68 @@
---
#id: torrentday
name: TorrentDay
identifier: torrentday
description: TorrentDay (TD) is a private torrent tracker for GENERAL.
language: en-us
urls:
- https://www.torrentday.com
privacy: private
protocol: torrent
supports:
- irc
- rss
source: custom
settings:
- name: passkey
type: secret
label: Passkey
help: "Create a RSS Link to find out your PASSKEY"
irc:
network: TorrentDay
server: irc.torrentday.com
port: 6697
tls: true
channels:
- "#td.announce"
announcers:
- TD_Announce
settings:
- name: nickserv.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. username_autodl
- name: nickserv.password
type: secret
required: false
label: NickServ Password
help: NickServ password
parse:
type: single
lines:
- test:
- "[Movie/4K] This is a Movie 2160p UHD BluRay x265-TEST - https://www.torrentday.com/details.php?id=0000000 - 5.83 GB"
- "[Movie/4K] This is a Movie 2160p UHD BluRay x265-TEST FREELEECH - https://www.torrentday.com/details.php?id=0000000 - 5.83 GB"
pattern: '\[([^\]]*)] (.*?)\s*(FREELEECH)*\s*-\s+(https?\:\/\/[^\/]+).*[&\?]id=(\d+)\s*- (.*)'
vars:
- category
- torrentName
- freeleech
- baseUrl
- torrentId
- torrentSize
match:
torrenturl: "{{ .baseUrl }}/download.php/{{ .torrentId }}/{{ .torrentName }}.torrent?torrent_pass={{ .passkey }}"
encode:
- torrentName
---
#id: torrentday
name: TorrentDay
identifier: torrentday
description: TorrentDay (TD) is a private torrent tracker for GENERAL.
language: en-us
urls:
- https://www.torrentday.com
privacy: private
protocol: torrent
supports:
- irc
- rss
source: custom
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Create a RSS Link to find out your PASSKEY"
irc:
network: TorrentDay
server: irc.torrentday.com
port: 6697
tls: true
channels:
- "#td.announce"
announcers:
- TD_Announce
settings:
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_autodl
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password
help: NickServ password
parse:
type: single
lines:
- test:
- "[Movie/4K] This is a Movie 2160p UHD BluRay x265-TEST - https://www.torrentday.com/details.php?id=0000000 - 5.83 GB"
- "[Movie/4K] This is a Movie 2160p UHD BluRay x265-TEST FREELEECH - https://www.torrentday.com/details.php?id=0000000 - 5.83 GB"
pattern: '\[([^\]]*)] (.*?)\s*(FREELEECH)*\s*-\s+(https?\:\/\/[^\/]+).*[&\?]id=(\d+)\s*- (.*)'
vars:
- category
- torrentName
- freeleech
- baseUrl
- torrentId
- torrentSize
match:
torrenturl: "{{ .baseUrl }}/download.php/{{ .torrentId }}/{{ .torrentName }}.torrent?torrent_pass={{ .passkey }}"
encode:
- torrentName

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Go to your profile and copy the PID (passkey)"
@ -28,12 +29,19 @@ irc:
announcers:
- TDBot
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: rsskey
type: secret
required: true
label: RSS key
help: "Go to your profile and copy your RSS key"
regex: /([\da-fA-F]{20})
@ -29,12 +30,19 @@ irc:
announcers:
- _AnnounceBot_
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password

View file

@ -15,6 +15,7 @@ source: unknown
settings:
- name: passkey
type: secret
required: true
label: PassKey
help: "Home -> RSS -> Extract PassKey from URL"
@ -28,12 +29,19 @@ irc:
announcers:
- "|TN|"
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user|bot
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. E.g. user|bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -1,63 +1,72 @@
---
#id: TorrentSeeds
name: TorrentSeeds
identifier: torrentseeds
description: TorrentSeeds (TS) is a GENERAL/0-DAY tracker with great pretimes.
language: en-us
urls:
- https://torrentseeds.org
privacy: private
protocol: torrent
supports:
- irc
- rss
source: UNIT3D
settings:
- name: rsskey
type: secret
label: Rss key
help: "Click on your nick / Go to Security / Copy the RID (RSS Key) and paste it here."
irc:
network: Torrentseeds.org
server: irc.torrentseeds.org
port: 6697
tls: true
channels:
- "#announce"
announcers:
- torrentseeds
settings:
- name: nickserv.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
type: secret
required: false
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "Cerberus identify USERNAME IRCKEY"
required: true
label: Invite command
help: Invite auth with Cerberus. Replace USERNAME and IRCKEY
parse:
type: single
lines:
- test:
- "New: This.Is.A.New.show.S00E00.720p.WEB.H264-Test .:. Category: TV/HD .:. Size: 364.82 MB .:. URL: https://www.torrentseeds.org/details.php?id=000000 .:. Uploaded by: George."
pattern: 'New: (.*) \.:\. Category: (.*) \.:\. Size: (.*) \.:\. URL: (https?\:\/\/[^\/]+).*\/(\d{6,9}) \.:\. Uploaded by: (.*)\.'
vars:
- torrentName
- category
- torrentSize
- baseUrl
- torrentId
- uploader
match:
torrenturl: "{{ .baseUrl }}/torrent/download/{{ .torrentId }}.{{ .rsskey }}"
---
#id: TorrentSeeds
name: TorrentSeeds
identifier: torrentseeds
description: TorrentSeeds (TS) is a GENERAL/0-DAY tracker with great pretimes.
language: en-us
urls:
- https://torrentseeds.org
privacy: private
protocol: torrent
supports:
- irc
- rss
source: UNIT3D
settings:
- name: rsskey
type: secret
required: true
label: RSS key
help: "Click on your nick / Go to Settings / Security / Copy the RID (RSS Key) and paste it here."
irc:
network: Torrentseeds.org
server: irc.torrentseeds.org
port: 6697
tls: true
channels:
- "#announce"
announcers:
- torrentseeds
settings:
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "Cerberus identify USERNAME PID"
required: true
label: Invite command
help: Invite auth with Cerberus. Replace USERNAME and PID (passkey).
parse:
type: single
lines:
- test:
- "New: This.Is.A.New.show.S00E00.720p.WEB.H264-Test .:. Category: TV/HD .:. Size: 364.82 MB .:. URL: https://www.torrentseeds.org/details.php?id=000000 .:. Uploaded by: George."
pattern: 'New: (.*) \.:\. Category: (.*) \.:\. Size: (.*) \.:\. URL: (https?\:\/\/[^\/]+).*\/(\d{6,9}) \.:\. Uploaded by: (.*)\.'
vars:
- torrentName
- category
- torrentSize
- baseUrl
- torrentId
- uploader
match:
torrenturl: "{{ .baseUrl }}/torrent/download/{{ .torrentId }}.{{ .rsskey }}"

View file

@ -15,6 +15,7 @@ source: unknown
settings:
- name: api_key
type: secret
required: true
label: Api-Key
help: "Generate an apikey with download scope and copy it. Profileinstellungen -> API-Keys -> API-Key erzeugen"
@ -28,16 +29,24 @@ irc:
announcers:
- Synd1c4t3
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user-bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user-bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "Synd1c4t3 invite IRCKEY"

View file

@ -15,6 +15,7 @@ source: unknown
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Go to https://www.trancetraffic.com/links.php, click on RSS Feed and copy your passkey from the url."
@ -28,12 +29,19 @@ irc:
announcers:
- TranceTraffic
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user|autodl
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|autodl
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password

View file

@ -15,10 +15,13 @@ source: gazelle
settings:
- name: authkey
type: secret
required: true
label: Auth key
help: Right click DL on a torrent and get the authkey.
- name: torrent_pass
type: secret
required: true
label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass.
@ -33,22 +36,30 @@ irc:
- UHDBot
- cr0nusbot
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user|autodl
- name: auth.account
type: text
required: true
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user|autodl
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: true
label: NickServ Password
help: NickServ password
- name: invite_command
type: secret
default: "UHDBot invite IRCKey"
default: "UHDBot invite IRCKEY"
required: true
label: Invite command
help: Invite auth with UHDBot.
help: Invite auth with UHDBot. Replace IRCKEY.
parse:
type: single

View file

@ -15,6 +15,7 @@ source: custom
settings:
- name: passkey
type: secret
required: true
label: Passkey
help: "Go to your profile and copy your Passkey"
@ -28,12 +29,19 @@ irc:
announcers:
- Announce
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password

View file

@ -153,13 +153,10 @@ func (h *Handler) Run() error {
subLogger := zstdlog.NewStdLoggerWithLevel(h.log.With().Logger(), zerolog.TraceLevel)
h.client = &ircevent.Connection{
Nick: h.network.NickServ.Account,
User: h.network.NickServ.Account,
RealName: h.network.NickServ.Account,
Nick: h.network.Nick,
User: h.network.Auth.Account,
RealName: h.network.Auth.Account,
Password: h.network.Pass,
SASLLogin: h.network.NickServ.Account,
SASLPassword: h.network.NickServ.Password,
SASLOptional: true,
Server: addr,
KeepAlive: 4 * time.Minute,
Timeout: 2 * time.Minute,
@ -170,6 +167,15 @@ func (h *Handler) Run() error {
Log: subLogger,
}
if h.network.Auth.Mechanism == domain.IRCAuthMechanismSASLPlain {
if h.network.Auth.Account != "" && h.network.Auth.Password != "" {
h.client.SASLLogin = h.network.Auth.Account
h.client.SASLPassword = h.network.Auth.Password
h.client.SASLOptional = true
h.client.UseSASL = true
}
}
if h.network.TLS {
h.client.UseTLS = true
h.client.TLSConfig = &tls.Config{InsecureSkipVerify: true}
@ -226,7 +232,7 @@ func (h *Handler) Run() error {
func (h *Handler) isOurNick(nick string) bool {
h.m.RLock()
defer h.m.RUnlock()
return h.network.NickServ.Account == nick
return h.network.Nick == nick
}
func (h *Handler) isOurCurrentNick(nick string) bool {
@ -440,7 +446,7 @@ func (h *Handler) handleNickServ(msg ircmsg.Message) {
if contains(msg.Params[1], "invalid parameters", "help identify") {
h.log.Debug().Msgf("NOTICE nickserv invalid: %v", msg.Params)
if err := h.client.Send("PRIVMSG", "NickServ", fmt.Sprintf("IDENTIFY %v %v", h.network.NickServ.Account, h.network.NickServ.Password)); err != nil {
if err := h.client.Send("PRIVMSG", "NickServ", fmt.Sprintf("IDENTIFY %v %v", h.network.Auth.Account, h.network.Auth.Password)); err != nil {
return
}
}
@ -455,9 +461,9 @@ func (h *Handler) authenticate() bool {
return true
}
if !h.saslauthed && h.network.NickServ.Password != "" {
if !h.saslauthed && h.network.Auth.Password != "" {
h.log.Trace().Msg("on connect not authenticated and password not empty: send nickserv identify")
if err := h.NickServIdentify(h.network.NickServ.Password); err != nil {
if err := h.NickServIdentify(h.network.Auth.Password); err != nil {
h.log.Error().Stack().Err(err).Msg("error nickserv")
return false
}

View file

@ -88,7 +88,7 @@ func (s *service) StartHandlers() {
// use network.Server + nick to use multiple indexers with different nick per network
// this allows for multiple handlers to one network
s.handlers[handlerKey{network.Server, network.NickServ.Account}] = handler
s.handlers[handlerKey{network.Server, network.Nick}] = handler
s.lock.Unlock()
s.log.Debug().Msgf("starting network: %+v", network.Name)
@ -112,7 +112,7 @@ func (s *service) StopHandlers() {
func (s *service) startNetwork(network domain.IrcNetwork) error {
// look if we have the network in handlers already, if so start it
if existingHandler, found := s.handlers[handlerKey{network.Server, network.NickServ.Account}]; found {
if existingHandler, found := s.handlers[handlerKey{network.Server, network.Nick}]; found {
s.log.Debug().Msgf("starting network: %+v", network.Name)
if !existingHandler.client.Connected() {
@ -138,7 +138,7 @@ func (s *service) startNetwork(network domain.IrcNetwork) error {
// init new irc handler
handler := NewHandler(s.log, network, definitions, s.releaseService, s.notificationService)
s.handlers[handlerKey{network.Server, network.NickServ.Account}] = handler
s.handlers[handlerKey{network.Server, network.Nick}] = handler
s.lock.Unlock()
s.log.Debug().Msgf("starting network: %+v", network.Name)
@ -155,7 +155,7 @@ func (s *service) startNetwork(network domain.IrcNetwork) error {
func (s *service) checkIfNetworkRestartNeeded(network *domain.IrcNetwork) error {
// look if we have the network in handlers, if so restart it
if existingHandler, found := s.handlers[handlerKey{network.Server, network.NickServ.Account}]; found {
if existingHandler, found := s.handlers[handlerKey{network.Server, network.Nick}]; found {
s.log.Debug().Msgf("irc: decide if irc network handler needs restart or updating: %+v", network.Server)
// if server, tls, invite command, port : changed - restart
@ -192,17 +192,17 @@ func (s *service) checkIfNetworkRestartNeeded(network *domain.IrcNetwork) error
return nil
}
if handler.NickServ.Account != network.NickServ.Account {
if handler.Nick != network.Nick {
s.log.Debug().Msg("changing nick")
if err := existingHandler.NickChange(network.NickServ.Account); err != nil {
s.log.Error().Stack().Err(err).Msgf("failed to change nick %q", network.NickServ.Account)
if err := existingHandler.NickChange(network.Nick); err != nil {
s.log.Error().Stack().Err(err).Msgf("failed to change nick %q", network.Nick)
}
} else if handler.NickServ.Password != network.NickServ.Password {
} else if handler.Auth.Password != network.Auth.Password {
s.log.Debug().Msg("nickserv: changing password")
if err := existingHandler.NickServIdentify(network.NickServ.Password); err != nil {
s.log.Error().Stack().Err(err).Msgf("failed to identify with nickserv %q", network.NickServ.Account)
if err := existingHandler.NickServIdentify(network.Auth.Password); err != nil {
s.log.Error().Stack().Err(err).Msgf("failed to identify with nickserv %q", network.Nick)
}
}
@ -291,7 +291,7 @@ func (s *service) RestartNetwork(ctx context.Context, id int64) error {
func (s *service) restartNetwork(network domain.IrcNetwork) error {
// look if we have the network in handlers, if so restart it
if existingHandler, found := s.handlers[handlerKey{network.Server, network.NickServ.Account}]; found {
if existingHandler, found := s.handlers[handlerKey{network.Server, network.Nick}]; found {
s.log.Info().Msgf("restarting network: %v", network.Name)
if existingHandler.client.Connected() {
@ -396,14 +396,15 @@ func (s *service) GetNetworksWithHealth(ctx context.Context) ([]domain.IrcNetwor
Port: n.Port,
TLS: n.TLS,
Pass: n.Pass,
Nick: n.Nick,
Auth: n.Auth,
InviteCommand: n.InviteCommand,
NickServ: n.NickServ,
Connected: false,
Channels: []domain.ChannelWithHealth{},
ConnectionErrors: []string{},
}
handler, ok := s.handlers[handlerKey{n.Server, n.NickServ.Account}]
handler, ok := s.handlers[handlerKey{n.Server, n.Nick}]
if ok {
handler.m.RLock()
@ -484,7 +485,7 @@ func (s *service) DeleteNetwork(ctx context.Context, id int64) error {
// Remove network and handler
//if err = s.StopNetwork(network.Server); err != nil {
if err = s.StopAndRemoveNetwork(handlerKey{network.Server, network.NickServ.Account}); err != nil {
if err = s.StopAndRemoveNetwork(handlerKey{network.Server, network.Nick}); err != nil {
s.log.Error().Stack().Err(err).Msgf("could not stop and delete network: %v", network.Name)
return err
}
@ -524,7 +525,7 @@ func (s *service) UpdateNetwork(ctx context.Context, network *domain.IrcNetwork)
} else {
// take into account multiple channels per network
err := s.StopAndRemoveNetwork(handlerKey{network.Server, network.NickServ.Account})
err := s.StopAndRemoveNetwork(handlerKey{network.Server, network.Nick})
if err != nil {
s.log.Error().Stack().Err(err).Msgf("could not stop network: %+v", network.Name)
return errors.New("could not stop network: %v", network.Name)

View file

@ -29,12 +29,19 @@ irc:
announcers:
- _AnnounceBot_
settings:
- name: nickserv.account
- name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. user_bot
- name: nickserv.password
help: NickServ account. Make sure to group your user and bot.
- name: auth.password
type: secret
required: false
label: NickServ Password

View file

@ -1,4 +1,4 @@
import type { FieldProps } from "formik";
import type { FieldProps, FieldValidator } from "formik";
import { Field } from "formik";
import { classNames } from "../../utils";
import { useToggle } from "../../hooks/hooks";
@ -14,6 +14,7 @@ interface TextFieldWideProps {
defaultValue?: string;
required?: boolean;
hidden?: boolean;
validate?: FieldValidator;
}
export const TextFieldWide = ({
@ -23,7 +24,8 @@ export const TextFieldWide = ({
placeholder,
defaultValue,
required,
hidden
hidden,
validate
}: TextFieldWideProps) => (
<div hidden={hidden} className="space-y-1 p-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4">
<div>
@ -36,6 +38,7 @@ export const TextFieldWide = ({
name={name}
value={defaultValue}
required={required}
validate={validate}
>
{({ field, meta }: FieldProps) => (
<input
@ -66,6 +69,7 @@ interface PasswordFieldWideProps {
help?: string;
required?: boolean;
defaultVisible?: boolean;
validate?: FieldValidator;
}
export const PasswordFieldWide = ({
@ -75,7 +79,8 @@ export const PasswordFieldWide = ({
defaultValue,
help,
required,
defaultVisible
defaultVisible,
validate
}: PasswordFieldWideProps) => {
const [isVisible, toggleVisibility] = useToggle(defaultVisible);
@ -90,6 +95,7 @@ export const PasswordFieldWide = ({
<Field
name={name}
defaultValue={defaultValue}
validate={validate}
>
{({ field, meta }: FieldProps) => (
<div className="relative">

View file

@ -306,6 +306,21 @@ export const NotificationTypeOptions: OptionBasicTyped<NotificationType>[] = [
}
];
export const IrcAuthMechanismTypeOptions: OptionBasicTyped<IrcAuthMechanism>[] = [
{
label: "None",
value: "NONE"
},
{
label: "SASL (plain)",
value: "SASL_PLAIN"
},
{
label: "NickServ",
value: "NICKSERV"
}
];
export const downloadsPerUnitOptions: OptionBasic[] = [
{
label: "Select",

View file

@ -2,7 +2,7 @@ import { Fragment, useState } from "react";
import { toast } from "react-hot-toast";
import { useMutation, useQuery } from "react-query";
import Select, { components, ControlProps, InputProps, MenuProps, OptionProps } from "react-select";
import type { FieldProps } from "formik";
import type { FieldProps, FormikErrors } from "formik";
import { Field, Form, Formik, FormikValues } from "formik";
import { XMarkIcon } from "@heroicons/react/24/solid";
@ -16,46 +16,53 @@ import { PasswordFieldWide, SwitchGroupWide, TextFieldWide } from "../../compone
import { SlideOver } from "../../components/panels";
import Toast from "../../components/notifications/Toast";
const Input = (props: InputProps) => {
return (
<components.Input
{...props}
inputClassName="outline-none border-none shadow-none focus:ring-transparent"
className="text-gray-400 dark:text-gray-100"
children={props.children}
/>
);
};
const Input = (props: InputProps) => (
<components.Input
{...props}
inputClassName="outline-none border-none shadow-none focus:ring-transparent"
className="text-gray-400 dark:text-gray-100"
children={props.children}
/>
);
const Control = (props: ControlProps) => {
return (
<components.Control
{...props}
className="block w-full dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:text-gray-100 sm:text-sm"
children={props.children}
/>
);
};
const Control = (props: ControlProps) => (
<components.Control
{...props}
className="p-1 block w-full dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:text-gray-100 sm:text-sm"
children={props.children}
/>
);
const Menu = (props: MenuProps) => {
return (
<components.Menu
{...props}
className="dark:bg-gray-800 border border-gray-300 dark:border-gray-700 dark:text-gray-400 rounded-md shadow-sm"
children={props.children}
/>
);
};
const Menu = (props: MenuProps) => (
<components.Menu
{...props}
className="dark:bg-gray-800 border border-gray-300 dark:border-gray-700 dark:text-gray-400 rounded-md shadow-sm cursor-pointer"
children={props.children}
/>
);
const Option = (props: OptionProps) => {
return (
<components.Option
{...props}
className="dark:text-gray-400 dark:bg-gray-800 dark:hover:bg-gray-900 dark:focus:bg-gray-900"
children={props.children}
/>
);
};
const Option = (props: OptionProps) => (
<components.Option
{...props}
className="dark:text-gray-400 dark:bg-gray-800 dark:hover:bg-gray-900 dark:focus:bg-gray-900 cursor-pointer"
children={props.children}
/>
);
// const isRequired = (message: string) => (value?: string | undefined) => (!!value ? undefined : message);
function validateField(s: IndexerSetting) {
return (value?: string | undefined) => {
if (s.required) {
if (s.default !== "") {
if (value && s.default === value) {
return "Default value, please edit";
}
}
return !!value ? undefined : "Required";
}
};
}
const IrcSettingFields = (ind: IndexerDefinition, indexer: string) => {
if (indexer !== "") {
@ -66,18 +73,19 @@ const IrcSettingFields = (ind: IndexerDefinition, indexer: string) => {
<div className="px-4 space-y-1">
<Dialog.Title className="text-lg font-medium text-gray-900 dark:text-white">IRC</Dialog.Title>
<p className="text-sm text-gray-500 dark:text-gray-200">
Networks, channels and invite commands are configured automatically.
Networks and channels are configured automatically in the background.
</p>
</div>
{ind.irc.settings.map((f: IndexerSetting, idx: number) => {
switch (f.type) {
case "text":
return <TextFieldWide name={`irc.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} />;
return <TextFieldWide name={`irc.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} validate={validateField(f)} />;
case "secret":
if (f.name === "invite_command") {
return <PasswordFieldWide name={`irc.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} defaultVisible={true} defaultValue={f.default} />;
return <PasswordFieldWide name={`irc.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} defaultVisible={true} defaultValue={f.default} validate={validateField(f)} />;
}
return <PasswordFieldWide name={`irc.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} defaultValue={f.default} />;
return <PasswordFieldWide name={`irc.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} defaultValue={f.default} validate={validateField(f)} />;
}
return null;
})}
@ -101,14 +109,14 @@ const FeedSettingFields = (ind: IndexerDefinition, indexer: string) => {
</p>
</div>
<TextFieldWide name="name" label="Name" defaultValue={""} />
<TextFieldWide name="name" label="Name" defaultValue="" />
{ind.torznab.settings.map((f: IndexerSetting, idx: number) => {
switch (f.type) {
case "text":
return <TextFieldWide name={`feed.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} />;
return <TextFieldWide name={`feed.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} validate={validateField(f)} />;
case "secret":
return <PasswordFieldWide name={`feed.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} defaultValue={f.default} />;
return <PasswordFieldWide name={`feed.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} defaultValue={f.default} validate={validateField(f)} />;
}
return null;
})}
@ -132,14 +140,14 @@ const RSSFeedSettingFields = (ind: IndexerDefinition, indexer: string) => {
</p>
</div>
<TextFieldWide name="name" label="Name" defaultValue={""} />
<TextFieldWide name="name" label="Name" defaultValue="" />
{ind.rss.settings.map((f: IndexerSetting, idx: number) => {
switch (f.type) {
case "text":
return <TextFieldWide name={`feed.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} />;
return <TextFieldWide name={`feed.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} validate={validateField(f)} />;
case "secret":
return <PasswordFieldWide name={`feed.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} defaultValue={f.default} />;
return <PasswordFieldWide name={`feed.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} defaultValue={f.default} validate={validateField(f)} />;
}
return null;
})}
@ -158,11 +166,11 @@ const SettingFields = (ind: IndexerDefinition, indexer: string) => {
switch (f.type) {
case "text":
return (
<TextFieldWide name={`settings.${f.name}`} label={f.label} key={idx} help={f.help} defaultValue="" />
<TextFieldWide name={`settings.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} validate={validateField(f)} />
);
case "secret":
return (
<PasswordFieldWide name={`settings.${f.name}`} label={f.label} key={idx} help={f.help} defaultValue="" />
<PasswordFieldWide name={`settings.${f.name}`} label={f.label} required={f.required} key={idx} help={f.help} validate={validateField(f)} />
);
}
return null;
@ -184,24 +192,14 @@ function slugIdentifier(name: string, prefix?: string) {
return slugify(l);
}
// interface initialValues {
// enabled: boolean;
// identifier: string;
// implementation: string;
// name: string;
// irc?: Record<string, unknown>;
// feed?: Record<string, unknown>;
// settings?: Record<string, unknown>;
// }
type SelectValue = {
label: string;
value: string;
};
interface AddProps {
isOpen: boolean;
toggle: () => void;
isOpen: boolean;
toggle: () => void;
}
export function IndexerAddForm({ isOpen, toggle }: AddProps) {
@ -238,6 +236,7 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
);
const onSubmit = (formData: FormikValues) => {
console.log("form: ", formData);
const ind = data && data.find(i => i.identifier === formData.identifier);
if (!ind)
return;
@ -319,11 +318,22 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
server: ind.irc.server,
port: ind.irc.port,
tls: ind.irc.tls,
nickserv: formData.irc.nickserv,
nick: formData.irc.nick,
auth: {
mechanism: "NONE"
// account: formData.irc.auth.account,
// password: formData.irc.auth.password
},
invite_command: formData.irc.invite_command,
channels: channels
};
if (formData.irc.auth.account !== "" && formData.irc.auth.password !== "") {
network.auth.mechanism = "SASL_PLAIN";
network.auth.account = formData.irc.auth.account;
network.auth.password = formData.irc.auth.password;
}
mutation.mutate(formData as Indexer, {
onSuccess: () => {
ircMutation.mutate(network);
@ -356,9 +366,7 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
identifier: "",
implementation: "irc",
name: "",
irc: {
invite_command: ""
},
irc: {},
settings: {}
}}
onSubmit={onSubmit}
@ -369,11 +377,11 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
<div className="px-4 py-6 bg-gray-50 dark:bg-gray-900 sm:px-6">
<div className="flex items-start justify-between space-x-3">
<div className="space-y-1">
<Dialog.Title
className="text-lg font-medium text-gray-900 dark:text-white">Add
indexer</Dialog.Title>
<Dialog.Title className="text-lg font-medium text-gray-900 dark:text-white">
Add indexer
</Dialog.Title>
<p className="text-sm text-gray-500 dark:text-gray-200">
Add indexer.
Add indexer.
</p>
</div>
<div className="h-7 flex items-center">
@ -425,19 +433,21 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
onChange={(option: unknown) => {
resetForm();
const opt = option as SelectValue;
setFieldValue("name", opt.label ?? "");
setFieldValue(field.name, opt.value ?? "");
if (option != null) {
const opt = option as SelectValue;
setFieldValue("name", opt.label ?? "");
setFieldValue(field.name, opt.value ?? "");
const ind = data && data.find(i => i.identifier === opt.value);
if (ind) {
setIndexer(ind);
setFieldValue("implementation", ind.implementation);
const ind = data && data.find(i => i.identifier === opt.value);
if (ind) {
setIndexer(ind);
setFieldValue("implementation", ind.implementation);
if (ind.irc && ind.irc.settings) {
ind.irc.settings.forEach((s) => {
setFieldValue(`irc.${s.name}`, s.default ?? "");
});
if (ind.irc && ind.irc.settings) {
ind.irc.settings.forEach((s) => {
setFieldValue(`irc.${s.name}`, s.default ?? "");
});
}
}
}
}}
@ -471,13 +481,13 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
className="bg-white dark:bg-gray-700 py-2 px-4 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm text-sm font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 dark:focus:ring-blue-500"
onClick={toggle}
>
Cancel
Cancel
</button>
<button
type="submit"
className="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-blue-600 dark:bg-blue-600 hover:bg-blue-700 dark:hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 dark:focus:ring-blue-500"
>
Save
Save
</button>
</div>
</div>
@ -517,6 +527,8 @@ export function IndexerUpdateForm({ isOpen, toggle, indexer }: UpdateProps) {
onSuccess: () => {
queryClient.invalidateQueries(["indexer"]);
toast.custom((t) => <Toast type="success" body={`${indexer.name} was deleted.`} t={t} />);
toggle();
}
});

View file

@ -87,7 +87,8 @@ interface IrcNetworkAddFormValues {
port: number;
tls: boolean;
pass: string;
nickserv: NickServ;
nick: string;
auth: IrcAuth;
channels: IrcChannel[];
}
@ -114,6 +115,7 @@ export function IrcNetworkAddForm({ isOpen, toggle }: AddFormProps) {
const onSubmit = (data: unknown) => {
mutation.mutate(data as IrcNetwork);
};
const validate = (values: FormikValues) => {
const errors = {} as FormikErrors<FormikValues>;
if (!values.name)
@ -125,8 +127,11 @@ export function IrcNetworkAddForm({ isOpen, toggle }: AddFormProps) {
if (!values.server)
errors.server = "Required";
if (!values.nickserv || !values.nickserv.account)
errors.nickserv = { account: "Required" };
if (!values.nick)
errors.nick = "Required";
// if (!values.auth || !values.auth.account)
// errors.auth = { account: "Required" };
return errors;
};
@ -138,7 +143,9 @@ export function IrcNetworkAddForm({ isOpen, toggle }: AddFormProps) {
port: 6667,
tls: false,
pass: "",
nickserv: {
nick: "",
auth: {
mechanism: "SASL_PLAIN",
account: ""
},
channels: []
@ -185,14 +192,20 @@ export function IrcNetworkAddForm({ isOpen, toggle }: AddFormProps) {
help="Network password"
/>
<TextFieldWide
name="nickserv.account"
label="NickServ Account"
placeholder="NickServ Account"
name="nick"
label="Nick"
placeholder="bot nick"
required={true}
/>
<TextFieldWide
name="auth.account"
label="Auth Account"
placeholder="Auth Account"
required={true}
/>
<PasswordFieldWide
name="nickserv.password"
label="NickServ Password"
name="auth.password"
label="Auth Password"
/>
<PasswordFieldWide name="invite_command" label="Invite command" />
@ -210,8 +223,9 @@ interface IrcNetworkUpdateFormValues {
server: string;
port: number;
tls: boolean;
nickserv?: NickServ;
pass: string;
nick: string;
auth?: IrcAuth;
invite_command: string;
channels: Array<IrcChannel>;
}
@ -245,6 +259,7 @@ export function IrcNetworkUpdateForm({
});
const onSubmit = (data: unknown) => {
console.log("submit: ", data);
mutation.mutate(data as IrcNetwork);
};
@ -263,10 +278,8 @@ export function IrcNetworkUpdateForm({
errors.port = "Required";
}
if (!values.nickserv?.account) {
errors.nickserv = {
account: "Required"
};
if (!values.nick) {
errors.nick = "Required";
}
return errors;
@ -283,10 +296,11 @@ export function IrcNetworkUpdateForm({
server: network.server,
port: network.port,
tls: network.tls,
nickserv: network.nickserv,
nick: network.nick,
pass: network.pass,
channels: network.channels,
invite_command: network.invite_command
auth: network.auth,
invite_command: network.invite_command,
channels: network.channels
};
return (
@ -328,19 +342,44 @@ export function IrcNetworkUpdateForm({
<PasswordFieldWide
name="pass"
label="Password"
help="Network password"
help="Network password, not commonly used."
/>
<TextFieldWide
name="nickserv.account"
label="NickServ Account"
placeholder="NickServ Account"
name="nick"
label="Nick"
placeholder="nick"
required={true}
/>
<PasswordFieldWide
name="nickserv.password"
label="NickServ Password"
/>
<div className="border-t border-gray-200 dark:border-gray-700 py-5">
<div className="px-4 space-y-1 mb-8">
<Dialog.Title className="text-lg font-medium text-gray-900 dark:text-white">Identification</Dialog.Title>
<p className="text-sm text-gray-500 dark:text-gray-400">
Identify with SASL or NickServ. Most networks support SASL but some don't.
</p>
</div>
<SelectField<IrcAuthMechanism>
name="auth.mechanism"
label="Mechanism"
options={IrcAuthMechanismTypeOptions}
/>
<TextFieldWide
name="auth.account"
label="Account"
placeholder="Auth Account"
help="NickServ / SASL account. For grouped nicks try the main."
/>
<PasswordFieldWide
name="auth.password"
label="Password"
help="NickServ / SASL password."
/>
</div>
<PasswordFieldWide name="invite_command" label="Invite command" />
@ -349,4 +388,118 @@ export function IrcNetworkUpdateForm({
)}
</SlideOver>
);
}
}
interface SelectFieldProps<T> {
name: string;
label: string;
options: OptionBasicTyped<T>[]
}
function SelectField<T>({ name, label, options }: SelectFieldProps<T>) {
return (
<div className="flex items-center justify-between space-y-1 px-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4">
<div>
<label
htmlFor={name}
className="block text-sm font-medium text-gray-900 dark:text-white"
>
{label}
</label>
</div>
<div className="sm:col-span-2">
<Field name={name} type="select">
{({
field,
form: { setFieldValue, resetForm }
}: FieldProps) => (
<Select
{...field}
id={name}
isClearable={true}
isSearchable={true}
components={{
Input,
Control,
Menu,
Option
}}
placeholder="Choose a type"
styles={{
singleValue: (base) => ({
...base,
color: "unset"
})
}}
theme={(theme) => ({
...theme,
spacing: {
...theme.spacing,
controlHeight: 30,
baseUnit: 2
}
})}
value={field?.value && options.find(o => o.value == field?.value)}
onChange={(option) => {
resetForm();
// const opt = option as SelectOption;
// setFieldValue("name", option?.label ?? "")
setFieldValue(
field.name,
option.value ?? ""
);
}}
options={options}
/>
)}
</Field>
</div>
</div>
);
}
import Select, { components, ControlProps, InputProps, MenuProps, OptionProps } from "react-select";
import { IrcAuthMechanismTypeOptions, OptionBasicTyped } from "../../domain/constants";
import { Dialog } from "@headlessui/react";
const Input = (props: InputProps) => {
return (
<components.Input
{...props}
inputClassName="outline-none border-none shadow-none focus:ring-transparent"
className="text-gray-400 dark:text-gray-100"
children={props.children}
/>
);
};
const Control = (props: ControlProps) => {
return (
<components.Control
{...props}
className="p-1 block w-full dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 dark:text-gray-100 sm:text-sm"
children={props.children}
/>
);
};
const Menu = (props: MenuProps) => {
return (
<components.Menu
{...props}
className="dark:bg-gray-800 border border-gray-300 dark:border-gray-700 dark:text-gray-400 rounded-md shadow-sm"
children={props.children}
/>
);
};
const Option = (props: OptionProps) => {
return (
<components.Option
{...props}
className="dark:text-gray-400 dark:bg-gray-800 dark:hover:bg-gray-900 dark:focus:bg-gray-900"
children={props.children}
/>
);
};

View file

@ -208,18 +208,14 @@ const ListItem = ({ idx, network, expanded }: ListItemProps) => {
</p>
</div>
</div>
{network.nickserv && network.nickserv.account ? (
<div
className="hidden sm:flex col-span-3 items-center sm:px-6 text-sm text-gray-500 dark:text-gray-400 cursor-pointer"
onClick={toggleEdit}
>
<div className="overflow-x-auto flex">
{network.nickserv.account}
</div>
<div
className="hidden sm:flex col-span-3 items-center sm:px-6 text-sm text-gray-500 dark:text-gray-400 cursor-pointer"
onClick={toggleEdit}
>
<div className="overflow-x-auto flex">
{network.nick}
</div>
) : (
<div className="col-span-3" />
)}
</div>
<div className="col-span-1 text-sm text-gray-500 dark:text-gray-400">
<ListItemDropdown network={network} toggleUpdate={toggleUpdate} />
</div>
@ -311,6 +307,8 @@ const ListItemDropdown = ({
queryClient.invalidateQueries(["networks", network.id]);
toast.custom((t) => <Toast type="success" body={`Network ${network.name} was deleted`} t={t}/>);
toggleDeleteModal();
}
}
);

View file

@ -5,9 +5,10 @@ interface IrcNetwork {
server: string;
port: number;
tls: boolean;
nick: string;
pass: string;
auth: IrcAuth; // optional
invite_command: string;
nickserv?: NickServ; // optional
channels: IrcChannel[];
connected: boolean;
connected_since: string;
@ -20,8 +21,9 @@ interface IrcNetworkCreate {
port: number;
tls: boolean;
pass: string;
nick: string;
auth: IrcAuth; // optional
invite_command: string;
nickserv?: NickServ; // optional
channels: IrcChannel[];
connected: boolean;
}
@ -48,8 +50,9 @@ interface IrcNetworkWithHealth {
port: number;
tls: boolean;
pass: string;
nick: string;
auth: IrcAuth; // optional
invite_command: string;
nickserv?: NickServ; // optional
channels: IrcChannelWithHealth[];
connected: boolean;
connected_since: string;
@ -57,7 +60,10 @@ interface IrcNetworkWithHealth {
healthy: boolean;
}
interface NickServ {
type IrcAuthMechanism = "NONE" | "SASL_PLAIN" | "NICKSERV";
interface IrcAuth {
mechanism: IrcAuthMechanism; // optional
account?: string; // optional
password?: string; // optional
}