 3d0f7955b6
			
		
	
	
		3d0f7955b6
		
	
	
	
	
		
			
			In order to keep all three packages (zulip, zulip_bots, zulip_botserver) in the same repo, all package files must now be nested one level deeper. For instance, python-zulip-api/zulip_bots/zulip_bots/bots/, instead of python-zulip-api/zulip_bots/bots/.
		
			
				
	
	
		
			74 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/env python
 | |
| import sys
 | |
| import os
 | |
| import logging
 | |
| import optparse
 | |
| import time
 | |
| import simplejson
 | |
| import subprocess
 | |
| import unicodedata
 | |
| 
 | |
| sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'api'))
 | |
| import zulip
 | |
| 
 | |
| from typing import Set
 | |
| 
 | |
| def fetch_public_streams():
 | |
|     # type: () -> Set[bytes]
 | |
|     public_streams = set()
 | |
| 
 | |
|     try:
 | |
|         res = zulip_client.get_streams(include_all_active=True)
 | |
|         if res.get("result") == "success":
 | |
|             streams = res["streams"]
 | |
|         else:
 | |
|             logging.error("Error getting public streams:\n%s" % (res,))
 | |
|             return None
 | |
|     except Exception:
 | |
|         logging.exception("Error getting public streams:")
 | |
|         return None
 | |
| 
 | |
|     for stream in streams:
 | |
|         stream_name = stream["name"]
 | |
|         # Zephyr class names are canonicalized by first applying NFKC
 | |
|         # normalization and then lower-casing server-side
 | |
|         canonical_cls = unicodedata.normalize("NFKC", stream_name).lower().encode("utf-8")
 | |
|         if canonical_cls in [b'security', b'login', b'network', b'ops', b'user_locate',
 | |
|                              b'mit', b'moof', b'wsmonitor', b'wg_ctl', b'winlogger',
 | |
|                              b'hm_ctl', b'hm_stat', b'zephyr_admin', b'zephyr_ctl']:
 | |
|             # These zephyr classes cannot be subscribed to by us, due
 | |
|             # to MIT's Zephyr access control settings
 | |
|             continue
 | |
| 
 | |
|         public_streams.add(canonical_cls)
 | |
| 
 | |
|     return public_streams
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     log_file = "/home/zulip/sync_public_streams.log"
 | |
|     logger = logging.getLogger(__name__)
 | |
|     log_format = "%(asctime)s: %(message)s"
 | |
|     logging.basicConfig(format=log_format)
 | |
|     formatter = logging.Formatter(log_format)
 | |
|     logger.setLevel(logging.DEBUG)
 | |
|     file_handler = logging.FileHandler(log_file)
 | |
|     file_handler.setFormatter(formatter)
 | |
|     logger.addHandler(file_handler)
 | |
| 
 | |
|     parser = optparse.OptionParser()
 | |
|     parser.add_option_group(zulip.generate_option_group(parser))
 | |
|     (options, args) = parser.parse_args()
 | |
| 
 | |
|     zulip_client = zulip.Client(client="ZulipSyncPublicStreamsBot/0.1")
 | |
| 
 | |
|     while True:
 | |
|         time.sleep(15)
 | |
|         public_streams = fetch_public_streams()
 | |
|         if public_streams is None:
 | |
|             continue
 | |
| 
 | |
|         f = open("/home/zulip/public_streams.tmp", "w")
 | |
|         f.write(simplejson.dumps(list(public_streams)) + "\n")
 | |
|         f.close()
 | |
| 
 | |
|         subprocess.call(["mv", "/home/zulip/public_streams.tmp", "/home/zulip/public_streams"])
 |