Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F7892784
matrix-sticker-pack-list.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
3 KB
Referenced Files
None
Subscribers
None
matrix-sticker-pack-list.cpp
View Options
/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2024 tusooa <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#include
<kazv-defs.hpp>
#include
<lager/lenses/optional.hpp>
#include
<lager/lenses/at.hpp>
#include
"matrix-sticker-pack.hpp"
#include
"matrix-sticker-pack-list.hpp"
#include
"matrix-sticker-pack-list-p.hpp"
using
namespace
Kazv
;
using
ImagePackRoomMap
=
immer
::
map
<
std
::
string
/* room id */
,
immer
::
map
<
std
::
string
/* */
,
json
>>
;
lager
::
reader
<
immer
::
flex_vector
<
MatrixStickerPackSource
>>
getEventsFromClient
(
Client
client
)
{
lager
::
reader
<
Event
>
userEmotes
=
client
.
accountData
()[
accountDataEventType
][
lager
::
lenses
::
or_default
];
return
lager
::
with
(
userEmotes
,
client
.
accountData
()[
imagePackRoomsEventType
][
lager
::
lenses
::
or_default
]
// The following jsonAtOr performs the validation for us:
// if the content does not conform to the string-to-string-to-anything map, return an empty one
.
xform
(
eventContent
|
jsonAtOr
(
"rooms"
,
ImagePackRoomMap
{})),
client
.
rooms
()).
map
([](
const
Event
&
userEmotes
,
const
ImagePackRoomMap
&
emoteRooms
,
const
immer
::
map
<
std
::
string
,
RoomModel
>
&
rooms
)
{
// This transformation function takes O(|room sticker packs specified in account data|).
auto
res
=
immer
::
flex_vector
<
MatrixStickerPackSource
>
{
{
MatrixStickerPackSource
::
AccountData
,
accountDataEventType
,
userEmotes
,
""
,
""
}
}.
transient
();
for
(
const
auto
&
[
roomId
,
stateKeyMap
]
:
emoteRooms
)
{
for
(
const
auto
&
[
stateKey
,
_
]
:
stateKeyMap
)
{
res
.
push_back
(
MatrixStickerPackSource
{
MatrixStickerPackSource
::
RoomState
,
roomStateEventType
,
rooms
[
roomId
].
stateEvents
[
KeyOfState
{
roomStateEventType
,
stateKey
}],
roomId
,
stateKey
,
});
}
}
return
res
.
persistent
();
}).
make
();
}
lager
::
reader
<
immer
::
flex_vector
<
MatrixStickerPackSource
>>
getEventsFromRoom
(
Room
room
)
{
return
lager
::
with
(
room
.
roomId
(),
room
.
stateEvents
())
.
map
([](
const
auto
&
roomId
,
const
auto
&
state
)
{
return
intoImmer
(
immer
::
flex_vector
<
MatrixStickerPackSource
>
{},
zug
::
filter
([](
const
auto
&
pair
)
{
return
pair
.
first
.
type
==
roomStateEventType
;
})
|
zug
::
map
([
roomId
](
const
auto
&
pair
)
{
return
MatrixStickerPackSource
{
MatrixStickerPackSource
::
RoomState
,
roomStateEventType
,
pair
.
second
,
roomId
,
pair
.
first
.
stateKey
,
};
}),
state
);
});
}
MatrixStickerPackList
::
MatrixStickerPackList
(
Client
client
,
QObject
*
parent
)
:
KazvAbstractListModel
(
parent
)
,
m_events
(
getEventsFromClient
(
client
))
{
initCountCursor
(
m_events
.
map
([](
const
auto
&
events
)
{
return
static_cast
<
int
>
(
events
.
size
());
}));
}
MatrixStickerPackList
::
MatrixStickerPackList
(
Room
room
,
QObject
*
parent
)
:
KazvAbstractListModel
(
parent
)
,
m_events
(
getEventsFromRoom
(
room
))
{
initCountCursor
(
m_events
.
map
([](
const
auto
&
events
)
{
return
static_cast
<
int
>
(
events
.
size
());
}));
}
MatrixStickerPackList
::~
MatrixStickerPackList
()
=
default
;
MatrixStickerPack
*
MatrixStickerPackList::at
(
int
index
)
const
{
return
new
MatrixStickerPack
(
m_events
.
map
([
index
](
const
auto
&
events
)
{
if
(
events
.
size
()
>
std
::
size_t
(
index
))
{
return
events
[
index
];
}
else
{
return
MatrixStickerPackSource
{
MatrixStickerPackSource
::
AccountData
,
accountDataEventType
,
Event
(),
""
,
""
,
};
}
}));
}
File Metadata
Details
Attached
Mime Type
text/x-c
Expires
Thu, Oct 2, 4:38 AM (1 d, 2 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
472351
Default Alt Text
matrix-sticker-pack-list.cpp (3 KB)
Attached To
Mode
rK kazv
Attached
Detach File
Event Timeline
Log In to Comment