How to use slot_was_set properly

You should use custom actions:

class ActionGreet(Action):
    def name(self):
        return 'action_greet'

    def run(self, dispatcher, tracker, domain):
        if tracker.get_slot('firstname'):
            firstname = tracker.get_slot('firstname')
            dispatcher.utter_message(f'Hello, {firstname}')
        else:
            dispatcher.utter_message(f'Hello')
        return []