Repository: rasahq/rasa
Issue: Warning when using custom slot mapping action

### Rasa Open Source version

3.0.0rc1

### Rasa SDK version

_No response_

### Rasa X version

_No response_

### Python version

3.8

### What operating system are you using?

OSX

### What happened?

I ran into this warning when using a custom slot mapping action:

```python
2021-11-09 15:28:38 INFO     rasa.core.actions.action  - Running custom action 'action_validate_slot_mappings' has resulted in an event of type 'slot'. This is disallowed and the tracker will not be updated with this event.
```

I guess this happens because of the 

```
if (
    isinstance(event, SlotSet)
    # this triggers if the action extracted the same slot again
    and tracker.get_slot(event.key) != event.value
)
```

```python
class BetterConditionalResponseValidator(ValidationAction):

    async def extract_better(
        self,
        dispatcher: CollectingDispatcher,
        tracker: Tracker,
        domain: Dict[Text, Any],
    ) -> Dict[Text, Any]:

        return {"better": bool(len(tracker.events) % 2)}
```

### Command / Request

_No response_

### Relevant log output

_No response_

Changed files:
rasa/core/actions/action.py, tests/core/test_actions.py

diff --git a/rasa/core/actions/action.py b/rasa/core/actions/action.py
index e99615293bb..dcc2923089b 100644
--- a/rasa/core/actions/action.py
+++ b/rasa/core/actions/action.py
@@ -1026,11 +1026,9 @@ class ActionExtractSlots(Action):
                 output_channel, nlg, tracker, domain
             )
             for event in custom_events:
-                if (
-                    isinstance(event, SlotSet)
-                    and tracker.get_slot(event.key) != event.value
-                ):
-                    slot_events.append(event)
+                if isinstance(event, SlotSet):
+                    if tracker.get_slot(event.key) != event.value:
+                        slot_events.append(event)
                 elif isinstance(event, BotUttered):
                     slot_events.append(event)
                 else:
diff --git a/tests/core/test_actions.py b/tests/core/test_actions.py
index a52ba75a472..21e531cd2f4 100644
--- a/tests/core/test_actions.py
+++ b/tests/core/test_actions.py
@@ -2426,3 +2426,74 @@ async def test_action_extract_slots_returns_bot_uttered():
             domain,
         )
         assert all([isinstance(event, (SlotSet, BotUttered)) for event in events])
+
+
+async def test_action_extract_slots_does_not_raise_disallowed_warning_for_slot_events(
+    caplog: LogCaptureFixture,
+):
+    domain_yaml = textwrap.dedent(
+        """
+        version: "3.0"
+
+        slots:
+          custom_slot_a:
+            type: text
+            influence_conversation: false
+            mappings:
+            - type: custom
+              action: custom_extract_action
+          custom_slot_b:
+            type: text
+            influence_conversation: false
+            mappings:
+            - type: custom
+
+        actions:
+        - custom_extract_action
+        - action_validate_slot_mappings
+        """
+    )
+    domain = Domain.from_yaml(domain_yaml)
+    event = UserUttered("Hi")
+    tracker = DialogueStateTracker.from_events(
+        sender_id="test_id", evts=[event], slots=domain.slots
+    )
+
+    action_server_url = "http:/my-action-server:5055/webhook"
+
+    with aioresponses() as mocked:
+        mocked.post(
+            action_server_url,
+            payload={
+                "events": [
+                    {"event": "slot", "name": "custom_slot_a", "value": "test_A"},
+                ]
+            },
+        )
+
+        mocked.post(
+            action_server_url,
+            payload={
+                "events": [
+                    {"event": "slot", "name": "custom_slot_b", "value": "test_B"},
+                ]
+            },
+        )
+
+        action_server = EndpointConfig(action_server_url)
+        action_extract_slots = ActionExtractSlots(action_server)
+
+        with caplog.at_level(logging.INFO):
+            events = await action_extract_slots.run(
+                CollectingOutputChannel(),
+                TemplatedNaturalLanguageGenerator(domain.responses),
+                tracker,
+                domain,
+            )
+
+        assert len(caplog.messages) == 0
+
+        assert events == [
+            SlotSet("custom_slot_b", "test_B"),
+            SlotSet("custom_slot_a", "test_A"),
+        ]