aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/contact_details/muc_config_form_provider.vala
blob: 47bbbe2862898abaa6ed961fe7caa5bd34616dab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using Gee;
using Gtk;

using Dino.Entities;
using Xmpp.Xep;

namespace Dino.Ui.ContactDetails {

public class MucConfigFormProvider : Plugins.ContactDetailsProvider, Object {
    public string id { get { return "muc_config_form"; } }
    private StreamInteractor stream_interactor;

    public MucConfigFormProvider(StreamInteractor stream_interactor) {
        this.stream_interactor = stream_interactor;
    }

    public void populate(Conversation conversation, Plugins.ContactDetails contact_details, Plugins.WidgetType type) {
        if (type != Plugins.WidgetType.GTK) return;
        if (conversation.type_ == Conversation.Type.GROUPCHAT) {
            Xmpp.Core.XmppStream? stream = stream_interactor.get_stream(conversation.account);
            if (stream == null) return;
            stream_interactor.get_module(MucManager.IDENTITY).get_config_form(conversation.account, conversation.counterpart, (jid, data_form) => {
                contact_details.save.connect(() => { data_form.submit(); });
                Idle.add(() => {
                    for (int i = 0; i < data_form.fields.size; i++) {
                        DataForms.DataForm.Field field = data_form.fields[i];
                        add_field(field, contact_details);
                    }
                    return false;
                });
            });
        }
    }

    public static void add_field(DataForms.DataForm.Field field, Plugins.ContactDetails contact_details) {
        string label = field.label ?? "";
        string? desc = null;

        if (field.var != null) {
            switch (field.var) {
                case "muc#roomconfig_roomname":
                    label = _("Name of the room");
                    break;
                case "muc#roomconfig_roomdesc":
                    label = _("Description of the room");
                    break;
                case "muc#roomconfig_persistentroom":
                    label = _("Persistent");
                    desc = _("The room will persist after the last occupant exits");
                    break;
                case "muc#roomconfig_publicroom":
                    label = _("Publicly searchable");
                    break;
                case "muc#roomconfig_changesubject":
                    label = _("Occupants may change subject");
                    break;
                case "muc#roomconfig_whois":
                    label = _("Discover real JIDs");
                    desc = _("Who may discover real JIDs?");
                    break;
                case "muc#roomconfig_roomsecret":
                    label = _("Password");
                    desc = _("Password required to enter the room. Leave empty for none");
                    break;
                case "muc#roomconfig_moderatedroom":
                    label = _("Moderated");
                    desc = _("Only occupants with voice may send messages");
                    break;
                case "muc#roomconfig_membersonly":
                    label = _("Members only");
                    desc = _("Only members may enter the room");
                    break;
                case "muc#roomconfig_historylength":
                    label = _("Message history");
                    desc = _("Maximum number of history messages returned by the room");
                    break;
            }
        }

        Widget? widget = get_widget(field);
        if (widget != null) contact_details.add(_("Room Configuration"), label, desc, widget);
    }

    private static Widget? get_widget(DataForms.DataForm.Field field) {
        if (field.type_ == null) return null;
        switch (field.type_) {
            case DataForms.DataForm.Type.BOOLEAN:
                DataForms.DataForm.BooleanField boolean_field = field as DataForms.DataForm.BooleanField;
                Switch sw = new Switch() { active=boolean_field.value, valign=Align.CENTER, visible=true };
                sw.state_set.connect((state) => {
                    boolean_field.value = state;
                    return false;
                });
                return sw;
            case DataForms.DataForm.Type.JID_MULTI:
                return null;
            case DataForms.DataForm.Type.LIST_SINGLE:
                DataForms.DataForm.ListSingleField list_single_field = field as DataForms.DataForm.ListSingleField;
                ComboBoxText combobox = new ComboBoxText() { valign=Align.CENTER, visible=true };
                for (int i = 0; i < list_single_field.options.size; i++) {
                    DataForms.DataForm.Option option = list_single_field.options[i];
                    combobox.append(option.value, option.label);
                    if (option.value == list_single_field.value) combobox.active = i;
                }
                combobox.changed.connect(() => {
                    list_single_field.value = combobox.get_active_id();
                });
                return combobox;
            case DataForms.DataForm.Type.LIST_MULTI:
                return null;
            case DataForms.DataForm.Type.TEXT_PRIVATE:
                DataForms.DataForm.TextPrivateField text_private_field = field as DataForms.DataForm.TextPrivateField;
                Entry entry = new Entry() { text=text_private_field.value ?? "", valign=Align.CENTER, visible=true, visibility=false };
                entry.key_release_event.connect(() => {
                    text_private_field.value = entry.text;
                    return false;
                });
                return entry;
            case DataForms.DataForm.Type.TEXT_SINGLE:
                DataForms.DataForm.TextSingleField text_single_field = field as DataForms.DataForm.TextSingleField;
                Entry entry = new Entry() { text=text_single_field.value ?? "", valign=Align.CENTER, visible=true };
                entry.key_release_event.connect(() => {
                    text_single_field.value = entry.text;
                    return false;
                });
                return entry;
            default:
                return null;
        }
    }
}

}