100 lines
4.5 KiB
Python
Executable File
100 lines
4.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
from typing import Any, Dict, List
|
|
|
|
import zulip
|
|
|
|
welcome_text = "Hello {}, Welcome to Zulip!\n \
|
|
* The first thing you should do is to install the development environment. \
|
|
We recommend following the vagrant setup as it is well documented and used \
|
|
by most of the contributors. If you face any trouble during installation \
|
|
post it in #development help\n \
|
|
* If you have not used Zulip before play with Zulip for a while. See how \
|
|
is Zulip diffrent from other chat applications. We would love to hear your \
|
|
first impressions about Zulip. Post it in #feedback . We have mobile apps \
|
|
as well as desktop apps too. You should try them too if you have time :)\n \
|
|
* Once you are familarized with Zulip a bit you can start contributing. Some \
|
|
of the main projects you can contribute to are Zulip \
|
|
[server](https://github.com/zulip/zulip), \
|
|
[mobile app](https://github.com/zulip/zulip-mobile), \
|
|
[desktop](https://github.com/zulip/zulip-electron) app etc. We even have \
|
|
a [bot](https://github.com/zulip/zulipbot) that you can contribute to!!\n \
|
|
* We host our source code on GitHub. If you are not familiar with Git or \
|
|
GitHub checkout [this](http://zulip.readthedocs.io/en/latest/git-guide.html) \
|
|
guide. You don't have to learn everything but please go through it and learn \
|
|
the basics. We are here to help you if you are having any trouble. Post your \
|
|
questions in #git help . \
|
|
* Once you have completed these steps you can start contributing. You \
|
|
should start with issues labelled \
|
|
[bite-size](https://github.com/zulip/zulip/issues?q=is%3Aissue+is%3Aopen+label%3A). \
|
|
Bite-size issues are meant for new contributors and can be solved easily as \
|
|
compared to other issues. Currently we have bite-size labels only in Zulip server \
|
|
but if you want a bite size issue for mobile or electron feel free post in #mobile \
|
|
or #electron .\n \
|
|
* Solving the first issue can be difficult. The key is to not give up. If you spend \
|
|
enough time on the issue you should be able to solve it no matter what.\n \
|
|
* Use `grep` command when you can't figure out what files to change :) For example \
|
|
if you want know what files to modify in order to change Invite more users to Add \
|
|
more users which you can see below the user status list, grep for \"Invite more \
|
|
users\" in terminal.\n \
|
|
* If you are stuck with something and can't figure out what to do you can ask \
|
|
for help in #development help . But make sure that you tried your best to figure \
|
|
out the issue by yourself\n \
|
|
* If you are here for #Outreachy 2017-2018 or #GSoC don't worry much about \
|
|
whether you will get selected or not. You will learn a lot contributing to \
|
|
Zulip in course of next few months and if you do a good job at that you \
|
|
will get selected too :)\n \
|
|
* Most important of all welcome to the Zulip family :octopus:"
|
|
|
|
# These streams will cause the message to be sent
|
|
streams_to_watch = ["new members"]
|
|
|
|
# These streams will cause anyone who sends a message there to be removed from the watchlist
|
|
streams_to_cancel = ["development help"]
|
|
|
|
|
|
def get_watchlist() -> List[Any]:
|
|
storage = client.get_storage()
|
|
return list(storage["storage"].values())
|
|
|
|
|
|
def set_watchlist(watchlist: List[str]) -> None:
|
|
client.update_storage({"storage": dict(enumerate(watchlist))})
|
|
|
|
|
|
def handle_event(event: Dict[str, Any]) -> None:
|
|
try:
|
|
if event["type"] == "realm_user" and event["op"] == "add":
|
|
watchlist = get_watchlist()
|
|
watchlist.append(event["person"]["email"])
|
|
set_watchlist(watchlist)
|
|
return
|
|
if event["type"] == "message":
|
|
stream = event["message"]["display_recipient"]
|
|
if stream not in streams_to_watch and stream not in streams_to_cancel:
|
|
return
|
|
watchlist = get_watchlist()
|
|
if event["message"]["sender_email"] in watchlist:
|
|
watchlist.remove(event["message"]["sender_email"])
|
|
if stream not in streams_to_cancel:
|
|
client.send_message(
|
|
{
|
|
"type": "private",
|
|
"to": event["message"]["sender_email"],
|
|
"content": welcome_text.format(event["message"]["sender_short_name"]),
|
|
}
|
|
)
|
|
set_watchlist(watchlist)
|
|
return
|
|
except Exception as err:
|
|
print(err)
|
|
|
|
|
|
def start_event_handler() -> None:
|
|
print("Starting event handler...")
|
|
client.call_on_each_event(handle_event, event_types=["realm_user", "message"])
|
|
|
|
|
|
client = zulip.Client()
|
|
start_event_handler()
|