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

View file

@ -36,14 +36,16 @@ CREATE TABLE irc_network
port INTEGER NOT NULL, port INTEGER NOT NULL,
tls BOOLEAN, tls BOOLEAN,
pass TEXT, pass TEXT,
nick TEXT,
auth_mechanism TEXT,
auth_account TEXT,
auth_password TEXT,
invite_command TEXT, invite_command TEXT,
nickserv_account TEXT,
nickserv_password TEXT,
connected BOOLEAN, connected BOOLEAN,
connected_since TIMESTAMP, connected_since TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE (server, port, nickserv_account) UNIQUE (server, port, nick)
); );
CREATE TABLE irc_channel CREATE TABLE irc_channel
@ -589,4 +591,28 @@ CREATE INDEX indexer_identifier_index
ALTER TABLE filter ALTER TABLE filter
ADD COLUMN use_regex_release_tags BOOLEAN DEFAULT FALSE; 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, port INTEGER NOT NULL,
tls BOOLEAN, tls BOOLEAN,
pass TEXT, pass TEXT,
nick TEXT,
auth_mechanism TEXT,
auth_account TEXT,
auth_password TEXT,
invite_command TEXT, invite_command TEXT,
nickserv_account TEXT,
nickserv_password TEXT,
connected BOOLEAN, connected BOOLEAN,
connected_since TIMESTAMP, connected_since TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE (server, port, nickserv_account) UNIQUE (server, port, nick)
); );
CREATE TABLE irc_channel CREATE TABLE irc_channel
@ -909,4 +911,52 @@ CREATE INDEX indexer_identifier_index
ALTER TABLE filter ALTER TABLE filter
ADD COLUMN use_regex_release_tags BOOLEAN DEFAULT FALSE; 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,7 +14,16 @@ type IrcChannel struct {
Monitoring bool `json:"monitoring"` Monitoring bool `json:"monitoring"`
} }
type NickServ struct { 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"` Account string `json:"account,omitempty"`
Password string `json:"password,omitempty"` Password string `json:"password,omitempty"`
} }
@ -27,8 +36,9 @@ type IrcNetwork struct {
Port int `json:"port"` Port int `json:"port"`
TLS bool `json:"tls"` TLS bool `json:"tls"`
Pass string `json:"pass"` Pass string `json:"pass"`
Nick string `json:"nick"`
Auth IRCAuth `json:"auth,omitempty"`
InviteCommand string `json:"invite_command"` InviteCommand string `json:"invite_command"`
NickServ NickServ `json:"nickserv,omitempty"`
Channels []IrcChannel `json:"channels"` Channels []IrcChannel `json:"channels"`
Connected bool `json:"connected"` Connected bool `json:"connected"`
ConnectedSince *time.Time `json:"connected_since"` ConnectedSince *time.Time `json:"connected_since"`
@ -42,8 +52,9 @@ type IrcNetworkWithHealth struct {
Port int `json:"port"` Port int `json:"port"`
TLS bool `json:"tls"` TLS bool `json:"tls"`
Pass string `json:"pass"` Pass string `json:"pass"`
Nick string `json:"nick"`
Auth IRCAuth `json:"auth,omitempty"`
InviteCommand string `json:"invite_command"` InviteCommand string `json:"invite_command"`
NickServ NickServ `json:"nickserv,omitempty"`
CurrentNick string `json:"current_nick"` CurrentNick string `json:"current_nick"`
PreferredNick string `json:"preferred_nick"` PreferredNick string `json:"preferred_nick"`
Channels []ChannelWithHealth `json:"channels"` Channels []ChannelWithHealth `json:"channels"`

View file

@ -15,11 +15,14 @@ source: custom
settings: settings:
- name: passkey - name: passkey
type: secret type: secret
required: true
label: Pass key label: Pass key
help: "Your passkey" help: "Your passkey"
regex: /([\da-z]{32}) regex: /([\da-z]{32})
- name: uid - name: uid
type: secret type: secret
required: true
label: User ID label: User ID
help: "Your User ID" help: "Your User ID"
regex: /(\d+) regex: /(\d+)
@ -34,12 +37,19 @@ irc:
announcers: announcers:
- ACiD-BaBy - ACiD-BaBy
settings: settings:
- name: nickserv.account - name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text type: text
required: true required: true
label: NickServ Account 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 type: secret
required: true required: true
label: NickServ Password label: NickServ Password

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -15,6 +15,7 @@ source: custom
settings: settings:
- name: rsskey - name: rsskey
type: secret type: secret
required: true
label: RSS key label: RSS key
help: "Go to My Panel and then Change PID. It will show the PID, but don't click it!" 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: announcers:
- hdspace - hdspace
settings: settings:
- name: nickserv.account - name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text type: text
required: false required: false
label: NickServ Account 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 type: secret
required: false required: false
label: NickServ Password label: NickServ Password

View file

@ -16,10 +16,12 @@ source: xbtit
settings: settings:
- name: key - name: key
type: secret type: secret
required: true
label: RSS key label: RSS key
help: "Generate a RSS feed and copy key from URL" help: "Generate a RSS feed and copy key from URL"
- name: token - name: token
type: secret type: secret
required: true
label: RSS Token label: RSS Token
help: "Generate a RSS feed and copy token from URL" help: "Generate a RSS feed and copy token from URL"
@ -33,12 +35,19 @@ irc:
announcers: announcers:
- HoboLarry - HoboLarry
settings: settings:
- name: nickserv.account - name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user-bot
- name: auth.account
type: text type: text
required: true required: true
label: NickServ Account 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 type: secret
required: true required: true
label: NickServ Password label: NickServ Password

View file

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

View file

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

View file

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

View file

@ -15,6 +15,7 @@ source: custom
settings: settings:
- name: passkey - name: passkey
type: secret type: secret
required: true
label: Passkey label: Passkey
help: "Go to your profile and copy your passkey" help: "Go to your profile and copy your passkey"
@ -28,12 +29,19 @@ irc:
announcers: announcers:
- Metal - Metal
settings: settings:
- name: nickserv.account - name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text type: text
required: true required: true
label: NickServ Account 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 type: secret
required: true required: true
label: NickServ Password label: NickServ Password

View file

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

View file

@ -15,6 +15,7 @@ source: custom
settings: settings:
- name: apikey - name: apikey
type: secret type: secret
required: true
label: Api key label: Api key
help: "Go to your profile and copy your Api key from settings" help: "Go to your profile and copy your Api key from settings"
regex: /([a-zA-Z0-9\+]) regex: /([a-zA-Z0-9\+])
@ -31,12 +32,19 @@ irc:
- the_cow1 - the_cow1
- the_cow2 - the_cow2
settings: settings:
- name: nickserv.account - name: nick
type: text type: text
required: true required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account 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 type: secret
required: false required: false
label: NickServ Password label: NickServ Password

View file

@ -15,10 +15,13 @@ source: gazelle
settings: settings:
- name: authkey - name: authkey
type: secret type: secret
required: true
label: Auth key label: Auth key
help: Right click DL on a torrent and get the authkey. help: Right click DL on a torrent and get the authkey.
- name: torrent_pass - name: torrent_pass
type: secret type: secret
required: true
label: Torrent pass label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass. help: Right click DL on a torrent and get the torrent_pass.
@ -32,12 +35,19 @@ irc:
announcers: announcers:
- Jarvis - Jarvis
settings: settings:
- name: nickserv.account - name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text type: text
required: true required: true
label: NickServ Account 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 type: secret
required: true required: true
label: NickServ Password label: NickServ Password

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -15,10 +15,13 @@ source: gazelle
settings: settings:
- name: authkey - name: authkey
type: secret type: secret
required: true
label: Auth key label: Auth key
help: Right click DL on a torrent and get the authkey. help: Right click DL on a torrent and get the authkey.
- name: torrent_pass - name: torrent_pass
type: secret type: secret
required: true
label: Torrent pass label: Torrent pass
help: Right click DL on a torrent and get the torrent_pass. help: Right click DL on a torrent and get the torrent_pass.
@ -32,12 +35,19 @@ irc:
announcers: announcers:
- "PB-Announcer" - "PB-Announcer"
settings: settings:
- name: nickserv.account - name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text type: text
required: true required: true
label: NickServ Account 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 type: secret
required: true required: true
label: NickServ Password label: NickServ Password

View file

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

View file

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

View file

@ -15,6 +15,7 @@ source: custom
settings: settings:
- name: rsskey - name: rsskey
type: secret type: secret
required: true
label: RSS key label: RSS key
help: "Copy your RSS key from the RSS feed" help: "Copy your RSS key from the RSS feed"
regex: /([\da-fA-F]{32}) regex: /([\da-fA-F]{32})
@ -29,12 +30,19 @@ irc:
announcers: announcers:
- PTMbot - PTMbot
settings: settings:
- name: nickserv.account - name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text type: text
required: true required: true
label: NickServ Account 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 type: secret
required: true required: true
label: NickServ Password label: NickServ Password

View file

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

View file

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

View file

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

View file

@ -15,6 +15,7 @@ source: custom
settings: settings:
- name: passkey - name: passkey
type: secret type: secret
required: true
label: Passkey label: Passkey
help: "Go to User CP, User CP Home and copy the passkey" help: "Go to User CP, User CP Home and copy the passkey"
@ -31,12 +32,19 @@ irc:
- retroflix-announcer2 - retroflix-announcer2
- retroflix-announcer3 - retroflix-announcer3
settings: settings:
- name: nickserv.account - name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text type: text
required: true required: true
label: NickServ Account 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 type: secret
required: true required: true
label: NickServ Password label: NickServ Password

View file

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

View file

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

View file

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

View file

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

View file

@ -15,6 +15,7 @@ source: rartracker
settings: settings:
- name: passkey - name: passkey
type: secret type: secret
required: true
label: Passkey label: Passkey
help: "Copy the passkey from the /rss page." help: "Copy the passkey from the /rss page."
@ -28,12 +29,19 @@ irc:
announcers: announcers:
- SuperBits - SuperBits
settings: settings:
- name: nickserv.account - name: nick
type: text type: text
required: true required: true
label: Nick
help: Bot nick. Eg. user-bot
- name: auth.account
type: text
required: false
label: NickServ Account 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 type: secret
required: false required: false
label: NickServ Password label: NickServ Password

View file

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

View file

@ -15,6 +15,7 @@ source: custom
settings: settings:
- name: passkey - name: passkey
type: secret type: secret
required: true
label: Passkey label: Passkey
help: "Create a RSS Link to find out your PASSKEY" help: "Create a RSS Link to find out your PASSKEY"
@ -28,12 +29,19 @@ irc:
announcers: announcers:
- TD_Announce - TD_Announce
settings: settings:
- name: nickserv.account - name: nick
type: text type: text
required: true required: true
label: Nick
help: Bot nick. Eg. user_autodl
- name: auth.account
type: text
required: false
label: NickServ Account label: NickServ Account
help: NickServ account. Make sure to group your user and bot. Eg. username_autodl help: NickServ account. Make sure to group your user and bot.
- name: nickserv.password
- name: auth.password
type: secret type: secret
required: false required: false
label: NickServ Password label: NickServ Password

View file

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

View file

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

View file

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

View file

@ -15,8 +15,9 @@ source: UNIT3D
settings: settings:
- name: rsskey - name: rsskey
type: secret type: secret
label: Rss key required: true
help: "Click on your nick / Go to Security / Copy the RID (RSS Key) and paste it here." label: RSS key
help: "Click on your nick / Go to Settings / Security / Copy the RID (RSS Key) and paste it here."
irc: irc:
network: Torrentseeds.org network: Torrentseeds.org
@ -28,22 +29,30 @@ irc:
announcers: announcers:
- torrentseeds - torrentseeds
settings: settings:
- name: nickserv.account - name: nick
type: text type: text
required: true required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text
required: false
label: NickServ Account 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 type: secret
required: false required: false
label: NickServ Password label: NickServ Password
help: NickServ password help: NickServ password
- name: invite_command - name: invite_command
type: secret type: secret
default: "Cerberus identify USERNAME IRCKEY" default: "Cerberus identify USERNAME PID"
required: true required: true
label: Invite command label: Invite command
help: Invite auth with Cerberus. Replace USERNAME and IRCKEY help: Invite auth with Cerberus. Replace USERNAME and PID (passkey).
parse: parse:
type: single type: single

View file

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

View file

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

View file

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

View file

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

View file

@ -153,13 +153,10 @@ func (h *Handler) Run() error {
subLogger := zstdlog.NewStdLoggerWithLevel(h.log.With().Logger(), zerolog.TraceLevel) subLogger := zstdlog.NewStdLoggerWithLevel(h.log.With().Logger(), zerolog.TraceLevel)
h.client = &ircevent.Connection{ h.client = &ircevent.Connection{
Nick: h.network.NickServ.Account, Nick: h.network.Nick,
User: h.network.NickServ.Account, User: h.network.Auth.Account,
RealName: h.network.NickServ.Account, RealName: h.network.Auth.Account,
Password: h.network.Pass, Password: h.network.Pass,
SASLLogin: h.network.NickServ.Account,
SASLPassword: h.network.NickServ.Password,
SASLOptional: true,
Server: addr, Server: addr,
KeepAlive: 4 * time.Minute, KeepAlive: 4 * time.Minute,
Timeout: 2 * time.Minute, Timeout: 2 * time.Minute,
@ -170,6 +167,15 @@ func (h *Handler) Run() error {
Log: subLogger, 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 { if h.network.TLS {
h.client.UseTLS = true h.client.UseTLS = true
h.client.TLSConfig = &tls.Config{InsecureSkipVerify: true} h.client.TLSConfig = &tls.Config{InsecureSkipVerify: true}
@ -226,7 +232,7 @@ func (h *Handler) Run() error {
func (h *Handler) isOurNick(nick string) bool { func (h *Handler) isOurNick(nick string) bool {
h.m.RLock() h.m.RLock()
defer h.m.RUnlock() defer h.m.RUnlock()
return h.network.NickServ.Account == nick return h.network.Nick == nick
} }
func (h *Handler) isOurCurrentNick(nick string) bool { 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") { if contains(msg.Params[1], "invalid parameters", "help identify") {
h.log.Debug().Msgf("NOTICE nickserv invalid: %v", msg.Params) 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 return
} }
} }
@ -455,9 +461,9 @@ func (h *Handler) authenticate() bool {
return true 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") 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") h.log.Error().Stack().Err(err).Msg("error nickserv")
return false 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 // use network.Server + nick to use multiple indexers with different nick per network
// this allows for multiple handlers to one 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.lock.Unlock()
s.log.Debug().Msgf("starting network: %+v", network.Name) 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 { func (s *service) startNetwork(network domain.IrcNetwork) error {
// look if we have the network in handlers already, if so start it // 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) s.log.Debug().Msgf("starting network: %+v", network.Name)
if !existingHandler.client.Connected() { if !existingHandler.client.Connected() {
@ -138,7 +138,7 @@ func (s *service) startNetwork(network domain.IrcNetwork) error {
// init new irc handler // init new irc handler
handler := NewHandler(s.log, network, definitions, s.releaseService, s.notificationService) 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.lock.Unlock()
s.log.Debug().Msgf("starting network: %+v", network.Name) 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 { func (s *service) checkIfNetworkRestartNeeded(network *domain.IrcNetwork) error {
// look if we have the network in handlers, if so restart it // 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) 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 // if server, tls, invite command, port : changed - restart
@ -192,17 +192,17 @@ func (s *service) checkIfNetworkRestartNeeded(network *domain.IrcNetwork) error
return nil return nil
} }
if handler.NickServ.Account != network.NickServ.Account { if handler.Nick != network.Nick {
s.log.Debug().Msg("changing nick") s.log.Debug().Msg("changing nick")
if err := existingHandler.NickChange(network.NickServ.Account); err != nil { if err := existingHandler.NickChange(network.Nick); err != nil {
s.log.Error().Stack().Err(err).Msgf("failed to change nick %q", network.NickServ.Account) 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") s.log.Debug().Msg("nickserv: changing password")
if err := existingHandler.NickServIdentify(network.NickServ.Password); err != nil { if err := existingHandler.NickServIdentify(network.Auth.Password); err != nil {
s.log.Error().Stack().Err(err).Msgf("failed to identify with nickserv %q", network.NickServ.Account) 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 { func (s *service) restartNetwork(network domain.IrcNetwork) error {
// look if we have the network in handlers, if so restart it // 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) s.log.Info().Msgf("restarting network: %v", network.Name)
if existingHandler.client.Connected() { if existingHandler.client.Connected() {
@ -396,14 +396,15 @@ func (s *service) GetNetworksWithHealth(ctx context.Context) ([]domain.IrcNetwor
Port: n.Port, Port: n.Port,
TLS: n.TLS, TLS: n.TLS,
Pass: n.Pass, Pass: n.Pass,
Nick: n.Nick,
Auth: n.Auth,
InviteCommand: n.InviteCommand, InviteCommand: n.InviteCommand,
NickServ: n.NickServ,
Connected: false, Connected: false,
Channels: []domain.ChannelWithHealth{}, Channels: []domain.ChannelWithHealth{},
ConnectionErrors: []string{}, ConnectionErrors: []string{},
} }
handler, ok := s.handlers[handlerKey{n.Server, n.NickServ.Account}] handler, ok := s.handlers[handlerKey{n.Server, n.Nick}]
if ok { if ok {
handler.m.RLock() handler.m.RLock()
@ -484,7 +485,7 @@ func (s *service) DeleteNetwork(ctx context.Context, id int64) error {
// Remove network and handler // Remove network and handler
//if err = s.StopNetwork(network.Server); err != nil { //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) s.log.Error().Stack().Err(err).Msgf("could not stop and delete network: %v", network.Name)
return err return err
} }
@ -524,7 +525,7 @@ func (s *service) UpdateNetwork(ctx context.Context, network *domain.IrcNetwork)
} else { } else {
// take into account multiple channels per network // 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 { if err != nil {
s.log.Error().Stack().Err(err).Msgf("could not stop network: %+v", network.Name) s.log.Error().Stack().Err(err).Msgf("could not stop network: %+v", network.Name)
return errors.New("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: announcers:
- _AnnounceBot_ - _AnnounceBot_
settings: settings:
- name: nickserv.account - name: nick
type: text
required: true
label: Nick
help: Bot nick. Eg. user_bot
- name: auth.account
type: text type: text
required: false required: false
label: NickServ Account 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 type: secret
required: false required: false
label: NickServ Password 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 { Field } from "formik";
import { classNames } from "../../utils"; import { classNames } from "../../utils";
import { useToggle } from "../../hooks/hooks"; import { useToggle } from "../../hooks/hooks";
@ -14,6 +14,7 @@ interface TextFieldWideProps {
defaultValue?: string; defaultValue?: string;
required?: boolean; required?: boolean;
hidden?: boolean; hidden?: boolean;
validate?: FieldValidator;
} }
export const TextFieldWide = ({ export const TextFieldWide = ({
@ -23,7 +24,8 @@ export const TextFieldWide = ({
placeholder, placeholder,
defaultValue, defaultValue,
required, required,
hidden hidden,
validate
}: TextFieldWideProps) => ( }: TextFieldWideProps) => (
<div hidden={hidden} className="space-y-1 p-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4"> <div hidden={hidden} className="space-y-1 p-4 sm:space-y-0 sm:grid sm:grid-cols-3 sm:gap-4">
<div> <div>
@ -36,6 +38,7 @@ export const TextFieldWide = ({
name={name} name={name}
value={defaultValue} value={defaultValue}
required={required} required={required}
validate={validate}
> >
{({ field, meta }: FieldProps) => ( {({ field, meta }: FieldProps) => (
<input <input
@ -66,6 +69,7 @@ interface PasswordFieldWideProps {
help?: string; help?: string;
required?: boolean; required?: boolean;
defaultVisible?: boolean; defaultVisible?: boolean;
validate?: FieldValidator;
} }
export const PasswordFieldWide = ({ export const PasswordFieldWide = ({
@ -75,7 +79,8 @@ export const PasswordFieldWide = ({
defaultValue, defaultValue,
help, help,
required, required,
defaultVisible defaultVisible,
validate
}: PasswordFieldWideProps) => { }: PasswordFieldWideProps) => {
const [isVisible, toggleVisibility] = useToggle(defaultVisible); const [isVisible, toggleVisibility] = useToggle(defaultVisible);
@ -90,6 +95,7 @@ export const PasswordFieldWide = ({
<Field <Field
name={name} name={name}
defaultValue={defaultValue} defaultValue={defaultValue}
validate={validate}
> >
{({ field, meta }: FieldProps) => ( {({ field, meta }: FieldProps) => (
<div className="relative"> <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[] = [ export const downloadsPerUnitOptions: OptionBasic[] = [
{ {
label: "Select", label: "Select",

View file

@ -2,7 +2,7 @@ import { Fragment, useState } from "react";
import { toast } from "react-hot-toast"; import { toast } from "react-hot-toast";
import { useMutation, useQuery } from "react-query"; import { useMutation, useQuery } from "react-query";
import Select, { components, ControlProps, InputProps, MenuProps, OptionProps } from "react-select"; 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 { Field, Form, Formik, FormikValues } from "formik";
import { XMarkIcon } from "@heroicons/react/24/solid"; import { XMarkIcon } from "@heroicons/react/24/solid";
@ -16,46 +16,53 @@ import { PasswordFieldWide, SwitchGroupWide, TextFieldWide } from "../../compone
import { SlideOver } from "../../components/panels"; import { SlideOver } from "../../components/panels";
import Toast from "../../components/notifications/Toast"; import Toast from "../../components/notifications/Toast";
const Input = (props: InputProps) => { const Input = (props: InputProps) => (
return (
<components.Input <components.Input
{...props} {...props}
inputClassName="outline-none border-none shadow-none focus:ring-transparent" inputClassName="outline-none border-none shadow-none focus:ring-transparent"
className="text-gray-400 dark:text-gray-100" className="text-gray-400 dark:text-gray-100"
children={props.children} children={props.children}
/> />
); );
};
const Control = (props: ControlProps) => { const Control = (props: ControlProps) => (
return (
<components.Control <components.Control
{...props} {...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" 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} children={props.children}
/> />
); );
};
const Menu = (props: MenuProps) => { const Menu = (props: MenuProps) => (
return (
<components.Menu <components.Menu
{...props} {...props}
className="dark:bg-gray-800 border border-gray-300 dark:border-gray-700 dark:text-gray-400 rounded-md shadow-sm" 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} children={props.children}
/> />
); );
};
const Option = (props: OptionProps) => { const Option = (props: OptionProps) => (
return (
<components.Option <components.Option
{...props} {...props}
className="dark:text-gray-400 dark:bg-gray-800 dark:hover:bg-gray-900 dark:focus:bg-gray-900" className="dark:text-gray-400 dark:bg-gray-800 dark:hover:bg-gray-900 dark:focus:bg-gray-900 cursor-pointer"
children={props.children} 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) => { const IrcSettingFields = (ind: IndexerDefinition, indexer: string) => {
if (indexer !== "") { if (indexer !== "") {
@ -66,18 +73,19 @@ const IrcSettingFields = (ind: IndexerDefinition, indexer: string) => {
<div className="px-4 space-y-1"> <div className="px-4 space-y-1">
<Dialog.Title className="text-lg font-medium text-gray-900 dark:text-white">IRC</Dialog.Title> <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"> <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> </p>
</div> </div>
{ind.irc.settings.map((f: IndexerSetting, idx: number) => { {ind.irc.settings.map((f: IndexerSetting, idx: number) => {
switch (f.type) { switch (f.type) {
case "text": 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": case "secret":
if (f.name === "invite_command") { 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; return null;
})} })}
@ -101,14 +109,14 @@ const FeedSettingFields = (ind: IndexerDefinition, indexer: string) => {
</p> </p>
</div> </div>
<TextFieldWide name="name" label="Name" defaultValue={""} /> <TextFieldWide name="name" label="Name" defaultValue="" />
{ind.torznab.settings.map((f: IndexerSetting, idx: number) => { {ind.torznab.settings.map((f: IndexerSetting, idx: number) => {
switch (f.type) { switch (f.type) {
case "text": 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": 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; return null;
})} })}
@ -132,14 +140,14 @@ const RSSFeedSettingFields = (ind: IndexerDefinition, indexer: string) => {
</p> </p>
</div> </div>
<TextFieldWide name="name" label="Name" defaultValue={""} /> <TextFieldWide name="name" label="Name" defaultValue="" />
{ind.rss.settings.map((f: IndexerSetting, idx: number) => { {ind.rss.settings.map((f: IndexerSetting, idx: number) => {
switch (f.type) { switch (f.type) {
case "text": 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": 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; return null;
})} })}
@ -158,11 +166,11 @@ const SettingFields = (ind: IndexerDefinition, indexer: string) => {
switch (f.type) { switch (f.type) {
case "text": case "text":
return ( 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": case "secret":
return ( 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; return null;
@ -184,16 +192,6 @@ function slugIdentifier(name: string, prefix?: string) {
return slugify(l); 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 = { type SelectValue = {
label: string; label: string;
value: string; value: string;
@ -238,6 +236,7 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
); );
const onSubmit = (formData: FormikValues) => { const onSubmit = (formData: FormikValues) => {
console.log("form: ", formData);
const ind = data && data.find(i => i.identifier === formData.identifier); const ind = data && data.find(i => i.identifier === formData.identifier);
if (!ind) if (!ind)
return; return;
@ -319,11 +318,22 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
server: ind.irc.server, server: ind.irc.server,
port: ind.irc.port, port: ind.irc.port,
tls: ind.irc.tls, 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, invite_command: formData.irc.invite_command,
channels: channels 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, { mutation.mutate(formData as Indexer, {
onSuccess: () => { onSuccess: () => {
ircMutation.mutate(network); ircMutation.mutate(network);
@ -356,9 +366,7 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
identifier: "", identifier: "",
implementation: "irc", implementation: "irc",
name: "", name: "",
irc: { irc: {},
invite_command: ""
},
settings: {} settings: {}
}} }}
onSubmit={onSubmit} onSubmit={onSubmit}
@ -369,9 +377,9 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
<div className="px-4 py-6 bg-gray-50 dark:bg-gray-900 sm:px-6"> <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="flex items-start justify-between space-x-3">
<div className="space-y-1"> <div className="space-y-1">
<Dialog.Title <Dialog.Title className="text-lg font-medium text-gray-900 dark:text-white">
className="text-lg font-medium text-gray-900 dark:text-white">Add Add indexer
indexer</Dialog.Title> </Dialog.Title>
<p className="text-sm text-gray-500 dark:text-gray-200"> <p className="text-sm text-gray-500 dark:text-gray-200">
Add indexer. Add indexer.
</p> </p>
@ -425,6 +433,7 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
onChange={(option: unknown) => { onChange={(option: unknown) => {
resetForm(); resetForm();
if (option != null) {
const opt = option as SelectValue; const opt = option as SelectValue;
setFieldValue("name", opt.label ?? ""); setFieldValue("name", opt.label ?? "");
setFieldValue(field.name, opt.value ?? ""); setFieldValue(field.name, opt.value ?? "");
@ -440,6 +449,7 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
}); });
} }
} }
}
}} }}
options={data && data.sort((a, b) => a.name.localeCompare(b.name)).map(v => ({ options={data && data.sort((a, b) => a.name.localeCompare(b.name)).map(v => ({
label: v.name, label: v.name,
@ -517,6 +527,8 @@ export function IndexerUpdateForm({ isOpen, toggle, indexer }: UpdateProps) {
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries(["indexer"]); queryClient.invalidateQueries(["indexer"]);
toast.custom((t) => <Toast type="success" body={`${indexer.name} was deleted.`} t={t} />); toast.custom((t) => <Toast type="success" body={`${indexer.name} was deleted.`} t={t} />);
toggle();
} }
}); });

View file

@ -87,7 +87,8 @@ interface IrcNetworkAddFormValues {
port: number; port: number;
tls: boolean; tls: boolean;
pass: string; pass: string;
nickserv: NickServ; nick: string;
auth: IrcAuth;
channels: IrcChannel[]; channels: IrcChannel[];
} }
@ -114,6 +115,7 @@ export function IrcNetworkAddForm({ isOpen, toggle }: AddFormProps) {
const onSubmit = (data: unknown) => { const onSubmit = (data: unknown) => {
mutation.mutate(data as IrcNetwork); mutation.mutate(data as IrcNetwork);
}; };
const validate = (values: FormikValues) => { const validate = (values: FormikValues) => {
const errors = {} as FormikErrors<FormikValues>; const errors = {} as FormikErrors<FormikValues>;
if (!values.name) if (!values.name)
@ -125,8 +127,11 @@ export function IrcNetworkAddForm({ isOpen, toggle }: AddFormProps) {
if (!values.server) if (!values.server)
errors.server = "Required"; errors.server = "Required";
if (!values.nickserv || !values.nickserv.account) if (!values.nick)
errors.nickserv = { account: "Required" }; errors.nick = "Required";
// if (!values.auth || !values.auth.account)
// errors.auth = { account: "Required" };
return errors; return errors;
}; };
@ -138,7 +143,9 @@ export function IrcNetworkAddForm({ isOpen, toggle }: AddFormProps) {
port: 6667, port: 6667,
tls: false, tls: false,
pass: "", pass: "",
nickserv: { nick: "",
auth: {
mechanism: "SASL_PLAIN",
account: "" account: ""
}, },
channels: [] channels: []
@ -185,14 +192,20 @@ export function IrcNetworkAddForm({ isOpen, toggle }: AddFormProps) {
help="Network password" help="Network password"
/> />
<TextFieldWide <TextFieldWide
name="nickserv.account" name="nick"
label="NickServ Account" label="Nick"
placeholder="NickServ Account" placeholder="bot nick"
required={true}
/>
<TextFieldWide
name="auth.account"
label="Auth Account"
placeholder="Auth Account"
required={true} required={true}
/> />
<PasswordFieldWide <PasswordFieldWide
name="nickserv.password" name="auth.password"
label="NickServ Password" label="Auth Password"
/> />
<PasswordFieldWide name="invite_command" label="Invite command" /> <PasswordFieldWide name="invite_command" label="Invite command" />
@ -210,8 +223,9 @@ interface IrcNetworkUpdateFormValues {
server: string; server: string;
port: number; port: number;
tls: boolean; tls: boolean;
nickserv?: NickServ;
pass: string; pass: string;
nick: string;
auth?: IrcAuth;
invite_command: string; invite_command: string;
channels: Array<IrcChannel>; channels: Array<IrcChannel>;
} }
@ -245,6 +259,7 @@ export function IrcNetworkUpdateForm({
}); });
const onSubmit = (data: unknown) => { const onSubmit = (data: unknown) => {
console.log("submit: ", data);
mutation.mutate(data as IrcNetwork); mutation.mutate(data as IrcNetwork);
}; };
@ -263,10 +278,8 @@ export function IrcNetworkUpdateForm({
errors.port = "Required"; errors.port = "Required";
} }
if (!values.nickserv?.account) { if (!values.nick) {
errors.nickserv = { errors.nick = "Required";
account: "Required"
};
} }
return errors; return errors;
@ -283,10 +296,11 @@ export function IrcNetworkUpdateForm({
server: network.server, server: network.server,
port: network.port, port: network.port,
tls: network.tls, tls: network.tls,
nickserv: network.nickserv, nick: network.nick,
pass: network.pass, pass: network.pass,
channels: network.channels, auth: network.auth,
invite_command: network.invite_command invite_command: network.invite_command,
channels: network.channels
}; };
return ( return (
@ -328,20 +342,45 @@ export function IrcNetworkUpdateForm({
<PasswordFieldWide <PasswordFieldWide
name="pass" name="pass"
label="Password" label="Password"
help="Network password" help="Network password, not commonly used."
/> />
<TextFieldWide <TextFieldWide
name="nickserv.account" name="nick"
label="NickServ Account" label="Nick"
placeholder="NickServ Account" placeholder="nick"
required={true} required={true}
/> />
<PasswordFieldWide
name="nickserv.password" <div className="border-t border-gray-200 dark:border-gray-700 py-5">
label="NickServ Password" <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" /> <PasswordFieldWide name="invite_command" label="Invite command" />
<ChannelsFieldArray channels={values.channels} /> <ChannelsFieldArray channels={values.channels} />
@ -350,3 +389,117 @@ export function IrcNetworkUpdateForm({
</SlideOver> </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> </p>
</div> </div>
</div> </div>
{network.nickserv && 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" 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} onClick={toggleEdit}
> >
<div className="overflow-x-auto flex"> <div className="overflow-x-auto flex">
{network.nickserv.account} {network.nick}
</div> </div>
</div> </div>
) : (
<div className="col-span-3" />
)}
<div className="col-span-1 text-sm text-gray-500 dark:text-gray-400"> <div className="col-span-1 text-sm text-gray-500 dark:text-gray-400">
<ListItemDropdown network={network} toggleUpdate={toggleUpdate} /> <ListItemDropdown network={network} toggleUpdate={toggleUpdate} />
</div> </div>
@ -311,6 +307,8 @@ const ListItemDropdown = ({
queryClient.invalidateQueries(["networks", network.id]); queryClient.invalidateQueries(["networks", network.id]);
toast.custom((t) => <Toast type="success" body={`Network ${network.name} was deleted`} t={t}/>); 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; server: string;
port: number; port: number;
tls: boolean; tls: boolean;
nick: string;
pass: string; pass: string;
auth: IrcAuth; // optional
invite_command: string; invite_command: string;
nickserv?: NickServ; // optional
channels: IrcChannel[]; channels: IrcChannel[];
connected: boolean; connected: boolean;
connected_since: string; connected_since: string;
@ -20,8 +21,9 @@ interface IrcNetworkCreate {
port: number; port: number;
tls: boolean; tls: boolean;
pass: string; pass: string;
nick: string;
auth: IrcAuth; // optional
invite_command: string; invite_command: string;
nickserv?: NickServ; // optional
channels: IrcChannel[]; channels: IrcChannel[];
connected: boolean; connected: boolean;
} }
@ -48,8 +50,9 @@ interface IrcNetworkWithHealth {
port: number; port: number;
tls: boolean; tls: boolean;
pass: string; pass: string;
nick: string;
auth: IrcAuth; // optional
invite_command: string; invite_command: string;
nickserv?: NickServ; // optional
channels: IrcChannelWithHealth[]; channels: IrcChannelWithHealth[];
connected: boolean; connected: boolean;
connected_since: string; connected_since: string;
@ -57,7 +60,10 @@ interface IrcNetworkWithHealth {
healthy: boolean; healthy: boolean;
} }
interface NickServ { type IrcAuthMechanism = "NONE" | "SASL_PLAIN" | "NICKSERV";
interface IrcAuth {
mechanism: IrcAuthMechanism; // optional
account?: string; // optional account?: string; // optional
password?: string; // optional password?: string; // optional
} }