Skip to content

Commit 7d37f67

Browse files
committed
IRC: Convert configuration from CLI args to config file.
1 parent ad9b0e6 commit 7d37f67

File tree

2 files changed

+52
-31
lines changed

2 files changed

+52
-31
lines changed

zulip/integrations/bridge_with_irc/irc-mirror.py

+35-31
Original file line numberDiff line numberDiff line change
@@ -5,45 +5,51 @@
55
#
66

77
import argparse
8+
import configparser
89
import sys
910
import traceback
11+
from typing import Any, Dict, Tuple
1012

1113
import zulip
1214

13-
usage = """./irc-mirror.py --irc-server=IRC_SERVER --channel=<CHANNEL> --nick-prefix=<NICK> --stream=<STREAM> [optional args]
15+
usage = """./irc-mirror.py --config irc_mirror.conf
16+
"""
1417

15-
Example:
1618

17-
./irc-mirror.py --irc-server=127.0.0.1 --channel='#test' --nick-prefix=username --stream='test' --topic='#mypy'
19+
class BridgeConfigError(Exception):
20+
pass
1821

19-
--stream is a Zulip stream.
20-
--topic is a Zulip topic, is optionally specified, defaults to "IRC".
21-
Optional arguments:
22-
--nickserv-pw is a password for the nickserv.
23-
--sasl-password is a password for SASL authentication.
2422

25-
Specify your Zulip API credentials and server in a ~/.zuliprc file or using the options.
23+
def read_configuration(
24+
config_file: str,
25+
) -> Tuple[configparser.SectionProxy, configparser.SectionProxy]:
26+
config: configparser.ConfigParser = configparser.ConfigParser()
27+
config.read(config_file)
28+
29+
config_irc = config["irc"]
30+
for required in ["host", "port", "nickname", "channel"]:
31+
if required not in config_irc:
32+
raise BridgeConfigError(f"Missing required configuration: {required}")
33+
config_zulip = config["api"]
34+
for required in ["stream", "topic"]:
35+
if required not in config_zulip:
36+
raise BridgeConfigError(f"Missing required configuration: {required}")
37+
38+
return config_irc, config_zulip
2639

27-
Note that "_zulip" will be automatically appended to the IRC nick provided
28-
"""
2940

3041
if __name__ == "__main__":
3142
parser = zulip.add_default_arguments(
3243
argparse.ArgumentParser(usage=usage), allow_provisioning=True
3344
)
34-
parser.add_argument("--irc-server", default=None)
35-
parser.add_argument("--port", default=6667)
36-
parser.add_argument("--nick-prefix", default=None)
37-
parser.add_argument("--channel", default=None)
38-
parser.add_argument("--stream", default="general")
39-
parser.add_argument("--topic", default="IRC")
40-
parser.add_argument("--nickserv-pw", default="")
41-
parser.add_argument("--sasl-password", default=None)
45+
parser.add_argument(
46+
"-c", "--config", required=False, help="Path to the config file for the bridge."
47+
)
4248

4349
options = parser.parse_args()
4450
# Setting the client to irc_mirror is critical for this to work
4551
options.client = "irc_mirror"
46-
zulip_client = zulip.init_from_options(options)
52+
zulip_client = zulip.Client(config_file=options.config)
4753
try:
4854
from irc_mirror_backend import IRCBot
4955
except ImportError:
@@ -54,19 +60,17 @@
5460
)
5561
sys.exit(1)
5662

57-
if options.irc_server is None or options.nick_prefix is None or options.channel is None:
58-
parser.error("Missing required argument")
63+
config_irc, config_zulip = read_configuration(options.config)
5964

60-
nickname = options.nick_prefix + "_zulip"
6165
bot = IRCBot(
6266
zulip_client,
63-
options.stream,
64-
options.topic,
65-
options.channel,
66-
nickname,
67-
options.irc_server,
68-
options.nickserv_pw,
69-
options.port,
70-
sasl_password=options.sasl_password,
67+
config_zulip["stream"],
68+
config_zulip["topic"],
69+
config_irc["channel"],
70+
config_irc["nickname"],
71+
config_irc["host"],
72+
config_irc.get("nickserv_password", ""),
73+
int(config_irc["port"]),
74+
sasl_password=config_irc.get("sasl_password", None),
7175
)
7276
bot.start()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[irc]
2+
host = irc.libera.chat
3+
port = 6667
4+
channel = #test
5+
nickname = bridge
6+
# (Optional) Password for the nickserv
7+
# nickserv_password = password
8+
# (Optional) Password for SASL authentication
9+
# sasl_password = password
10+
11+
# This is for Zulip configuration
12+
[api]
13+
14+
key = aPiKeY
15+
site = https://chat.zulip.org
16+
stream = test here
17+
topic = IRC

0 commit comments

Comments
 (0)