mirror of
https://github.com/zulip/zulip.git
synced 2025-10-23 04:52:12 +00:00
bots: Remove FEEDBACK_BOT implementation.
This legacy cross-realm bot hasn't been used in several years, as far as I know. If we wanted to re-introduce it, I'd want to implement it as an embedded bot using those common APIs, rather than the totally custom hacky code used for it that involves unnecessary queue workers and similar details. Backported to the 2.1.x branch.
This commit is contained in:
@@ -56,7 +56,6 @@ zulip-workers:zulip-events-confirmation-emails RUNNING pid 21
|
||||
zulip-workers:zulip-events-digest_emails RUNNING pid 2205, uptime 1:13:11
|
||||
zulip-workers:zulip-events-email_mirror RUNNING pid 2203, uptime 1:13:11
|
||||
zulip-workers:zulip-events-error_reports RUNNING pid 2200, uptime 1:13:11
|
||||
zulip-workers:zulip-events-feedback_messages RUNNING pid 2207, uptime 1:13:11
|
||||
zulip-workers:zulip-events-missedmessage_mobile_notifications RUNNING pid 2204, uptime 1:13:11
|
||||
zulip-workers:zulip-events-missedmessage_reminders RUNNING pid 2206, uptime 1:13:11
|
||||
zulip-workers:zulip-events-signups RUNNING pid 2198, uptime 1:13:11
|
||||
|
@@ -76,7 +76,6 @@ class zulip::base {
|
||||
'embed_links',
|
||||
'embedded_bots',
|
||||
'error_reports',
|
||||
'feedback_messages',
|
||||
'invites',
|
||||
'missedmessage_email_senders',
|
||||
'email_senders',
|
||||
|
@@ -469,17 +469,6 @@ define service {
|
||||
contact_groups admins
|
||||
}
|
||||
|
||||
define service {
|
||||
use generic-service
|
||||
service_description Check rabbitmq feedback messages consumers
|
||||
check_command check_rabbitmq_consumers!feedback_messages
|
||||
# Workaround weird checks 40s after first error causing alerts
|
||||
# from a single failure because cron hasn't run again yet
|
||||
max_check_attempts 3
|
||||
hostgroup_name frontends
|
||||
contact_groups admins
|
||||
}
|
||||
|
||||
define service {
|
||||
use generic-service
|
||||
service_description Check rabbitmq message sender consumers
|
||||
|
@@ -53,7 +53,6 @@ queues = {
|
||||
'embed_links',
|
||||
'embedded_bots',
|
||||
'error_reports',
|
||||
'feedback_messages',
|
||||
'invites',
|
||||
'message_sender',
|
||||
'missedmessage_emails',
|
||||
|
@@ -679,27 +679,6 @@ exports.initialize = function () {
|
||||
stream_list.toggle_filter_displayed(e);
|
||||
});
|
||||
|
||||
|
||||
// FEEDBACK
|
||||
|
||||
// Keep these 2 feedback bot triggers separate because they have to
|
||||
// propagate the event differently.
|
||||
$('.feedback').click(function () {
|
||||
compose_actions.start('private', {
|
||||
private_message_recipient: 'feedback@zulip.com',
|
||||
trigger: 'feedback menu item'});
|
||||
|
||||
});
|
||||
$('#feedback_button').click(function (e) {
|
||||
e.stopPropagation();
|
||||
popovers.hide_all();
|
||||
compose_actions.start('private', {
|
||||
private_message_recipient: 'feedback@zulip.com',
|
||||
trigger: 'feedback button'});
|
||||
|
||||
});
|
||||
|
||||
|
||||
// WEBATHENA
|
||||
|
||||
$('body').on('click', '.webathena_login', function (e) {
|
||||
|
@@ -70,7 +70,6 @@ function get_new_heights() {
|
||||
|
||||
const usable_height = viewport_height
|
||||
- parseInt($("#right-sidebar").css("marginTop"), 10)
|
||||
- $("#feedback_section").safeOuterHeight(true)
|
||||
- parseInt(buddy_list_wrapper.css("marginTop"), 10)
|
||||
- parseInt(buddy_list_wrapper.css("marginBottom"), 10)
|
||||
- $("#userlist-header").safeOuterHeight(true)
|
||||
|
@@ -227,13 +227,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
#feedback_section {
|
||||
text-align: left;
|
||||
padding-bottom: 15px;
|
||||
border-bottom: 1px solid hsl(0, 0%, 88%);
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
#keyboard-icon {
|
||||
position: fixed;
|
||||
bottom: 8px; /* bottom padding of .compose-content */
|
||||
|
@@ -167,13 +167,6 @@
|
||||
</li>
|
||||
{% endif %}
|
||||
<li class="divider" role="presentation"></li>
|
||||
{% if enable_feedback %}
|
||||
<li role="presentation">
|
||||
<a href="#feedback" class="feedback" role="menuitem">
|
||||
<i class="fa fa-comment" aria-hidden="true"></i> {{ _('Feedback') }}
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if show_invites %}
|
||||
<li role="presentation">
|
||||
<a href="#invite" role="menuitem">
|
||||
|
@@ -1,12 +1,5 @@
|
||||
<div class="right-sidebar" id="right-sidebar" role="navigation">
|
||||
<div class="right-sidebar-items">
|
||||
{% if enable_feedback %}
|
||||
<div id="feedback_section" class="new-style">
|
||||
<button type="button" class="button small rounded" id="feedback_button">
|
||||
<i class="fa fa-comment" aria-hidden="true"></i> {{ _('Send feedback') }}
|
||||
</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div id="user-list">
|
||||
<div id="userlist-header">
|
||||
<h4 class='sidebar-title' id='userlist-title' data-toggle="tooltip" title="{{ _('Filter users') }}">{{ _('USERS') }}</h4>
|
||||
|
@@ -42,7 +42,6 @@ FILES_WITH_LEGACY_SUBJECT = {
|
||||
# These use subject in the email sense, and will
|
||||
# probably always be exempt:
|
||||
'zerver/lib/email_mirror.py',
|
||||
'zerver/lib/feedback.py',
|
||||
'zerver/tests/test_new_users.py',
|
||||
'zerver/tests/test_email_mirror.py',
|
||||
|
||||
|
@@ -84,7 +84,6 @@ not_yet_fully_covered = {path for target in [
|
||||
'zerver/lib/digest.py',
|
||||
'zerver/lib/error_notify.py',
|
||||
'zerver/lib/export.py',
|
||||
'zerver/lib/feedback.py',
|
||||
'zerver/lib/fix_unreads.py',
|
||||
'zerver/lib/html_diff.py',
|
||||
'zerver/lib/import_realm.py',
|
||||
|
@@ -1516,16 +1516,6 @@ def do_send_messages(messages_maybe_none: Sequence[Optional[MutableMapping[str,
|
||||
'urls': links_for_embed}
|
||||
queue_json_publish('embed_links', event_data)
|
||||
|
||||
if (settings.ENABLE_FEEDBACK and settings.FEEDBACK_BOT and
|
||||
message['message'].recipient.type == Recipient.PERSONAL):
|
||||
|
||||
feedback_bot_id = get_system_bot(email=settings.FEEDBACK_BOT).id
|
||||
if feedback_bot_id in message['active_user_ids']:
|
||||
queue_json_publish(
|
||||
'feedback_messages',
|
||||
wide_message_dict,
|
||||
)
|
||||
|
||||
if message['message'].recipient.type == Recipient.PERSONAL:
|
||||
welcome_bot_id = get_system_bot(settings.WELCOME_BOT).id
|
||||
if (welcome_bot_id in message['active_user_ids'] and
|
||||
|
@@ -1,68 +0,0 @@
|
||||
from django.conf import settings
|
||||
from django.core.mail import EmailMessage
|
||||
from typing import Any, Mapping, Optional
|
||||
|
||||
from zerver.lib.actions import internal_send_message
|
||||
from zerver.lib.send_email import FromAddress
|
||||
from zerver.lib.redis_utils import get_redis_client
|
||||
from zerver.models import get_system_bot
|
||||
|
||||
import time
|
||||
|
||||
client = get_redis_client()
|
||||
|
||||
def has_enough_time_expired_since_last_message(sender_email: str, min_delay: float) -> bool:
|
||||
# This function returns a boolean, but it also has the side effect
|
||||
# of noting that a new message was received.
|
||||
key = 'zilencer:feedback:%s' % (sender_email,)
|
||||
t = int(time.time())
|
||||
last_time = client.getset(key, t) # type: Optional[bytes]
|
||||
if last_time is None:
|
||||
return True
|
||||
delay = t - int(last_time)
|
||||
return delay > min_delay
|
||||
|
||||
def deliver_feedback_by_zulip(message: Mapping[str, Any]) -> None:
|
||||
subject = "%s" % (message["sender_email"],)
|
||||
|
||||
if len(subject) > 60:
|
||||
subject = subject[:57].rstrip() + "..."
|
||||
|
||||
content = ''
|
||||
sender_email = message['sender_email']
|
||||
|
||||
# We generate ticket numbers if it's been more than a few minutes
|
||||
# since their last message. This avoids some noise when people use
|
||||
# enter-send.
|
||||
need_ticket = has_enough_time_expired_since_last_message(sender_email, 180)
|
||||
|
||||
if need_ticket:
|
||||
ticket_number = message['id']
|
||||
content += '\n~~~'
|
||||
content += '\nticket Z%03d (@support please ack)' % (ticket_number,)
|
||||
content += '\nsender: %s' % (message['sender_full_name'],)
|
||||
content += '\nemail: %s' % (sender_email,)
|
||||
if 'sender_realm_str' in message:
|
||||
content += '\nrealm: %s' % (message['sender_realm_str'],)
|
||||
content += '\n~~~'
|
||||
content += '\n\n'
|
||||
|
||||
content += message['content']
|
||||
|
||||
user_profile = get_system_bot(settings.FEEDBACK_BOT)
|
||||
internal_send_message(user_profile.realm, settings.FEEDBACK_BOT,
|
||||
"stream", settings.FEEDBACK_STREAM, subject, content)
|
||||
|
||||
def handle_feedback(event: Mapping[str, Any]) -> None:
|
||||
if not settings.ENABLE_FEEDBACK:
|
||||
return
|
||||
if settings.FEEDBACK_EMAIL is not None:
|
||||
to_email = settings.FEEDBACK_EMAIL
|
||||
subject = "Zulip feedback from %s" % (event["sender_email"],)
|
||||
content = event["content"]
|
||||
from_email = '"%s" <%s>' % (event["sender_full_name"], FromAddress.SUPPORT)
|
||||
headers = {'Reply-To': '"%s" <%s>' % (event["sender_full_name"], event["sender_email"])}
|
||||
msg = EmailMessage(subject, content, from_email, [to_email], headers=headers)
|
||||
msg.send()
|
||||
if settings.FEEDBACK_STREAM is not None:
|
||||
deliver_feedback_by_zulip(event)
|
@@ -1066,8 +1066,6 @@ def do_import_system_bots(realm: Any) -> None:
|
||||
internal_bots = [(bot['name'], bot['email_template'] % (settings.INTERNAL_BOT_DOMAIN,))
|
||||
for bot in settings.INTERNAL_BOTS]
|
||||
create_users(realm, internal_bots, bot_type=UserProfile.DEFAULT_BOT)
|
||||
names = [(settings.FEEDBACK_BOT_NAME, settings.FEEDBACK_BOT)]
|
||||
create_users(realm, names, bot_type=UserProfile.DEFAULT_BOT)
|
||||
print("Finished importing system bots.")
|
||||
|
||||
def create_users(realm: Realm, name_list: Iterable[Tuple[str, str]],
|
||||
|
@@ -34,9 +34,6 @@ class Command(BaseCommand):
|
||||
return
|
||||
realm = Realm.objects.create(string_id=settings.SYSTEM_BOT_REALM)
|
||||
|
||||
names = [(settings.FEEDBACK_BOT_NAME, settings.FEEDBACK_BOT)]
|
||||
create_users(realm, names, bot_type=UserProfile.DEFAULT_BOT)
|
||||
|
||||
get_client("website")
|
||||
get_client("API")
|
||||
|
||||
|
@@ -1,12 +0,0 @@
|
||||
from unittest.mock import patch, MagicMock
|
||||
from django.conf import settings
|
||||
from zerver.lib.test_classes import ZulipTestCase
|
||||
|
||||
class TestFeedbackBot(ZulipTestCase):
|
||||
@patch('logging.info')
|
||||
def test_pm_to_feedback_bot(self, logging_info_mock: MagicMock) -> None:
|
||||
with self.settings(ENABLE_FEEDBACK=True):
|
||||
user_email = self.example_email("othello")
|
||||
self.send_personal_message(user_email, settings.FEEDBACK_BOT,
|
||||
content="I am a feedback message.")
|
||||
logging_info_mock.assert_called_once_with("Received feedback from {}".format(user_email))
|
@@ -296,7 +296,6 @@ def home_real(request: HttpRequest) -> HttpResponse:
|
||||
'night_mode': user_profile.night_mode,
|
||||
'navbar_logo_url': navbar_logo_url,
|
||||
'show_webathena': user_profile.realm.webathena_enabled,
|
||||
'enable_feedback': settings.ENABLE_FEEDBACK,
|
||||
'embedded': narrow_stream is not None,
|
||||
'invite_as': PreregistrationUser.INVITE_AS,
|
||||
'max_file_upload_size': settings.MAX_FILE_UPLOAD_SIZE,
|
||||
|
@@ -20,7 +20,6 @@ from zerver.models import \
|
||||
Client
|
||||
from zerver.lib.context_managers import lockfile
|
||||
from zerver.lib.error_notify import do_report_error
|
||||
from zerver.lib.feedback import handle_feedback
|
||||
from zerver.lib.queue import SimpleQueueClient, queue_json_publish, retry_event
|
||||
from zerver.lib.timestamp import timestamp_to_datetime
|
||||
from zerver.lib.email_notifications import handle_missedmessage_emails
|
||||
@@ -435,13 +434,6 @@ class PushNotificationsWorker(QueueProcessingWorker): # nocoverage
|
||||
event['user_profile_id'],))
|
||||
retry_event(self.queue_name, event, failure_processor)
|
||||
|
||||
# We probably could stop running this queue worker at all if ENABLE_FEEDBACK is False
|
||||
@assign_queue('feedback_messages')
|
||||
class FeedbackBot(QueueProcessingWorker):
|
||||
def consume(self, event: Mapping[str, Any]) -> None:
|
||||
logging.info("Received feedback from %s" % (event["sender_email"],))
|
||||
handle_feedback(event)
|
||||
|
||||
@assign_queue('error_reports')
|
||||
class ErrorReporter(QueueProcessingWorker):
|
||||
def consume(self, event: Mapping[str, Any]) -> None:
|
||||
|
@@ -95,10 +95,6 @@ MAX_FILE_UPLOAD_SIZE = 25
|
||||
# Jitsi Meet video call integration; set to None to disable integration.
|
||||
JITSI_SERVER_URL = 'https://meet.jit.si/'
|
||||
|
||||
# Feedback bot settings
|
||||
ENABLE_FEEDBACK = PRODUCTION
|
||||
FEEDBACK_EMAIL = None # type: Optional[str]
|
||||
|
||||
# Max state storage per user
|
||||
# TODO: Add this to zproject/prod_settings_template.py once stateful bots are fully functional.
|
||||
USER_STATE_SIZE_LIMIT = 10000000
|
||||
@@ -177,12 +173,6 @@ ERROR_BOT = None # type: Optional[str]
|
||||
# sending tests.
|
||||
NAGIOS_STAGING_SEND_BOT = None # type: Optional[str]
|
||||
NAGIOS_STAGING_RECEIVE_BOT = None # type: Optional[str]
|
||||
# Feedback bot, messages sent to it are by default emailed to
|
||||
# FEEDBACK_EMAIL (see above), but can be sent to a stream,
|
||||
# depending on configuration.
|
||||
FEEDBACK_BOT = 'feedback@zulip.com'
|
||||
FEEDBACK_BOT_NAME = 'Zulip Feedback Bot'
|
||||
FEEDBACK_STREAM = None # type: Optional[str]
|
||||
# SYSTEM_BOT_REALM would be a constant always set to 'zulip',
|
||||
# except that it isn't that on zulipchat.com. We will likely do a
|
||||
# migration and eliminate this parameter in the future.
|
||||
|
@@ -315,12 +315,6 @@ SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 # 2 weeks
|
||||
# Controls whether Zulip sends "new login" email notifications.
|
||||
#SEND_LOGIN_EMAILS = True
|
||||
|
||||
# Controls whether or not there is a feedback button in the UI.
|
||||
ENABLE_FEEDBACK = False
|
||||
|
||||
# Feedback sent by your users will be sent to this email address.
|
||||
FEEDBACK_EMAIL = ZULIP_ADMINISTRATOR
|
||||
|
||||
# Controls whether or not error reports (tracebacks) are emailed to the
|
||||
# server administrators.
|
||||
#ERROR_REPORTING = True
|
||||
|
Reference in New Issue
Block a user