Michael Vetter
569e37f018
Update copyright to 2024
2024-01-22 16:03:48 +01:00
Steffen Jaeckel
dc0f2acb9a
Simplify usage of roster_get_display_name()
...
Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de >
2023-12-12 18:27:11 +01:00
Steffen Jaeckel
835ea397ac
Tidy up some code
...
Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de >
2023-12-12 18:26:21 +01:00
Steffen Jaeckel
4c26462827
Ensure instances of auto types are initialized
...
Follow-up of #1913
Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de >
2023-11-06 22:22:35 +01:00
IsaacM88
23c6936398
Improve MUC title behaviour for roster, statusbar, and titlebar
...
## Abstract
Continuation of https://github.com/profanity-im/profanity/pull/1881
Give all MUC title commands a consistent command structure and appearance.
- `/roster room use name|jid` and `/roster room show|hide server` are now `/roster room title bookmark|jid|localpart|name`
- `/statusbar room room|jid` is now `/statusbar room title bookmark|jid|localpart|name`
- `/statusbar show|hide jid` and `/statusbar show|hide name` are now `/titlebar room title bookmark|jid|localpart|name`
Fix both bugs mentioned in https://github.com/profanity-im/profanity/pull/1881
### src/ui/mucwin.c:mucwin_generate_title
Called by each command to generate a properly formatted title. It checks for "name" first because "name" is the default preference for each command. The last if-statement sets the title to "localpart" for special cases when the title should be "localpart" instead of the user-defined preference.
## Testing
### Preparation
Remove preferences that will interfere with testing.
```
sed -i "/roster.rooms.title=/d" profrc
sed -i "/statusbar.room.title=/d" profrc
sed -i "/titlebar.muc.title=/d" profrc
sed -i "/roster.rooms.use.name=/d" profrc
sed -i "/roster.rooms.server=/d" profrc
sed -i "/statusbar.room=/d" profrc
sed -i "/titlebar.muc.title.jid=/d" profrc
sed -i "/titlebar.muc.title.name=/d" profrc
sed -i "/roster.rooms.by=/d" profrc
```
### Command Definitions
| Test | Window |
| :--- | :--- |
| `/help roster` | - /roster room title bookmark\|jid\|localpart\|name<br>- room title bookmark\|jid\|localpart\|name : Display the bookmark name, JID, JID localpart, or room name as the roster title for MUCs.<br>- *No /roster show\|hide server*<br>- *No /roster room use jid\|name* |
| `/help statusbar` | - /statusbar room title bookmark\|jid\|localpart\|name<br>- room title bookmark\|jid\|localpart\|name : Display the bookmark name, JID, JID localpart, or room name as the title for MUC tabs.<br>- *No /statusbar room jid\|room* |
| `/help titlebar` | - /titlebar room title bookmark\|jid\|localpart\|name<br>- room title bookmark\|jid\|localpart\|name : Display the bookmark name, JID, JID localpart, or room name as the MUC window title.<br>- *No /titlebar show\|hide jid\|name* |
### Autocomplete
| Test | Command line |
| :--- | :--- |
| `/roster room <TAB>` | Autocompletes `title` |
| `/roster room title <TAB>` | Autocompletes `bookmark\|jid\|localpart\|name` |
| `/statusbar room <TAB>` | Autocompletes `title` |
| `/statusbar room title <TAB>` | Autocompletes `bookmark\|jid\|localpart\|name` |
| `/titlebar room <TAB>` | Autocompletes `title` |
| `/titlebar room title <TAB>` | Autocompletes `bookmark\|jid\|localpart\|name` |
| `/roster room <TAB>` | Does not autocomplete `use`, `show`, or `hide` |
| `/roster room use <TAB>` | Does not autocomplete `name` |
| `/roster room show <TAB>` | Does not autocomplete `server` |
| `/roster room hide <TAB>` | Does not autocomplete `server` |
| `/statusbar room <TAB>` | Does not autocomplete `jid` or `room` |
| `/titlebar show <TAB>` | Does not autocomplete `jid` or `name` |
| `/titlebar hide <TAB>` | Does not autocomplete `jid` or `name` |
### Set Preferences
| Test | Window | profrc |
| :--- | :--- | :--- |
| `/roster room title bookmark` | Roster MUCs will display 'bookmark' as their title. | roster.rooms.title=bookmark |
| `/roster room title jid` | Roster MUCs will display 'jid' as their title. | roster.rooms.title=jid |
| `/roster room title localpart` | Roster MUCs will display 'localpart' as their title. | roster.rooms.title=localpart |
| `/roster room title name` | Roster MUCs will display 'name' as their title. | roster.rooms.title=name |
| `/roster room title invalid` | Invalid usage, see '/help roster' for details. | |
| `/statusbar room title bookmark` | Displaying 'bookmark' as the title for MUC tabs. | statusbar.room.title=bookmark |
| `/statusbar room title jid` | Displaying 'jid' as the title for MUC tabs. | statusbar.room.title=jid |
| `/statusbar room title localpart` | Displaying 'localpart' as the title for MUC tabs. | statusbar.room.title=localpart |
| `/statusbar room title name` | Displaying 'name' as the title for MUC tabs. | statusbar.room.title=name |
| `/statusbar room title invalid` | Invalid usage, see '/help statusbar' for details. | |
| `/titlebar room title bookmark` | MUC windows will display 'bookmark' as the window title. | titlebar.muc.title=bookmark |
| `/titlebar room title jid` | MUC windows will display 'jid' as the window title. | titlebar.muc.title=jid |
| `/titlebar room title localpart` | MUC windows will display 'localpart' as the window title. | titlebar.muc.title=localpart |
| `/titlebar room title name` | MUC windows will display 'name' as the window title. | titlebar.muc.title=name |
| `/titlebar room title invalid` | Invalid usage, see '/help titlebar' for details. | |
| `/roster room use jid` | Invalid usage, see '/help roster' for details. | |
| `/roster room use name` | Invalid usage, see '/help roster' for details. | |
| `/roster room show server` | Invalid usage, see '/help roster' for details. | |
| `/roster room hide server` | Invalid usage, see '/help roster' for details. | |
| `/statusbar room jid` | Invalid usage, see '/help statusbar' for details. | |
| `/statusbar room room` | Invalid usage, see '/help statusbar' for details. | |
| `/titlebar show jid` | Invalid usage, see '/help titlebar' for details. | |
| `/titlebar hide jid` | Invalid usage, see '/help titlebar' for details. | |
| `/titlebar show name` | Invalid usage, see '/help titlebar' for details. | |
| `/titlebar hide name` | Invalid usage, see '/help titlebar' for details. | |
### Display Set Preferences
| Test | Window |
| :--- | :--- |
| /prefs ui | - Roster rooms title (/roster) : name<br>- Room tab display (/statusbar) : name<br>- MUC window title (/titlebar) : name |
### Test MUC Window
#### Test: without *name* preference, without *room name* field
```
/join muc@dmn.im
/room config
/field1 ""
/form submit
/quit
```
| Test | Roster | Statusbar | Titlebar |
| :--- | :--- | :--- | :--- |
| `/join muc@dmn.im ` | muc<span/>@dmn.im | muc<span/>@dmn.im | muc<span/>@dmn.im |
| `/room config` | | muc<span/>@dmn.im conf | muc<span/>@dmn.im config |
| `/field2 edit` | | | muc<span/>@dmn.im config * |
| `/msg tst` | tst | muc<span/>@dmn.im/tst | muc<span/>@dmn.im/tst |
| `/roster room by service` | muc | | |
#### Test: with *name* preference, without *room name* field
```
/roster room title name
/statusbar room title name
/titlebar room title name
/save
/quit
```
| Test | Roster | Statusbar | Titlebar |
| :--- | :--- | :--- | :--- |
| `/join muc@dmn.im ` | muc<span/>@dmn.im | muc<span/>@dmn.im | muc<span/>@dmn.im |
| `/room config` | | muc<span/>@dmn.im conf | muc<span/>@dmn.im config |
| `/field2 edit` | | | muc<span/>@dmn.im config * |
| `/msg tst` | tst | muc<span/>@dmn.im/tst | muc<span/>@dmn.im/tst |
| `/roster room by service` | muc | | |
#### Test: without *name* preference, with *room name* field
```
sed -i "/roster.rooms.title=/d" profrc
sed -i "/statusbar.room.title=/d" profrc
sed -i "/titlebar.muc.title=/d" profrc
/join muc@dmn.im
/room config
/field1 "my_room"
/form submit
/quit
```
| Test | Roster | Statusbar | Titlebar |
| :--- | :--- | :--- | :--- |
| `/join muc@dmn.im ` | my_room | my_room | my_room |
| `/room config` | | my_room conf | my_room config |
| `/field2 edit` | | | my_room config * |
| `/msg tst` | tst | my_room/tst | my_room/tst |
| `/roster room by service` | my_room | | |
#### Test: with *name* preference, with *room name* field
```
/quit
/roster room title name
/statusbar room title name
/titlebar room title name
/save
/quit
```
| Test | Roster | Statusbar | Titlebar |
| :--- | :--- | :--- | :--- |
| `/join muc@dmn.im ` | my_room | my_room | my_room |
| `/room config` | | my_room conf | my_room config |
| `/field2 edit` | | | my_room config * |
| `/msg tst` | tst | my_room/tst | my_room/tst |
| `/roster room by service` | my_room | | |
#### Test: with *localpart* preference
```
/quit
/roster room title localpart
/statusbar room title localpart
/titlebar room title localpart
/save
/quit
```
| Test | Roster | Statusbar | Titlebar |
| :--- | :--- | :--- | :--- |
| `/join muc@dmn.im ` | muc | muc | muc |
| `/room config` | | muc conf | muc config |
| `/field2 edit` | | | muc config * |
| `/msg tst` | tst | muc/tst | muc/tst |
| `/roster room by service` | muc | | |
#### Test: with *bookmark* preference, without *bookmark name*
```
/quit
/roster room title bookmark
/statusbar room title bookmark
/titlebar room title bookmark
/save
/quit
/bookmark add muc@dmn.im
```
| Test | Roster | Statusbar | Titlebar |
| :--- | :--- | :--- | :--- |
| `/bookmark join muc@dmn.im ` | muc<span/>@dmn.im | muc<span/>@dmn.im | muc<span/>@dmn.im |
| `/room config` | | muc<span/>@dmn.im conf | muc<span/>@dmn.im config |
| `/field2 edit` | | | muc<span/>@dmn.im config * |
| `/msg tst` | tst | muc<span/>@dmn.im/tst | muc<span/>@dmn.im/tst |
| `/roster room by service` | muc | | |
#### Test: with *bookmark* preference, with *bookmark name*
```
/quit
/bookmark remove muc@dmn.im
/bookmark add muc@dmn.im name "my_bookmark"
```
| Test | Roster | Statusbar | Titlebar |
| :--- | :--- | :--- | :--- |
| `/bookmark join muc@dmn.im ` | my_bookmark | my_bookmark | my_bookmark |
| `/room config` | | my_bookmark conf | my_bookmark config |
| `/field2 edit` | | | my_bookmark config * |
| `/msg tst` | tst | my_bookmark/tst | my_bookmark/tst |
| `/roster room by service` | my_bookmark | | |
#### Test: with *jid* preference
```
/quit
/roster room title jid
/statusbar room title jid
/titlebar room title jid
/save
/quit
```
| Test | Roster | Statusbar | Titlebar |
| :--- | :--- | :--- | :--- |
| `/join muc@dmn.im ` | muc<span/>@dmn.im | muc<span/>@dmn.im | muc<span/>@dmn.im |
| `/room config` | | muc<span/>@dmn.im conf | muc<span/>@dmn.im config |
| `/field2 edit` | | | muc<span/>@dmn.im config * |
| `/msg tst` | tst | muc<span/>@dmn.im/tst | muc<span/>@dmn.im/tst |
| `/roster room by service` | muc | | |
### Test Contact Chat Window Title
#### Test: without contact nick
```
/roster add tst@dmn.im
```
| Test | Titlebar |
| :--- | :--- |
| `/msg tst@dmn.im ` | tst<span/>@dmn.im |
#### Test: with contact nick
```
/roster add tst@dmn.im my_tst
```
| Test | Titlebar |
| :--- | :--- |
| `/msg my_tst` | my_tst <tst<span/>@ike.snikket.chat> |
### Test Preference Upgrade
#### Test /roster
| Test | profrc |
| :--- | :--- |
| `sed -i '/\[ui\]/a\roster.rooms.use.name=name' profrc` | Original key removed. |
| `sed -i '/\[ui\]/a\roster.rooms.use.name=' profrc` | Original key removed. |
| `sed -i '/\[ui\]/a\roster.rooms.server=' profrc` | Original key removed. |
| `sed -i '/\[ui\]/a\roster.rooms.use.name=jid' profrc` | Original key removed.<br>roster.rooms.title=jid |
| `sed -i '/\[ui\]/a\roster.rooms.use.name=jid' profrc`<br>`sed -i '/\[ui\]/a\roster.rooms.server=false' profrc` | Original keys removed.<br>roster.rooms.title=localpart |
| `sed -i '/\[ui\]/a\roster.rooms.use.name=jid' profrc`<br>`sed -i '/\[ui\]/a\roster.rooms.server=true' profrc` | Original keys removed.<br>roster.rooms.title=jid |
| `sed -i '/\[ui\]/a\roster.rooms.use.name=jid' profrc`<br>`sed -i '/\[ui\]/a\roster.rooms.server=' profrc` | Original keys removed.<br>roster.rooms.title=jid |
| `sed -i '/\[ui\]/a\statusbar.room=' profrc` | Original key removed. |
| `sed -i '/\[ui\]/a\statusbar.room=room' profrc` | Original key removed.<br>statusbar.room.title=localpart |
| `sed -i '/\[ui\]/a\statusbar.room=jid' profrc` | Original key removed.<br>statusbar.room.title=jid |
| `sed -i '/\[ui\]/a\titlebar.muc.title.jid=' profrc` | Original key removed. |
| `sed -i '/\[ui\]/a\titlebar.muc.title.name=' profrc` | Original key removed. |
| `sed -i '/\[ui\]/a\titlebar.muc.title.jid=true' profrc` | Original key removed. |
| `sed -i '/\[ui\]/a\titlebar.muc.title.name=true' profrc` | Original key removed. |
| `sed -i '/\[ui\]/a\titlebar.muc.title.jid=false' profrc` | Original key removed. |
| `sed -i '/\[ui\]/a\titlebar.muc.title.name=false' profrc` | Original key removed. |
| `sed -i '/\[ui\]/a\titlebar.muc.title.jid=true' profrc`<br>`sed -i '/\[ui\]/a\titlebar.muc.title.name=false' profrc` | Original key removed.<br>titlebar.muc.title=jid |
| `sed -i '/\[ui\]/a\titlebar.muc.title.jid=false' profrc`<br>`sed -i '/\[ui\]/a\titlebar.muc.title.name=true' profrc` | Original keys removed. |
| `sed -i '/\[ui\]/a\titlebar.muc.title.jid=true' profrc`<br>`sed -i '/\[ui\]/a\titlebar.muc.title.name=true' profrc` | Original keys removed. |
### Test Valgrind
No memory leaks detected relating to these changes.
2023-10-05 18:16:04 -06:00
Steffen Jaeckel
b36562c6b6
Introduce win_println_va()
...
Previously we printed a format string into a `GString` to then print that
result again into a `GString` and display that.
This patch removes one level of `GString` printing by forwarding the
`va_arg` to the newly added API `win_println_va()`.
Introducing `static win_println_va_internal()` also allowed refactoring
most of the `win_print*()` and `win_append*()` implementations and removing
all the redundant code.
Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de >
2023-09-01 12:12:44 +02:00
Steffen Jaeckel
5657aac33d
Fix some more char* -> gchar*.
...
Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de >
2023-08-31 23:14:02 +02:00
Michael Vetter
3a9de7d21b
fix: use correct format specifier in /privacy
...
Thanks to @H3rnand3zzz for noticing.
2023-07-27 15:13:44 +02:00
Michael Vetter
5fb3453808
Print actual client id in /privacy overview
...
Instead of just saying that we sent the "default".
2023-07-26 20:43:50 +02:00
Michael Vetter
22b1d14b67
Add helper function to create version string
...
And remove all the duplicate code.
Depending on the situation prof_get_version() will return:
* 0.13.1
* 0.13.1dev
* 0.13.1dev.master.69d8c1f9
2023-07-25 20:58:15 +02:00
Michael Vetter
13af6c96dc
Link from /privacy to relevant /account settings
...
Related to https://github.com/profanity-im/profanity/issues/1836
2023-07-25 20:14:29 +02:00
Michael Vetter
f7cce4c5c1
Move /os into /privacy os
...
Related to https://github.com/profanity-im/profanity/issues/1836
2023-07-25 16:35:14 +02:00
Michael Vetter
feba4b8263
Add cons_privacy_setting() to print privacy setting infos
2023-07-24 18:25:34 +02:00
John Hernandez
029f1caa52
Cleanup jid_destroy to auto_jid
...
Remove unused variables
Apply minor cleanups
2023-07-13 17:05:07 +02:00
John Hernandez
3a4cd7da48
Cleanup and mem leak fix
...
Improve usage of `gchar` and `char` by setting them correctly
Increase usage of `auto_gchar` and `auto_char`
Fix 2 mem leaks (rosterwin.c, avatar.c)
2023-07-12 17:43:33 +02:00
John Hernandez
e1d137f4e6
Change char->free to auto_char char for autocleanup
...
Replace `gchar` and `g_free` to `auto_gchar`
Correct certain `char` functions/variables to `gchar`
Related to #1819 .
Edited by @jubalh.
2023-07-11 13:26:37 +02:00
John Hernandez
4a70f5f513
Cleanup char* to auto_gchar gchar* for prefs_get_string
...
Necessity explained in #1819
2023-07-03 16:06:27 +02:00
John Hernandez
07cc19ce10
Add sessions_alarm
...
Introduce new feature: sessions_alarm.
Added new account setting: max_connections. On exceeding this number,
user will get an alert. If number is less than 1, no alert will happen.
Tests altered to fit new feature.
2023-04-18 14:28:20 +02:00
Michael Vetter
e52ca2fbaa
Merge pull request #1815 from H3rnand3zzz/feature/the-client-switcher
...
Feature: Allow setting client identification name/version manually
2023-04-09 18:24:23 +02:00
John Hernandez
5d3c8ce7c1
Allow setting client identification name/version manually
...
Add changes allowing user to switch client name and version.
Useful for enhancing user privacy.
Minor cleanup.
2023-04-09 14:17:01 +02:00
Martin Dosch
e1ffc64a65
User proper ellipsis char
...
As stated in
https://github.com/profanity-im/profanity/pull/1820#issuecomment-1498083383
profanity uses "..." (three dots) in a lot of places instead the proper
ellipsis char "…".
2023-04-09 12:19:18 +02:00
Steffen Jaeckel
0cf79848e9
add /statusbar tabmode actlist
...
The existing way how active tabs are displayed didn't allow showing more
than 10 tabs. This patch adds a mode where the statusbar shows a
comma-separated list of tabs which were active since the last time viewed.
This view is inspired by how `irssi` shows the active tabs, therefore
it is also called `actlist`.
Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de >
2023-04-08 18:38:36 +02:00
Michael Vetter
6b597f6608
Fix typos
2023-04-03 17:27:37 +02:00
Michael Vetter
e59c401c84
Adapt to g_string_free glib 2.75.3 change
...
glib 2.75.3 changes warning behaviour of `g_string_free()`.
See:
* https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3219
* https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3226
Use this opportunity to replace the use of GString with
`g_strdup_printf()` where possible.
Otherwise correctly take the return value of `g_string_free()`
which is nicer anyways.
2023-03-21 10:53:10 +01:00
Steffen Jaeckel
2936b09a63
change OMEMO QR code 0 bits to 'space'
...
This makes the generated QR code a lot better recognizable in my case.
Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de >
2023-03-12 17:39:57 +01:00
Steffen Jaeckel
b1b6c6f62d
add /strophe command to modify libstrophe-specific settings
...
Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de >
2023-01-18 17:04:41 +01:00
Michael Vetter
3adc399da0
Update copyright year
2023-01-10 10:37:25 +01:00
Marouane L
f934c5b59f
Add vCard support
...
Only nicknames, photos, birthdays, addresses, telephone numbers, emails,
JIDs, titles, roles, notes, and URLs are supported
Due to the synopsis array not having enough space, `/vcard photo
open-self` and `/vcard photo save-self` are not documented properly in
the synopsis section of the `/vcard` command, but they are documented in
the arguments section
Fixed memory leak in vcard autocomplete (thanks to debXwoody)
2022-10-18 23:24:30 +01:00
Michael Vetter
a86e86cce0
Fix first start detection
...
Only display help message on first start.
This is a fixup for:
27a5c9d287
2022-10-11 16:39:55 +02:00
Michael Vetter
27a5c9d287
Display a help message upon first start of Profanity
...
Explaining how to register/connect/set up an account.
2022-07-05 06:57:11 +02:00
Michael Vetter
c0e27f5e72
Fix formatting
2022-06-22 13:10:42 +02:00
Michael Vetter
b302c604ab
Display log level information in preferences
2022-06-22 13:05:11 +02:00
Michael Vetter
918d060817
Display mood preferences
2022-06-22 11:45:13 +02:00
Michael Vetter
35d10868f4
Reset buffer correctly
2022-06-15 15:09:38 +02:00
swirl
7276db07f4
remove memset in cons_show_qrcode
...
Signed-off-by: swirl <swurl@swurl.xyz >
2022-06-15 08:36:24 -04:00
swirl
7ed944254f
remove VLAs in OMEMO QR Code function
...
Removes the use of VLAs in favor of calloc
Signed-off-by: swirl <swurl@swurl.xyz >
2022-06-14 21:04:26 -04:00
Michael Vetter
2e85f18cd6
Use our omemo sid/fingerprint in qr code
...
Current clients sid/fingerprint will be shown in following format:
`xmpp:<user@server>?omemo-sid-<numerical-sid>=<omemo-fingerprint-hex-string>`
Fix https://github.com/profanity-im/profanity/issues/1320
2022-05-31 15:44:44 +02:00
Michael Vetter
42fb8f86d9
Add command help for omemo qrcode
2022-05-30 18:04:42 +02:00
swirl
d64cb38240
Reverse QR code colors and add padding
...
All QR scanners should be able to recognize this, as it is now the
correct color with some padding to prevent blending.
Signed-off-by: swirl <swurl@swurl.xyz >
2022-05-30 18:04:42 +02:00
swirl
9a9a97868d
implement working OMEMO QR code
...
TODO: We need to find a way to switch the colors of the QR code, so that
more QR readers can detect it, without "blending" the edges of the QR
code with the surrounding terminal window.
Signed-off-by: swirl <swurl@swurl.xyz >
2022-05-30 18:04:42 +02:00
Michael Vetter
cf83976b51
Add basic qrcode functions
2022-05-30 18:04:36 +02:00
Michael Vetter
1330ad4e1e
Update copyright year
2022-05-09 15:43:33 +02:00
Michael Vetter
b16bdca726
ox: show ox preferences
2022-05-05 23:55:31 +02:00
Stefan Ott
8044c82614
Add support for offline MUC notifications
2022-04-23 02:42:23 +02:00
Steffen Jaeckel
b28ac09368
a tad more const-correctness
...
Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de >
2022-03-22 11:44:00 +01:00
Steffen Jaeckel
9cf78e59d5
auto-format
...
Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de >
2022-02-01 15:01:28 +01:00
Michael Vetter
a9bcc8e8bd
Allow utf8 in occupants header char
2021-10-22 16:54:05 +02:00
Michael Vetter
1c96115f97
Allow utf8 in occupants char
2021-10-22 16:54:05 +02:00
Michael Vetter
fa2881fcea
Allow utf8 in roster room private char
2021-10-22 16:54:05 +02:00
Michael Vetter
8fc359ba2d
Allow utf8 in roster rooms char
2021-10-22 16:54:05 +02:00