Return interface instead of pointer to implementation.
Track joined channels and rejoin them appropriately after disconnect.