Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Pleroma
pleroma
Commits
50409326
Commit
50409326
authored
Sep 15, 2017
by
Roger Braun
Browse files
Refactor posting and make character limit configurable.
parent
ac2893a9
Changes
12
Hide whitespace changes
Inline
Side-by-side
config/config.exs
View file @
50409326
...
...
@@ -43,7 +43,8 @@
config
:pleroma
,
:instance
,
version:
version
,
name:
"Pleroma"
,
email:
"example@example.com"
email:
"example@example.com"
,
limit:
5000
# Import environment specific config. This must remain at the bottom
# of this file so it overrides the configuration defined above.
...
...
lib/pleroma/web/common_api/common_api.ex
View file @
50409326
defmodule
Pleroma
.
Web
.
CommonAPI
do
alias
Pleroma
.
{
Repo
,
Activity
,
Object
}
alias
Pleroma
.
{
Repo
,
Activity
,
Object
,
User
}
alias
Pleroma
.
Web
.
ActivityPub
.
ActivityPub
alias
Pleroma
.
Formatter
import
Pleroma
.
Web
.
CommonAPI
.
Utils
def
delete
(
activity_id
,
user
)
do
with
%
Activity
{
data:
%{
"object"
=>
%{
"id"
=>
object_id
}}}
<-
Repo
.
get
(
Activity
,
activity_id
),
...
...
@@ -44,13 +47,22 @@ def unfavorite(id_or_ap_id, user) do
end
end
# This is a hack for twidere.
def
get_by_id_or_ap_id
(
id
)
do
activity
=
Repo
.
get
(
Activity
,
id
)
||
Activity
.
get_create_activity_by_object_ap_id
(
id
)
if
activity
.
data
[
"type"
]
==
"Create"
do
activity
else
Activity
.
get_create_activity_by_object_ap_id
(
activity
.
data
[
"object"
])
@instance
Application
.
get_env
(
:pleroma
,
:instance
)
@limit
Keyword
.
get
(
@instance
,
:limit
)
def
post
(
user
,
%{
"status"
=>
status
}
=
data
)
do
with
status
<-
String
.
trim
(
status
),
length
when
length
in
1
..
@limit
<-
String
.
length
(
status
),
attachments
<-
attachments_from_ids
(
data
[
"media_ids"
]),
mentions
<-
Formatter
.
parse_mentions
(
status
),
inReplyTo
<-
get_replied_to_activity
(
data
[
"in_reply_to_status_id"
]),
to
<-
to_for_user_and_mentions
(
user
,
mentions
,
inReplyTo
),
content_html
<-
make_content_html
(
status
,
mentions
,
attachments
),
context
<-
make_context
(
inReplyTo
),
tags
<-
Formatter
.
parse_tags
(
status
),
object
<-
make_note_data
(
user
.
ap_id
,
to
,
context
,
content_html
,
attachments
,
inReplyTo
,
tags
)
do
res
=
ActivityPub
.
create
(
to
,
user
,
context
,
object
)
User
.
update_note_count
(
user
)
res
end
end
end
lib/pleroma/web/
twitter
_api/utils.ex
→
lib/pleroma/web/
common
_api/utils.ex
View file @
50409326
defmodule
Pleroma
.
Web
.
Twitter
API
.
Utils
do
defmodule
Pleroma
.
Web
.
Common
API
.
Utils
do
alias
Pleroma
.
{
Repo
,
Object
,
Formatter
,
User
,
Activity
}
alias
Pleroma
.
Web
.
ActivityPub
.
Utils
alias
Calendar
.
Strftime
# This is a hack for twidere.
def
get_by_id_or_ap_id
(
id
)
do
activity
=
Repo
.
get
(
Activity
,
id
)
||
Activity
.
get_create_activity_by_object_ap_id
(
id
)
if
activity
.
data
[
"type"
]
==
"Create"
do
activity
else
Activity
.
get_create_activity_by_object_ap_id
(
activity
.
data
[
"object"
])
end
end
def
get_replied_to_activity
(
id
)
when
not
is_nil
(
id
)
do
Repo
.
get
(
Activity
,
id
)
end
def
get_replied_to_activity
(
_
),
do
:
nil
def
attachments_from_ids
(
ids
)
do
Enum
.
map
(
ids
||
[],
fn
(
media_id
)
->
Repo
.
get
(
Object
,
media_id
)
.
data
end
)
end
defp
shortname
(
name
)
do
if
String
.
length
(
name
)
<
30
do
name
def
to_for_user_and_mentions
(
user
,
mentions
,
inReplyTo
)
do
default_to
=
[
user
.
follower_address
,
"https://www.w3.org/ns/activitystreams#Public"
]
to
=
default_to
++
Enum
.
map
(
mentions
,
fn
({
_
,
%{
ap_id:
ap_id
}})
->
ap_id
end
)
if
inReplyTo
do
Enum
.
uniq
([
inReplyTo
.
data
[
"actor"
]
|
to
])
else
String
.
slice
(
name
,
0
..
30
)
<>
"…"
to
end
end
def
make_content_html
(
status
,
mentions
,
attachments
)
do
status
|>
format_input
(
mentions
)
|>
add_attachments
(
attachments
)
end
def
make_context
(%
Activity
{
data:
%{
"context"
=>
context
}}),
do
:
context
def
make_context
(
_
),
do
:
Utils
.
generate_context_id
def
add_attachments
(
text
,
attachments
)
do
attachment_text
=
Enum
.
map
(
attachments
,
fn
(%{
"url"
=>
[%{
"href"
=>
href
}
|
_
]})
->
...
...
@@ -53,16 +83,6 @@ def add_user_links(text, mentions) do
end
)
end
def
make_content_html
(
status
,
mentions
,
attachments
)
do
status
|>
format_input
(
mentions
)
|>
add_attachments
(
attachments
)
end
def
make_context
(%
Activity
{
data:
%{
"context"
=>
context
}}),
do
:
context
def
make_context
(
_
),
do
:
Utils
.
generate_context_id
# TODO: Move this to a more fitting space
def
make_note_data
(
actor
,
to
,
context
,
content_html
,
attachments
,
inReplyTo
,
tags
)
do
object
=
%{
"type"
=>
"Note"
,
...
...
@@ -98,4 +118,12 @@ def date_to_asctime(date) do
""
end
end
defp
shortname
(
name
)
do
if
String
.
length
(
name
)
<
30
do
name
else
String
.
slice
(
name
,
0
..
30
)
<>
"…"
end
end
end
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
View file @
50409326
...
...
@@ -133,15 +133,11 @@ def get_context(%{assigns: %{user: user}} = conn, %{"id" => id}) do
end
def
post_status
(%{
assigns:
%{
user:
user
}}
=
conn
,
%{
"status"
=>
status
}
=
params
)
do
l
=
status
|>
String
.
trim
|>
String
.
length
params
=
params
|>
Map
.
put
(
"in_reply_to_status_id"
,
params
[
"in_reply_to_id"
])
if
l
>
0
&&
l
<
5000
do
{
:ok
,
activity
}
=
TwitterAPI
.
create_status
(
user
,
params
)
render
conn
,
StatusView
,
"status.json"
,
%{
activity:
activity
,
for:
user
,
as:
:activity
}
end
{
:ok
,
activity
}
=
CommonAPI
.
post
(
user
,
params
)
render
conn
,
StatusView
,
"status.json"
,
%{
activity:
activity
,
for:
user
,
as:
:activity
}
end
def
delete_status
(%{
assigns:
%{
user:
user
}}
=
conn
,
%{
"id"
=>
id
})
do
...
...
lib/pleroma/web/ostatus/handlers/note_handler.ex
View file @
50409326
...
...
@@ -4,7 +4,7 @@ defmodule Pleroma.Web.OStatus.NoteHandler do
alias
Pleroma
.
{
Object
,
User
,
Activity
}
alias
Pleroma
.
Web
.
ActivityPub
.
ActivityPub
alias
Pleroma
.
Web
.
ActivityPub
.
Utils
alias
Pleroma
.
Web
.
Twitter
API
alias
Pleroma
.
Web
.
Common
API
@doc
"""
Get the context for this note. Uses this:
...
...
@@ -92,7 +92,7 @@ def handle_note(entry, doc \\ nil) do
mentions
<-
get_mentions
(
entry
),
to
<-
make_to_list
(
actor
,
mentions
),
date
<-
XML
.
string_from_xpath
(
"//published"
,
entry
),
note
<-
Twitter
API
.
Utils
.
make_note_data
(
actor
.
ap_id
,
to
,
context
,
content_html
,
attachments
,
inReplyToActivity
,
[]),
note
<-
Common
API
.
Utils
.
make_note_data
(
actor
.
ap_id
,
to
,
context
,
content_html
,
attachments
,
inReplyToActivity
,
[]),
note
<-
note
|>
Map
.
put
(
"id"
,
id
)
|>
Map
.
put
(
"tag"
,
tags
),
note
<-
note
|>
Map
.
put
(
"published"
,
date
),
note
<-
add_external_url
(
note
,
entry
),
...
...
lib/pleroma/web/twitter_api/controllers/util_controller.ex
View file @
50409326
...
...
@@ -6,15 +6,16 @@ def help_test(conn, _params) do
json
(
conn
,
"ok"
)
end
@instance
Application
.
get_env
(
:pleroma
,
:instance
)
def
config
(
conn
,
_params
)
do
case
get_format
(
conn
)
do
"xml"
->
response
=
"""
<config>
<site>
<name>#{
Web.base_url
}</name>
<name>#{
Keyword.get(@instance, :name)
}</name>
<site>#{Web.base_url}</site>
<textlimit>
5000
</textlimit>
<textlimit>
#{Keyword.get(@instance, :limit)}
</textlimit>
</site>
</config>
"""
...
...
@@ -24,22 +25,23 @@ def config(conn, _params) do
_
->
json
(
conn
,
%{
site:
%{
name:
Web
.
base_url
,
name:
Keyword
.
get
(
@instance
,
:name
)
,
server:
Web
.
base_url
,
textlimit:
5000
textlimit:
Keyword
.
get
(
@instance
,
:limit
)
}
})
end
end
def
version
(
conn
,
_params
)
do
version
=
Keyword
.
get
(
@instance
,
:version
)
case
get_format
(
conn
)
do
"xml"
->
response
=
"<version>
Pleroma Dev
</version>"
response
=
"<version>
#{
version
}
</version>"
conn
|>
put_resp_content_type
(
"application/xml"
)
|>
send_resp
(
200
,
response
)
_
->
json
(
conn
,
"Pleroma Dev"
)
_
->
json
(
conn
,
version
)
end
end
end
lib/pleroma/web/twitter_api/representers/activity_representer.ex
View file @
50409326
...
...
@@ -2,7 +2,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
use
Pleroma
.
Web
.
TwitterAPI
.
Representers
.
BaseRepresenter
alias
Pleroma
.
Web
.
TwitterAPI
.
Representers
.
ObjectRepresenter
alias
Pleroma
.
{
Activity
,
User
}
alias
Pleroma
.
Web
.
TwitterAPI
.
{
TwitterAPI
,
UserView
,
Utils
}
alias
Pleroma
.
Web
.
TwitterAPI
.
{
TwitterAPI
,
UserView
}
alias
Pleroma
.
Web
.
CommonAPI
.
Utils
alias
Pleroma
.
Formatter
defp
user_by_ap_id
(
user_list
,
ap_id
)
do
...
...
lib/pleroma/web/twitter_api/twitter_api.ex
View file @
50409326
...
...
@@ -6,43 +6,10 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
alias
Pleroma
.
Web
.
{
OStatus
,
CommonAPI
}
alias
Pleroma
.
Formatter
import
Pleroma
.
Web
.
TwitterAPI
.
Utils
@httpoison
Application
.
get_env
(
:pleroma
,
:httpoison
)
def
to_for_user_and_mentions
(
user
,
mentions
,
inReplyTo
)
do
default_to
=
[
user
.
follower_address
,
"https://www.w3.org/ns/activitystreams#Public"
]
to
=
default_to
++
Enum
.
map
(
mentions
,
fn
({
_
,
%{
ap_id:
ap_id
}})
->
ap_id
end
)
if
inReplyTo
do
Enum
.
uniq
([
inReplyTo
.
data
[
"actor"
]
|
to
])
else
to
end
end
def
get_replied_to_activity
(
id
)
when
not
is_nil
(
id
)
do
Repo
.
get
(
Activity
,
id
)
end
def
get_replied_to_activity
(
_
),
do
:
nil
def
create_status
(%
User
{}
=
user
,
%{
"status"
=>
status
}
=
data
)
do
with
attachments
<-
attachments_from_ids
(
data
[
"media_ids"
]),
mentions
<-
Formatter
.
parse_mentions
(
status
),
inReplyTo
<-
get_replied_to_activity
(
data
[
"in_reply_to_status_id"
]),
to
<-
to_for_user_and_mentions
(
user
,
mentions
,
inReplyTo
),
content_html
<-
make_content_html
(
status
,
mentions
,
attachments
),
context
<-
make_context
(
inReplyTo
),
tags
<-
Formatter
.
parse_tags
(
status
),
object
<-
make_note_data
(
user
.
ap_id
,
to
,
context
,
content_html
,
attachments
,
inReplyTo
,
tags
)
do
res
=
ActivityPub
.
create
(
to
,
user
,
context
,
object
)
User
.
update_note_count
(
user
)
res
end
CommonAPI
.
post
(
user
,
data
)
end
def
fetch_friend_statuses
(
user
,
opts
\\
%{})
do
...
...
lib/pleroma/web/twitter_api/views/user_view.ex
View file @
50409326
defmodule
Pleroma
.
Web
.
TwitterAPI
.
UserView
do
use
Pleroma
.
Web
,
:view
alias
Pleroma
.
User
alias
Pleroma
.
Web
.
Twitter
API
.
Utils
alias
Pleroma
.
Web
.
Common
API
.
Utils
def
render
(
"show.json"
,
%{
user:
user
=
%
User
{}}
=
assigns
)
do
render_one
(
user
,
Pleroma
.
Web
.
TwitterAPI
.
UserView
,
"user.json"
,
assigns
)
...
...
test/web/
twitter_api/twitter
_api_utils_test.exs
→
test/web/
common_api/common
_api_utils_test.exs
View file @
50409326
defmodule
Pleroma
.
Web
.
Twitter
API
.
UtilsTest
do
alias
Pleroma
.
Web
.
Twitter
API
.
Utils
defmodule
Pleroma
.
Web
.
Common
API
.
UtilsTest
do
alias
Pleroma
.
Web
.
Common
API
.
Utils
use
Pleroma
.
DataCase
test
"it adds attachment links to a given text and attachment set"
do
...
...
test/web/twitter_api/twitter_api_test.exs
View file @
50409326
defmodule
Pleroma
.
Web
.
TwitterAPI
.
TwitterAPITest
do
use
Pleroma
.
DataCase
alias
Pleroma
.
Builders
.
{
UserBuilder
,
ActivityBuilder
}
alias
Pleroma
.
Web
.
TwitterAPI
.
{
TwitterAPI
,
UserView
,
Utils
}
alias
Pleroma
.
Web
.
TwitterAPI
.
{
TwitterAPI
,
UserView
}
alias
Pleroma
.
Web
.
CommonAPI
.
Utils
alias
Pleroma
.
{
Activity
,
User
,
Object
,
Repo
}
alias
Pleroma
.
Web
.
TwitterAPI
.
Representers
.
ActivityRepresenter
alias
Pleroma
.
Web
.
ActivityPub
.
ActivityPub
...
...
test/web/twitter_api/views/user_view_test.exs
View file @
50409326
...
...
@@ -2,7 +2,8 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
use
Pleroma
.
DataCase
alias
Pleroma
.
User
alias
Pleroma
.
Web
.
TwitterAPI
.
{
UserView
,
Utils
}
alias
Pleroma
.
Web
.
TwitterAPI
.
UserView
alias
Pleroma
.
Web
.
CommonAPI
.
Utils
alias
Pleroma
.
Builders
.
UserBuilder
import
Pleroma
.
Factory
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment